MySQL(六)

集群

单节点数据库

优点:适合数据量小的网站,如企业网站。

缺点:单个数据库无法满足日益增长的读写请求;

为什么要使用集群

高可用性:站点高可用,冗余站点;服务高可用,冗余服务;数据高可用,冗余数据。

负载均衡:切换某服务访问某节点,分摊单个节点的数据库压力

可伸缩性:新增数据库节点便利,方便扩容。

MySQL集群缺点

  • 网络分裂:群集还可能由于网络故障而拆分为多个部分,每部分内的节点相互连接,但各部分之间的节点失去连接。
  • 脑裂:导致数据库节点彼此独立运行的集群故障称为“脑裂”。这种情况可能导致数据不一致,并且无法修复,例如当两个数据库节点独立更新同一表上的同一行时

MySQL集群中各实例的数据同步,均基于mysql的复制机制。

主从复制

一、读写分离

二、复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制。

三、二进制日志推荐使用ROW格式

原理

 

第一步:主库开启bin-log日志: ** 主库需要设置开启记录二进制日志,提交数据更新的事务之前将更新的事件记录都二进制日志中,后才进行事务提交。

第二步:备库建立IO线程连接: ** 备库创建IO线程与主库创建连接,主库上会启动一个binlog-dump线程,把binlog内容发送至从库,从库IO线程会将事件写入到中继日志(relay-log)中。如果从库数据与主库已经保持一致后,该线程进入休眠状态,一旦主库有新事件会以信号量唤醒binlog-dump线程。

第三步:SQL线程重放数据:**SQL线程执行最后一步,从中继日志中获取事件并在备库中执行,从而实现数据库的更新。

相关线程

主节点

dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送二进制日志事件

从节点

I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放

相关文件

master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等

relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关

mysql-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志

MySQL8.0取消 master.info 和 relay-log.info文件

类型

一主一从

一主多从

级联复制,从服务器还能有从服务器

双主(慎用)

环状复制(慎用)

一从多主(禁用)

主从配置基本流程

主节点
1、启用二进制日志
[mysqld]
log_bin=/data/logbin/mysql-bin

2、为当前节点设置一个全局惟一的ID号
[mysqld]
server-id=
log-basename=master    可选项,设置datadir中日志名称,确保不依赖主机名

3、查看从二进制日志的文件和位置开始进行复制
SHOW MASTER STATUS;

4、创建有复制权限的用户账号
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';

-------------------------------------------------------------------------------------------

从节点
1、启用中继日志
[mysqld]
server_id=    为当前节点设置一个全局惟的ID号
log-bin
read_only=ON    设置数据库只读,针对supper user无效
relay_log=relay-log    relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index    默认值hostname-relay-bin.index

2、使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysql> CHANGE MASTER TO MASTER_HOST='masterhost', 
MASTER_USER='repluser', 
MASTER_PASSWORD='replpass', 
MASTER_LOG_FILE='mariadb-bin.xxxxxx', 
MASTER_LOG_POS=#
MASTER_DELAY = interval;    此项可选,可指定延迟复制实现访问误操作,单位秒

mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;

查看 relaylog 事件
SHOW RELAYLOG EVENTS in 'relay-bin.00000x';

主从复制相关设置

限制从服务器为只读

read_only=on:此限制对拥有super权限的用户无效

在从节点清除信息

执行下列命令需要先 stop slave

一、RESET SLAVE 用于重置从服务器的状态信息,但保留复制用户账户信息。

  1. 清除二进制日志文件位置信息:从服务器将不再知道主服务器上的当前复制位置。
  2. 清除中继日志信息:删除从服务器上的所有中继日志文件,并重置中继日志位置信息。
  3. 清除错误信息:清除从服务器上可能存在的复制错误信息。
  4. 保留复制用户信息:复制所需的用户账户和权限信息保持不变。

场景:

        当你需要重置复制状态,但保留现有的复制配置。

        当你只需要清除当前的复制错误或重新同步从服务器的位置信息。

