MySQL一主一从、配置一主多从结构、数据读写分离

这篇具有很好参考价值的文章主要介绍了MySQL一主一从、配置一主多从结构、数据读写分离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

部署mysql主从同步

配置mysql主从

分为主数据库角色(master)、从数据库服务器角色(slave)

网站服务器连接后存储数据的服务器作为主服务器

自动同步主服务器上的数据

192.168.88.53 做master

启用binlog日志文件 指定server_id 重启服务

[root@mysql53 ~]# vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
......
log-bin=mysql53    # 自定义binlog日志文件
server-id=53    # 主从配置 server id 不能一样
[root@mysql53 ~]# systemctl restart mysqld
[root@mysql53 ~]# mysql -e 'show master status'
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql53.000001 |      156 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
[root@mysql53 ~]# ls /var/lib/mysql/mysql53.*
/var/lib/mysql/mysql53.000001  /var/lib/mysql/mysql53.index

用户授权

mysql> create user repluser@"%" identified by "123qqq...A";
mysql> grant replication slave on *.* to repluser@"%";

# 验证登录
[root@mysql54 ~]# mysql -h192.168.88.53 -urepluser -p123qqq...A
......
mysql> 

查看正在使用的binlog日志文件

mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql53.000001 |      667 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

192.168.88.54 做slave

指定server_id 并重启数据库服务

[root@mysql54 ~]# vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
......
server-id=54
[root@mysql54 ~]# systemctl restart mysqld

# 用一个已安装mysql的虚拟机克隆出来的主从机器,在从机器上执行此操作
[root@mysql54 ~]# rm -rf /var/lib/mysql/auto.cnf 
[root@mysql54 ~]# systemctl restart mysqld

指定主服务器信息

mysql> change master to master_host="192.168.88.53",master_user="repluser",master_password="123qqq...A",master_log_file="mysql53.000001",master_log_pos=667;
mysql> show slave status \G
......
Slave_IO_Running: No
Slave_SQL_Running: No
......

启动slave进程

mysql> start slave;

查看状态信息

mysql> show slave status \G

mysql> show slave status \G
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......

主从验证

在master上添加数据

# -e 命令行下执行数据库命令
[root@mysql53 ~]# mysql -e 'create database bbsdb'
[root@mysql53 ~]# mysql -e 'create table bbsdb.a(id int)'
[root@mysql53 ~]# mysql -e 'insert into bbsdb.a values(110)'

在slave上查看验证

[root@mysql54 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| bbsdb              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@mysql54 ~]# mysql -e 'desc bbsdb.a'
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
[root@mysql54 ~]# mysql -e 'select * from bbsdb.a'
+------+
| id   |
+------+
|  110 |
+------+

主从同步的工作原理

Master:启用binlog日志,记录所有的数据库更新和修改操作

Slave:

Slave_IO:复制master主机 binlog日志文件里的SQL命令到本机的relay-log(中继日志文件)文件里

Slave_SQL:执行本机relay-log文件里的SQL语句,实现与Master数据一致

排错方法

Last_IO_Error:        IO线程报错信息

报错的原因:通常是 change master to 的配置项不正确

解决办法:重新指定主服务器信息

stop slave;

change master to 服务器ip 用户 密码 日志文件名 偏移量;

start slave;

Last_SQL_Error:        SQL线程报错信息

通常是执行relay-log文件里的sql命令时失败导致的

配置 一主多从 结构

给已有的master服务器53添加第二台slave角色的服务器55

指定server_id 并重启mysql服务

[root@mysql55 ~]# vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
......
server-id=55
[root@mysql55 ~]# systemctl restart mysqld

要手动同步主服务器比自己多的

在master服务器执行完全备份 把备份文件拷贝给slave主机

mysql> show master status;    # 查看binlog日志文件 偏移量
mysql> show databases;        # 查看比slave多的库
[root@mysql53 ~]# mysqldump -B bbsdb > /root/bbsdb.sql    # 完全备份
[root@mysql53 ~]# scp /root/bbsdb.sql root@192.168.88.55:/root

在slave服务器执行 备份文件 恢复数据

[root@mysql55 ~]# mysql < /root/bbsdb.sql 
[root@mysql55 ~]# mysql
mysql> show databases;

指定主服务器信息

change master to 服务器的ip 用户 密码 日志文件名 偏移量

mysql> change master to master_host="192.168.88.53",master_user="repluser",master_password="123qqq...A",master_log_file="mysql53.000002",master_log_pos=156;
mysql> show slave status \G
......
Slave_IO_Running: No
Slave_SQL_Running: No
......

注意:日志名和偏移量 要写 在mysql53主机执行完全备份之前查看到的日志名和偏移量

启动slave

mysql> start slave;

查看状态信息

mysql> show slave status \G
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......

主从验证

在master上添加数据

mysql> insert into bbsdb.a values(114),(119),(122);
mysql> select * from bbsdb.a;
+------+
| id   |
+------+
|  110 |
|  114 |
|  119 |
|  122 |
+------+
4 rows in set (0.00 sec)

在slave上查看验证

# 55
mysql> select * from bbsdb.a;
+------+
| id   |
+------+
|  110 |
|  114 |
|  119 |
|  122 |
+------+
4 rows in set (0.00 sec)


# 54
mysql> select * from bbsdb.a;
+------+
| id   |
+------+
|  110 |
|  114 |
|  119 |
|  122 |
+------+
4 rows in set (0.00 sec)

部署mysql数据读写分离结构

56        master数据库服务器

57        slave数据库服务器

58        读写分离服务器

相关理论

把客户端访问数据库服务的查询访问select、写访问insert 分别给不同的数据库服务器处理

功能:减轻单台数据库服务器的并发访问压力

如何实现数据的读写分离

人肉分离        select-------->57

                       insert-------->56

搭建读写分离服务实现

能够实现数据读写分离服务的软件(中间件)有哪些

mysql-proxy mycat和mycat2

环境准备

配置mysql主从结构

56        master数据库服务器

57        slave数据库服务器

配置器mycat服务器

58

准备软件

安装软件

# 安装jdk
[root@myscat58 ~]# yum -y install java-1.8.0-openjdk.x86_64
[root@myscat58 ~]# java -version
# 安装解压命令
[root@myscat58 ~]# which unzip || yum -y install unzip
# 安装mycat
[root@myscat58 ~]# unzip mycat2-install-template-1.21.zip 
[root@myscat58 ~]# mv mycat /usr/local/
# 安装依赖
[root@myscat58 ~]# cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/
# 修改权限
[root@myscat58 ~]# chmod -R 777 /usr/local/mycat/

修改配置

设置客户端连接mycat服务时使用的用户名和密码

[root@myscat58 ~]# vim /usr/local/mycat/conf/users/root.user.json
{^M
        "dialect":"mysql",^M
        "ip":null,^M
        "password":"654321",^M
        "transactionType":"proxy",^M
        "username":"mycat"^M
}

设置mycat服务启动时连接的数据库服务器

[root@myscat58 ~]# vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json 
{^M
        "dbType":"mysql",^M
        "idleTimeout":60000,^M
        "initSqls":[],^M
        "initSqlsGetConnection":true,^M
        "instanceType":"READ_WRITE",^M
        "maxCon":1000,^M
        "maxConnectTimeout":3000,^M
        "maxRetryCount":5,^M
        "minCon":1,^M
        "name":"prototypeDs",^M
        "password":"123456",^M
        "type":"JDBC",^M
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",^M
        "user":"hmy",^M
        "weight":0^M
}

根据配置在本机运行mysql服务并创建hmy用户

[root@myscat58 ~]# yum -y install mysql-server mysql
[root@myscat58 ~]# systemctl start mysqld
[root@myscat58 ~]# mysql
mysql> create user hmy@"localhost" identified by '123456';
mysql> grant all on *.* to hmy@"localhost";
[root@myscat58 ~]# mysql -hlocalhost -uhmy -p123456

启动mycat服务

[root@myscat58 ~]# ls /usr/local/mycat/logs/
[root@myscat58 ~]# /usr/local/mycat/bin/mycat start
Starting mycat2...
[root@myscat58 ~]# ls /usr/local/mycat/logs/
mycat.pid  wrapper.log
[root@myscat58 ~]# ss -ntulp | grep 8066
tcp   LISTEN 0      128                     *:8066             *:*    users:(("java",pid=22649,fd=71))  
[root@myscat58 ~]#