二、RESET SLAVE ALL 除了重置从服务器的状态信息外,还删除所有复制相关的配置信息和用户账户信息,并停止复制线程。

  1. 停止从服务器上的复制线程:确保在重置之前没有正在进行的复制活动。
  2. 清除所有复制相关的配置:删除与复制相关的所有配置信息,包括复制用户账户信息。
  3. 删除所有临时表:删除从服务器上与复制相关的所有临时表。

场景:

        当你需要完全清除所有的复制相关配置,包括复制用户账户。

        当你需要从头开始配置一个新的从服务器,而不保留任何现有的复制信息。

复制错误解决办法

通过 show slave status\G; 查看从库状态时可能会发现有错误,如

解决:

可以在从库配置忽略一些主服务器的复制事件。

1、设置全局系统变量,指定跳过复制事件的个数。

stop slave;

set global sql_slave_skip_counter = N;

start slave;

2、设置服务器选项,指定跳过事件的ID,如上图的 Error_code:1062

[mysqld]
slave_skip_errors=错误代码 或 all

systemctl restart mariadb

从库通过start slave单独指定

执行特定线程

START SLAVE IO_THREAD或SQL_THREAD

执行SQL_THREAD到指定点

START SLAVE [SQL_THREAD] UNTIL  MASTER_LOG_FILE = 'log_name',MASTER_LOG_POS =log_pos

START SLAVE [SQL_THREAD] UNTIL  RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS =
log_pos

保证主从复制的事务安全

在主节点配置

每次写入后立即同步二进制日志到磁盘,性能差
sync_binlog=1

如果是InnoDB引擎
innodb_flush_log_at_trx_commit=1     每次事务提交立即同步日志写磁盘
sync_master_info=n     n次事件后master.info同步到磁盘

在从节点配置

skip-slave-start=ON    不自动启动slave
sync_relay_log=n    n次写后同步relay log到磁盘
sync_relay_log_info=n    n次事务后同步relay-log.info到磁盘

级联复制

关键:中间slave节点能将master的二进制日志在本机进行数据库更新,且同时更新本机二进制日志,从而实现级联复制

在中间slave配置

log_slave_updates:允许读取中继日志,并将发生的数据记录到本机二进制日志中

[mysqld]
server-id=18
log_bin
log_slave_updates    级联复制中间节点的必选项,MySQL8.0此为默认值,可以不要人为添加,其它                   版本默认不开启
read-only

双主复制(慎用)

两个节点,都可以更新数据,并且互为主从,但实际上配置按双主方法配,用的时候按 一主一从用,否则会出现冲突错误,如可能出现主键冲突(相同主键),见 show slave status;

容易产生数据不一致的问题。

考虑要点:自动增长id

配置一个节点使用奇数id

auto_increment_offset=1        开始点
auto_increment_increment=2        增长幅度

另一个节点使用偶数id

auto_increment_offset=2
auto_increment_increment=2

配置步骤

1、各节点使用一个唯一的server_id

2、都启动二进制日志和中继日志

3、创建拥有复制权限的用户账号

4、定义自动增长id字段的数值范围,且各位奇数、偶数

5、均把对方指定为主节点,并启动复制线程

半同步复制(标配)

全同步复制 Full Synchronous Replication

主服务器在事务提交后,会等待所有从服务器都接收并记录了该事务的二进制日志事件。

只有所有从服务器都确认接收并记录了数据,主服务器才会返回结果给客户端。

优点

数据一致性高

缺点

性能开销大

异步复制 Asynchronous Replication——MySQL默认方式

主服务器在事务提交后,会立即返回结果给客户端。

主服务器将二进制日志事件异步地发送给从服务器,不会等待从服务器的确认。

从服务器根据主服务器的二进制日志事件,异步地更新自己的数据。

优点

性能较高

缺点

主库突然崩溃时,主库上已经提交的事务可能还未传到从库上,数据丢失,导致数据不一致。

半同步复制 semi-synchronous Replication

主服务器在事务提交后,会等待至少一个从服务器接收并记录了该事务的二进制日志事件。

一旦至少一个从服务器确认接收并记录了数据,主服务器会返回结果给客户端。

优点

提供了比异步复制更好的数据一致性保证,同时减少了同步复制的性能开销

缺点

仍然存在一定的数据丢失风险,因为不是所有的从服务器都需要确认接收数据

补充