连接mycat服务

[root@myscat58 ~]# mysql -h127.0.0.1 -P8066 -umycat -p654321
mysql> show databases;
+--------------------+
| `Database`         |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.16 sec)

连接mycat服务配置读写分离

MySQL主从结构 + MyCat2

主从结构 + mycat 软件实现 数据的读写分离

添加数据源(定义数据库服务器的ip地址)

# 连接mycat服务
[root@myscat58 ~]# mysql -h127.0.0.1 -P8066 -umycat -p654321
# 添加mysql56数据库服务器
mysql> /*+ mycat:createdatasource{
    -> "name":"whost56", "url":"jdbc:mysql://192.168.88.56:3306","user":"hmy","password":"123456"}*/;
Query OK, 0 rows affected (0.30 sec)
# 添加mysql57数据库服务器
mysql> /*+ mycat:createdatasource{
    -> "name":"whost57", "url":"jdbc:mysql://192.168.88.57:3306","user":"hmy","password":"123456"}*/;
Query OK, 0 rows affected (0.07 sec)
# 查看数据源
/*+mycat:showDataSources{}*/ \G
# 添加的数据源以文件的形式保存在安装目录下
[root@myscat58 ~]# ls /usr/local/mycat/conf/datasources/
prototypeDs.datasource.json  whost56.datasource.json  whost57.datasource.json

在数据库服务器上添加hmy用户

[root@mysql56 ~]# mysql
mysql> create user hmy@"%" identified by '123456';
mysql> grant all on *.* to hmy@"%";

# 测试
[root@myscat58 ~]# mysql -h192.168.88.56 -uhmy -p123456
mysql>

[root@myscat58 ~]# mysql -h192.168.88.57 -uhmy -p123456
mysql>

创建集群 把56和57组成工作组

[root@myscat58 ~]#mysql -h127.0.0.1 -P8066 -umycat -p654321
# 创建集群
mysql> /*!mycat:createcluster{ "name":"rwcluster", "masters":["whost56"], "replicas":["whost57"] }*/;
# 查看集群信息
mysql> /*+ mycat:showClusters{}*/ \G*************************** 1. row ***************************
             NAME: rwcluster
      SWITCH_TYPE: SWITCH
MAX_REQUEST_COUNT: 2000
             TYPE: BALANCE_ALL
         WRITE_DS: whost56
          READ_DS: whost56,whost57
          WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
           READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
        AVAILABLE: true
*************************** 2. row ***************************
             NAME: prototype
      SWITCH_TYPE: SWITCH
MAX_REQUEST_COUNT: 200
             TYPE: BALANCE_ALL
         WRITE_DS: prototypeDs
          READ_DS: prototypeDs
          WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
           READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
        AVAILABLE: true
2 rows in set (0.00 sec)

# 创建的集群以文件的形式保存在目录下
[root@myscat58 ~]# ls /usr/local/mycat/conf/clusters/
prototype.cluster.json  rwcluster.cluster.json

指定数据库服务器的角色

master角色机器负责写

slave角色机器负责访问

# 修改master角色主机仅负责写访问
[root@myscat58 ~]# vim /usr/local/mycat/conf/datasources/whost56.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"WRITE",    # 仅负责写访问
        "logAbandoned":true,
        "maxCon":1000,
        "maxConnectTimeout":30000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"whost56",
        "password":"123456",
        "queryTimeout":0,
        "removeAbandoned":false,
        "removeAbandonedTimeoutSecond":180,
        "type":"JDBC",
        "url":"jdbc:mysql://192.168.88.56:3306?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
        "user":"hmy",
        "weight":0
}
# 修改slave角色主机仅负责读访问
[root@myscat58 ~]# vim /usr/local/mycat/conf/datasources/whost57.datasource.json 
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ",    # 仅负责读访问
        "logAbandoned":true,
        "maxCon":1000,
        "maxConnectTimeout":30000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"whost57",
        "password":"123456",
        "queryTimeout":0,
        "removeAbandoned":false,
        "removeAbandonedTimeoutSecond":180,
        "type":"JDBC",
        "url":"jdbc:mysql://192.168.88.57:3306?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
        "user":"hmy",
        "weight":0
}