当半同步复制发生超时(默认rpl_semi_sync_master_timeout=10s),即在指定时间内没有收到一台从库的确认,会暂时关闭半同步复制,自动切换至异步复制。

当主库的dump线程发送完一个事务的所有事件之后,如果在指定时间内,收到了从库的响应, 则主从又重新恢复为半同步复制。

查看插件文件

[root@wenzi ~]$rpm -ql mysql-server | grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so

相关配置

rpl_semi_sync_master_enabled=on   

设置此行,要先装semisync_master.so插件,否则mysqld启动失败

rpl_semi_sync_master_timeout=3000   

设定3s内无法同步,也将返回成功信息给请求端

相关变量

mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 3000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+

mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

复制过滤器

让从节点仅复制指定的数据库、或指定数据库的表。

实现

从服务器的SQL_Thread在重放relay log中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地。

优点

不影响二进制备份还原

缺点

会造成网络及磁盘IO浪费;在所有从节点都要配置

从服务器上复制过滤器相关变量

replicate_do_db=db_name    指定复制库的白名单,多个库只能分开多行写
replicate_ignore_db=    指定复制库黑名单
replicate_do_table=    指定复制表的白名单
replicate_ignore_table=    指定复制表的黑名单
replicate_wild_do_table= foo%.bar%    支持通配符

GTID复制

GTID(Global Transaction ID 全局事务标识符)

MySQL5.6开始支持,不成熟;推荐使用MySQL5.7以上版本的GTID功能。

使用GTID无需找到binlog文件名和POS点,只需知道主库的IP、端口、账号、密码即可;开启GITD后,执行change master to master_auto_position=1 即可,它会自动寻找相应的位置开始同步。

实现

主库
vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
gtid_mode=ON    开启GTID
enforce_gtid_consistency    保证GTID安全


从库
vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce_gtid_consistency

优点

保证事务全局统一

截取日志更方便,跨多文件,判断起点终点更方便

判断主从工作状态更方便

传输日志,可并发传输。SQL回放更高并发

主从复制更方便

复制的监控和维护

清理日志

RESET SLAVE [ALL];

复制监控

SHOW MASTER STATUS        显示主服务器复制的状态

SHOW BINARY LOGS        列出所有可用的二进制日志文件

SHOW BINLOG EVENTS        显示二进制日志中的事件

SHOW SLAVE STATUS        显示从服务器复制的状态

SHOW PROCESSLIST        显示当前MySQL服务器上运行的所有进程或线程

从库是否落后于主库

通过 show slave status\G;观察 Seconds_Behind_Master 参数,表示从服务器相对于主服务器的延迟时间,以秒s为单位,越小越好,0最好

复制的问题及解决方案

数据损坏、丢失

Master:MHA + semisync replication
Slave: 重新复制

不唯一的server id

重新复制

复制延迟

升级到MySQL5.7以上版本(5.7之前的版本,没有开GTID之前,主库可以并发事务,但是dump传
输时是串行)利用GTID(MySQL5.6需要手动开启,MySQL5.7以上默认开启)支持并发传输binlog及并
行多个SQL线程。

减少大事务,将大事务拆分成小事务。大事务执行时间长,小事务执行时间短。

减少锁。

调整sync_binlog参数:这个参数控制何时将事务日志刷新到磁盘。适当增加此值可以减少磁盘I/O操作,但可能会牺牲数据的持久性。

调整innodb_flush_log_at_trx_commit参数:此参数决定每次事务提交时是否需要将日志刷新到磁盘。设置为2可以提高性能,但牺牲了一些数据安全性。

监控和预警,使用监控工具来跟踪复制延迟,并设置预警阈值;当延迟超过特定时间时,可以及时收到通知并采取措施

开启半同步复制。

一从多主:Mariadb10 版后支持。

多线程复制:对多个数据库复制。

主从数据不一致

判断主从数据是否一致

checksum表

  • MySQL 自带的 checksum 表功能可以用来校验表的一致性。在主服务器上,你可以使用 Checksum 表来生成校验和,然后在从服务器上对比这些校验和。
  • 使用命令 CHECKSUM TABLE table_name; 来生成校验和。

mysqldiff

  • mysqldiff 是 MySQL Utilities 套件的一部分,它可以比较两个 MySQL 服务器或数据库的模式和数据。
  • 它可以生成差异报告,包括数据不一致的地方。

Percona Toolkit

  • 使用命令 pt-table-checksum --databases db_name 来生成校验和,然后使用 pt-table-checksum --checksum 来校验。
原因

主库binlog格式为Statement,同步到从库执行后可能造成主从不一致。

主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。

从节点未设置只读,误操作写入数据。

主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致。

主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数
据库上面可能不支持该功能。

主从sql_mode 不一致。

MySQL自身bug导致。

修复
将从库重建

恢复时间慢,有时从库可能担负部分查询操作,不能贸然重建

使用perconna-tookit工具辅助

此工具包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修
复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,多测试。慎用。

手动重建不一致的表

在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且
重做整个库也比较慢,此时可以只重做这几张表来修复主从不一致。

缺点是在执行导入期间需要暂时停止从库复制,可接受。

1、从库停止复制
mysql>stop slave;

2、在主库上备份这三张表,并记录下同步的binlog和POS点
mysqldump -uroot -pmagedu -q --single-transaction --master-data=2 testdb A B C 
/backup/A_B_C.sql

3、查看A_B_C.sql文件,找出记录的binlog和POS点
例如:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;

#以下指令是为了保障其他表的数据不丢失,一直同步直到那个点结束,A,B,C表的数据在之前的备份已
经生成了一份快照,只需要导入进入,然后开启同步即可
4、把A_B_C.sql拷贝到Slave机器上,并做指向新位置
mysql>start slave until MASTERLOGFILE='mysql-bin.888888', 
MASTERLOGPOS=666666;

5、在Slave机器上导入A_B_C.sql
mysql -uroot -pmagedu testdb 
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1;

6、导入完毕后,从库开启同步即可。
mysql>start slave;

避免主从不一致

主库binlog采用ROW格式。

主从实例数据库版本保持一致。

主库做好账号权限把控,不可以执行set sql_log_bin=0。

从库开启只读,不允许人为写入。

定期进行主从一致性检验

实验

一主一从

主库、从库都是新搭建的

CentOS8192.168.28.30主数据库
Rocky8192.168.28.40从数据库
CentOS8主库    yum安装mariadb10.3.28
修改配置文件
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin=/data/mysqllog/binlog

创建二进制日志存储目录,并授权,重启mariadb
[root@wenzi ~]$mkdir -p /data/mysqllog
[root@wenzi ~]$chown -R mysql:mysql /data/mysqllog/
[root@wenzi ~]$systemctl restart mariadb

查看当前二进制日志POS位置
[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       348 |
| binlog.000002 |       325 |
+---------------+-----------+
2 rows in set (0.000 sec)

MariaDB [(none)]> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000002 |      325 |              |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.000 sec)

创建复制用户并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)

-------------------------------------------------------------------------------------------