定义集群出来读访问的策略

集群处理查询访问的方式

[root@myscat58 ~]# vim /usr/local/mycat/conf/clusters/rwcluster.cluster.json 
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "whost56"
        ],
        "maxCon":2000,
        "name":"rwcluster",
        "readBalanceType":"BALANCE_ALL_READ",
        "replicas":[
                "whost57"
        ],
        "switchType":"SWITCH"
}

创建网站存储数据使用的库 并定义 库存储数据使用rwcluster

[root@myscat58 ~]# mysql -h127.0.0.1 -P8066 -umycat -p654321
mysql> create database testdb;
# 指定testdb库存储数据使用的集群
[root@myscat58 ~]# vim /usr/local/mycat/conf/schemas/testdb.schema.json 
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"testdb",
        "targetName":"rwcluster",    # 添加此行,之前创建的集群名rwcluster
        "shardingTables":{},
        "views":{}
}
[root@myscat58 ~]# /usr/local/mycat/bin/mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...
[root@myscat58 ~]# ss -ntulp | grep 8066
tcp   LISTEN 0      128                     *:8066             *:*    users:(("java",pid=23325,fd=72))  
[root@myscat58 ~]# 

测试配置文章来源地址https://www.toymoban.com/news/detail-804161.html

# 连接mycat服务建表插入记录
[root@client ~]# mysql -h192.168.88.58 -P8066 -umycat -p654321
mysql> create table user(name char(10),passwd char(6));
mysql> insert into user values("A","123");
mysql> select * from user;
+------+--------+
| name | passwd |
+------+--------+
| A    | 123    |
+------+--------+
1 row in set (0.01 sec)

[root@mysql56 ~]# mysql -e 'select * from testdb.user'
+------+--------+
| name | passwd |
+------+--------+
| A    | 123    |
+------+--------+

[root@mysql57 ~]# mysql -e 'select * from testdb.user'
+------+--------+
| name | passwd |
+------+--------+
| A    | 123    |
+------+--------+

# 测试读写分离
# 在从服务器本机插入记录,数据仅在从服务器有,主服务器没有
[root@client ~]# mysql -h192.168.88.58 -P8066 -umycat -p654321 -e 'insert into testdb.user values("B","678")'
[root@mysql57 ~]# mysql -e 'insert into testdb.user values("mysql57","57")'
[root@client ~]# mysql -h192.168.88.58 -P8066 -umycat -p654321 -e 'select * from testdb.user'
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------+--------+
| name    | passwd |
+---------+--------+
| A       | 123    |
| B       | 678    |
| mysql57 | 57     |
+---------+--------+
# 主服务器数据不变,日志偏移量不不变
[root@mysql56 ~]# mysql -e 'select * from testdb.user'
+------+--------+
| name | passwd |
+------+--------+
| A    | 123    |
| B    | 678    |
+------+--------+
[root@mysql56 ~]# mysql -e 'show master status'
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql56.000001 |     2538 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+

# 客户端连接mycat服务读/写数据
[root@client ~]# mysql -h192.168.88.58 -P8066 -umycat -p654321 -e 'insert into testdb.user values("bbb","222")'
# 在主服务器查看数据和日志偏移量
[root@mysql56 ~]# mysql -e 'show master status'
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql56.000001 |     2828 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+

到了这里,关于MySQL一主一从、配置一主多从结构、数据读写分离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker 搭建mysql集群一主一从,两台机器

    一、准备两条机器,分别为IP1和IP2,其中IP1为主,IP2为从 二、在两台机器上分别拉取mysql镜像 三、在home目录下新建目录,分别为/home/mysql/data,/home/mysql/conf 1、在IP1主机下的/home/mysql/conf目录下新建my.cnf文件,内容为 2、在IP2从机的/home/mysql/conf目录下新建my.cnf文件,内容为 四、在

    2024年01月24日
    浏览(40)
  • Docker搭建MySQL8.0主从复制(一主一从)

    宿主机使用的版本为 19045 的win10专业版,MySQL使用的是8.0+,Docker容器使用Linux。 略 修改Docker默认安装路径 安装包自己就提供了修改安装路径的功能,CMD中运行: “Docker Desktop Installer.exe” install --installation-dir= --installation-dir=path : changes the default installation location ( C:Program Fil

    2024年01月25日
    浏览(32)
  • Ansible Playbook快速部署一主多从MySQL集群

    部署目标: 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构: 主机清单: 定义了需要部署mysql的主机组、IP及设定mysql主机角色 声明变量: 声明变量的好处在于用户可以按需改这一个文件,而不需要挨个儿修改部

    2024年02月13日
    浏览(23)
  • k8s实战案例之基于StatefulSet控制器运行MySQL一主多从

    Pod调度运⾏时,如果应⽤不需要任何稳定的标示、有序的部署、删除和扩展,则应该使⽤⼀组⽆状态副本的控制器来部署应⽤,例如 Deployment 或 ReplicaSet更适合⽆状态服务需求,⽽StatefulSet适合管理所有有状态的服务,⽐如MySQL、MongoDB集群等。 StatefulSet本质上是Deployment的⼀种

    2024年02月09日
    浏览(31)
  • 关于SPI通信一主多从的通信异常的解决

    运用场景: 当一个主机分别对多个从机通信(1对8),正常情况下全部接入从机通信没有问题,但当不接第四个SPI模块时,发现整个通讯异常,导致整个SPI数据错误,但是,接入1,2,3,5设备通信又能正常,接入1,2,3也能正常。 1.检测PCB走线,从机都为模块化设计,没有发

    2024年02月12日
    浏览(30)
  • TTL电平串口通信连接多个从机,二极管即可改造UART串口为一主多从总线 一对多通讯

    在重新翻阅了许多遍串口相关的书籍资料以后,(其实是看了485、232,modbus协议以后还是觉得再尝试尝试…) 改用以上连线后,通过串口助手发送数据测试… ** ** 虽然电路很简单,查阅了许多资料都建议使用RS485/232或者是改用SPI,CAN的通信,但是还是发个博记录一下吧。 关于连

    2024年02月11日
    浏览(28)
  • STM32F103单片机通过SPI全双工通信协议与W25Q64(FLASH)进行通信【串行同步通信(数据线与时钟线配合),(一主多从模式)】附相关驱动代码详解

    1.W25Qxx系列是一种低成本、小型化、使用简单的 非易失性存储器 ,常应用于数据存储、字库存储、固件程序存储等场景 2.存储介质: Nor Flash(闪存) 3.时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 4.存储容量(24位地址): W25Q40: 4Mbit / 512KByte W25Q80: 8Mbit / 1MByte W25Q16: 16

    2024年04月13日
    浏览(49)
  • MySQL8主从复制之一主一从实战

    实战环境,Windows Server 2008R2+MySQL8.0.27 操作系统 MySQL版本 主/从库 IP 同步用户 同步用户密码 Windows Server 2008R2+ mysql-8.0.27-winx64.zip master 192.168.3.246 synchadmin synchadmin Windows Server 2008R2+ mysql-8.0.27-winx64.zip slave 192.168.3.247 – – 截至到2021-11-29最新版本为 Mysql-8.0.27 官网下载:https://dev.

    2024年01月19日
    浏览(35)
  • docker搭建mysql多主多从(集群),亲测有效!

    提示 :如果你只是想要搭建mysql主从看这篇文档就够了,很多地方参考了这篇文章:点击这里 原理图 : 主1(docker容器名为mysql-master) 主2(docker容器名为mysql-master_2) 从1(docker容器名为mysql-slave) 从2(docker容器名为mysql-slave-2) 四个容器都起动成功 解释 注意 :配置文件路径为do

    2024年02月04日
    浏览(29)
  • 【数据库集群】之一主一从

    集群架构设计的三个维度:可用性、扩展性、一致性 所谓mysql集群就是把多台数据库集成在一起提供数据库服务。 集群的目的: 负载均衡:解决高并发 高可用HA:服务可用性 远程备灾:数据有效性 对于数据库之上的业务层来说,基于 MySQL 的主从复制集群,单点写入 Master

    2024年02月01日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包