从节点    yum安装mariadb10.3.28
修改配置文件,重启服务
[root@wenzi ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
read-only=on
[root@wenzi ~]#systemctl restart mariadb

登录mysql,进行同步配置
[root@wenzi ~]#mysql
MariaDB [(none)]> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='binlog.000002',master_log_pos=325;
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.30
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: binlog.000002
           Read_Master_Log_Pos: 656
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 883
         Relay_Master_Log_File: binlog.000002
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 656
               Relay_Log_Space: 1194
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 2
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [(none)]> show processlist;
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
| Id | User        | Host      | db   | Command   | Time | State                                                                       | Info             | Progress |
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
|  1 | system user |           | NULL | Daemon    | NULL | InnoDB purge worker                                                         | NULL             |    0.000 |
|  2 | system user |           | NULL | Daemon    | NULL | InnoDB purge worker                                                         | NULL             |    0.000 |
|  3 | system user |           | NULL | Daemon    | NULL | InnoDB purge worker                                                         | NULL             |    0.000 |
|  4 | system user |           | NULL | Daemon    | NULL | InnoDB purge coordinator                                                    | NULL             |    0.000 |
|  5 | system user |           | NULL | Daemon    | NULL | InnoDB shutdown handler                                                     | NULL             |    0.000 |
|  8 | root        | localhost | NULL | Query     |    0 | Init                                                                        | show processlist |    0.000 |
|  9 | system user |           | NULL | Slave_IO  |   86 | Waiting for master to send event                                            | NULL             |    0.000 |
| 10 | system user |           | NULL | Slave_SQL |   86 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |    0.000 |
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
8 rows in set (0.000 sec)

此时在主库修改数据,查看从库能否同步
主库
[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> create database cs;

从库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| cs                 |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.002 sec)

主库已有数据,非新建,此时新增从节点

继上面实验基础

CentOS8192.168.28.30主数据库
Rocky8192.168.28.40从数据库
Rocky8192.168.28.41从数据库

 主库新增数据

[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> use cs;
Database changed    
MariaDB [cs]> create table student(id int not null auto_increment primary key,name varchar(10) not null);
MariaDB [cs]> insert into student(name) values('liubei');
MariaDB [cs]> insert into student(name) values('guanyu');
MariaDB [cs]> insert into student(name) values('zhangfei');
MariaDB [cs]> insert into student(name) values('zhaoyun');
MariaDB [cs]> insert into student(name) values('huangzhong');
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
+----+------------+

新增从库192.168.28.41

主库
完全备份主库数据,将数据传输至新从库
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -E -R -F --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob > full.sql
[root@wenzi ~]$rsync -a full.sql root@192.168.28.41:/root/

-------------------------------------------------------------------------------------------

从库
修改配置文件

从节点    yum安装mariadb10.3.28
修改配置文件,重启服务
[root@wenzi ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
read-only=on
[root@wenzi ~]#systemctl restart mariadb

修改full.sql中 change master 部分,添加主库信息
[root@wenzi ~]#vim full.sql
...
CHANGE MASTER TO
master_host='192.168.28.30',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=379;
...

恢复数据,导入后要使用主库的用户密码
[root@wenzi ~]#mysql < full.sql
[root@wenzi ~]#mysql -uroot -pAdmin.
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
+----+------------+
5 rows in set (0.001 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State:
                   Master_Host: 192.168.28.30
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: binlog.000003
           Read_Master_Log_Pos: 379
                Relay_Log_File: mariadb-relay-bin.000001
                 Relay_Log_Pos: 4
         Relay_Master_Log_File: binlog.000003
              Slave_IO_Running: No
             Slave_SQL_Running: No
...

启动同步
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.30
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: binlog.000003
           Read_Master_Log_Pos: 379
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 552
         Relay_Master_Log_File: binlog.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 379
               Relay_Log_Space: 863
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

测试同步
主库
MariaDB [cs]> insert into student(name) values ('caocao');
可以看到有两个dump线程
MariaDB [(none)]> show processlist;
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
| Id | User        | Host                | db   | Command     | Time | State                                                                 | Info             | Progress |
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
|  1 | system user |                     | NULL | Daemon      | NULL | InnoDB purge worker                                                   | NULL             |    0.000 |
|  2 | system user |                     | NULL | Daemon      | NULL | InnoDB purge coordinator                                              | NULL             |    0.000 |
|  3 | system user |                     | NULL | Daemon      | NULL | InnoDB purge worker                                                   | NULL             |    0.000 |
|  4 | system user |                     | NULL | Daemon      | NULL | InnoDB purge worker                                                   | NULL             |    0.000 |
|  5 | system user |                     | NULL | Daemon      | NULL | InnoDB shutdown handler                                               | NULL             |    0.000 |
| 10 | rep         | 192.168.28.40:59908 | NULL | Binlog Dump | 5635 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |    0.000 |
| 16 | rep         | 192.168.28.41:49292 | NULL | Binlog Dump | 2717 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |    0.000 |
| 18 | root        | localhost           | NULL | Query       |    0 | Init                                                                  | show processlist |    0.000 |
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+


第一个从库
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
|  6 | caocao     |
+----+------------+

新从库
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
|  6 | caocao     |
+----+------------+

级联复制

CentOS8192.168.28.30主数据库
CentOS8192.168.28.31级联slave
CentOS8192.168.28.32从数据库

主库

CentOS8主库    yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin=/data/mysqlog/binlog

创建二进制日志存储目录,并授权,重启mariadb
[root@wenzi ~]$mkdir -p /data/mysqlog
[root@wenzi ~]$chown -R mysql:mysql /data/mysqlog/
[root@wenzi ~]$systemctl restart mariadb

创建复制用户并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';

查看当前二进制日志POS位置
[root@wenzi ~]$mysql -uroot -pAdmin. -e 'show master status;';
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000003 |      379 |              |                  |
+---------------+----------+--------------+------------------+

进行完全备份
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -E -R -F --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob > full.sql

将备份传输至级联slave
[root@wenzi ~]$rsync full.sql root@192.168.28.31:/root/

中间级联slave

yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
log-bin=/data/mysqlog/logbin
read-only
log_slave_updates

创建二进制目录,启动服务
[root@wenzi ~]$mkdir -p /data/mysqlog/
[root@wenzi ~]$chown -R mysql:mysql /data
[root@wenzi ~]$systemctl enable --now mariadb

修改收到的完全备份文见中的change master to,替代命令行中执行的步骤
[root@wenzi ~]$vim full.sql
CHANGE MASTER TO
master_host='192.168.28.30',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=379;

...

将full.sql导入数据库,恢复完全备份,记录此时二进制日志POS
[root@wenzi ~]$mysql
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> source full.sql;
MariaDB [(none)]> set sql_log_bin=1;
MariaDB [mysql]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
+----+------------+
MariaDB [mysql]> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| logbin.000002 |      339 |              |                  |
+---------------+----------+--------------+------------------+
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.30
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: binlog.000003
           Read_Master_Log_Pos: 379
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 552
         Relay_Master_Log_File: binlog.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 379
               Relay_Log_Space: 863
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

对级联slave进行完全备份
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -F -E -R --triggers --single-transaction --flush-privileges --default-character-set=utf8 --master-data=1 --hex-blob > fullbak2.sql

将备份传输至slave 192.168.28.32
[root@wenzi ~]$rsync -a fullbak2.sql root@192.168.28.32:/root/

从库

yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=21
read-only

启动服务
[root@wenzi ~]$systemctl enable --now mariadb

修改fullbak2.sql,其中host指定级联slave地址
[root@wenzi ~]$vim fullbak2.sql
...
CHANGE MASTER TO
master_host='192.168.28.31',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='logbin.000004', MASTER_LOG_POS=379;
...

导入数据库
[root@wenzi ~]$mysql
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> source fullbak2.sql
MariaDB [(none)]> set sql_log_bin=1;
MariaDB [mysql]> start slave;
MariaDB [mysql]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.31
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: logbin.000004
           Read_Master_Log_Pos: 379
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 552
         Relay_Master_Log_File: logbin.000004
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 379
               Relay_Log_Space: 863
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 11
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0

验证

主库增加数据
MariaDB [cs]> insert into student(name) values ('qqq');

级联slave查看
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
|  6 | qqq        |

从slave查看
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name       |
+----+------------+
|  1 | liubei     |
|  2 | guanyu     |
|  3 | zhangfei   |
|  4 | zhaoyun    |
|  5 | huangzhong |
|  6 | qqq       

主主复制

一、准备

192.168.28.30

yum安装mariadb-server 10.3.28
修改配置文件,添加以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin
auto-increment-offset=1
auto-increment-increment=2

启动服务
[root@wenzi ~]$systemctl enable --now mariadb

创建复制用户,并授权
MariaDB [(none)]>  create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)

查看此时二进制日志pos
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 |      685 |              |                  |
+--------------------+----------+--------------+------------------+

192.168.28.31

yum安装mariadb-server 10.3.28
修改配置文件,添加以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=2
log-bin
auto-increment-offset=2
auto-increment-increment=2

启动服务
[root@wenzi ~]$systemctl enable --now mariadb

创建复制用户,并授权
MariaDB [(none)]>  create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)

查看此时二进制日志pos
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 |      685 |              |                  |
+--------------------+----------+--------------+------------------+

二、互相指定对方为主

192.168.28.30

MariaDB [(none)]> change master to master_host='192.168.28.31',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='mariadb-bin.000002',master_log_pos=685;
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.31
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000003
           Read_Master_Log_Pos: 344
                Relay_Log_File: mariadb-relay-bin.000003
                 Relay_Log_Pos: 645
         Relay_Master_Log_File: mariadb-bin.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 344
               Relay_Log_Space: 1005
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 2
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

192.168.28.31

MariaDB [(none)]> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='mariadb-bin.000002',master_log_pos=685;
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.28.30
                   Master_User: rep
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000002
           Read_Master_Log_Pos: 685
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 557
         Relay_Master_Log_File: mariadb-bin.000002
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 685
               Relay_Log_Space: 868
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

经测试新增数据库数据,已实现互相同步

半同步复制

master 和 两个 slave 都是 CentOS8 + mysql8.0.26 + yum安装

master

修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin

启动服务,安装插件
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
#临时开启半同步
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------+---------+
| Name                            | Status   | Type               | Library            | License |
+---------------------------------+----------+--------------------+--------------------+---------+
...
| rpl_semi_sync_master            | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
+---------------------------------+----------+--------------------+--------------------+---------+
mysql> create user rep@'192.168.28.%' identified by 'Admin.';
mysql> grant replication slave on *.* to rep@'192.168.28.%';


再次修改配置文件,新增以下内容,再重启服务
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin
rpl_semi_sync_master_enabled=on    设置此行,永久开启半同步,要先装semisync_master.so插件,否则mysqld启动失败
rpl_semi_sync_master_timeout=3000    设定3s内无法同步,也将返回成功信息给请求端
[root@wenzi ~]$systemctl restart mysqld
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 3000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| wenzi-bin.000003 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

slave

修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only

启动服务,安装插件
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#临时开启半同步
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show plugins;
+---------------------------------+----------+--------------------+-------------------+---------+
| Name                            | Status   | Type               | Library           | License |
+---------------------------------+----------+--------------------+-------------------+---------+
...
| rpl_semi_sync_slave             | ACTIVE   | REPLICATION        | semisync_slave.so | GPL     |
+---------------------------------+----------+--------------------+-------------------+---------+

再次修改配置文件,新增以下内容,重启服务
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only
rpl_semi_sync_slave_enabled=on    设置此行,要先装semisync_slave.so插件,否则mysqld启动失败
[root@wenzi ~]$systemctl restart mysqld
[root@wenzi ~]$mysql
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
mysql> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='wenzi-bin.000003',master_log_pos=156;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.28.30
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: wenzi-bin.000003
          Read_Master_Log_Pos: 156
               Relay_Log_File: wenzi-relay-bin.000003
                Relay_Log_Pos: 324
        Relay_Master_Log_File: wenzi-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
...

测试

在master上创建数据库cs,瞬间完成。

mysql> create database cs;
Query OK, 1 row affected (0.00 sec)

在slave上查看,数据已同步。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| cs                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

当关闭slave库的线程后,再在master上修改数据,发现出现了3s的延迟,符合设定rpl_semi_sync_master_timeout=3000 。

slave
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)


master
mysql> create database ab;
Query OK, 1 row affected (3.01 sec)

查看日志发现同步超时记录

2024-01-24T17:24:08.554849Z 8 [Warning] [MY-011153] [Repl] Timeout waiting for 
reply of binlog (file: wenzi-bin.000003, pos: 514), semi-sync up to file
 wenzi-bin.000003, position 335

GTID复制

master、slave 都是 CentOS8 + mysql8.0.26 + yum安装

master

[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin
gtid_mode=on
enforce_gtid_consistency
...

[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> create user rep@'192.168.28.%' identified by 'Admin.';
mysql> grant replication slave on *.* to rep@'192.168.28.%';

slave

[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only
gtid_mode=on
enforce_gtid_consistency
...

[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.28.30
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: wenzi-bin.000003
          Read_Master_Log_Pos: 335
               Relay_Log_File: wenzi-relay-bin.000002
                Relay_Log_Pos: 550
        Relay_Master_Log_File: wenzi-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 335
              Relay_Log_Space: 759
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 8eaaa80b-bae1-11ee-ace5-000c299f929b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 8eaaa80b-bae1-11ee-ace5-000c299f929b:1
            Executed_Gtid_Set: 8eaaa80b-bae1-11ee-ace5-000c299f929b:1
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:

此时,slave的how slave status\G;结果中的两项值应该是master中show master status的值相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值