MySQL进阶运维与架构主从复制
31.10 基于半同步模式搭建MySQL主从复制环境
MySQL支持使用半同步模式搭建MySQL的主从复制环境。默认情况下,MySQL的主从复制是异步的,向主库中写入数据,从库是否同步了主库的数据,主库无法确认。如果主库和从库的数据不一致,并且主库发生故障,此时从库就会丢失部分数据。为了避免这种情况的发生,就需要使用MySQL的半同步复制模式。
31.10.1 半同步参数说明
使用半同步复制时,主库会一直等待从库复制数据,直到至少有一个从库接收到同步的数据。其中,有几个重要的参数需要说明。
·rpl_semi_sync_master_enabled:主库是否开启半同步模式,0表示否,1表示是。
·rpl_semi_sync_master_timeout:主库等待从库返回确认结果的超时时间,单位是ms,默认为10s。如果超出了等待时间,主库还未收到从库的确认结果,或者从库中的数据快要追赶上主库时,则主库会自动将半同步模式切换为异步模式。反之,主库会自动切换为半同步模式。
·rpl_semi_sync_slave_enabled:从库是否开启半同步模式,0表示否,1表示是。
·rpl_semi_sync_master_wait_point:主库等待从库返回确认结果的方式。AFTER_SYNC表示主库将事务同步到从库的中继日志后,从库即返回确认结果;AFTER_COMMIT表示主库将事务同步到从库的中继日志,从库读取中继日志,并提交了事务后,再将确认结果返回给主库。
·rpl_semi_sync_master_wait_for_slave_count:设置主库从多少个从库上接收到确认结果,才认为数据同步成功。
31.10.2 配置半同步复制
1.配置主库
(1)在主库上安装rpl_semi_sync_master插件。
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.12 sec)
(2)查看主库上的rpl_semi_sync_master插件是否已经激活。
mysql> SELECT plugin_name, plugin_status
-> FROM information_schema.plugins
-> WHERE plugin_name LIKE '%semi%';
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.22 sec)
结果显示,主库上的rpl_semi_sync_master插件已经激活。
(3)启动主库上的半同步复制。
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
(4)查看主库上的半同步模式是否开启。
mysql> SHOW VARIABLES LIKE '%rpl_semi_sync_master_enabled%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
+------------------------------+-------+
1 row in set (0.23 sec)
主库上的半同步模式已经开启。
(5)将主库等待从库返回确认结果的超时时间修改为1s。
mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000;
Query OK, 0 rows affected (0.00 sec)
(6)查看主库等待从库返回确认结果的超时时间。
mysql> SHOW VARIABLES LIKE '%rpl_semi_sync_master_timeout%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 1000 |
+------------------------------+-------+
1 row in set (0.00 sec)
超时时间为1s。
2.配置从库
(1)在从库上安装rpl_semi_sync_slave插件。
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.12 sec)
(2)在从库上查看rpl_semi_sync_slave插件是否被激活。
mysql> SELECT plugin_name, plugin_status
-> FROM information_schema.plugins
-> WHERE plugin_name LIKE '%semi%';
+---------------------+---------------+
| plugin_name | plugin_status |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+---------------------+---------------+
1 row in set (0.00 sec)
rpl_semi_sync_slave插件已经激活。
(3)在从库上启动半同步复制。
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
(4)查看从库的半同步复制是否启动。
mysql> SHOW VARIABLES LIKE '%rpl_semi_sync_slave_enabled%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
+-----------------------------+-------+
1 row in set (0.12 sec)
从库的半同步模式已经启动。
(5)在从库上重启I/O线程。
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.04 sec)
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
3.查看半同步状态
(1)在主库上查看以半同步模式连接到主库的从库数量。
mysql> SHOW STATUS LIKE '%rpl_semi_sync_master_clients%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| Rpl_semi_sync_master_clients | 2 |
+------------------------------+-------+
1 row in set (0.00 sec)
结果显示,此时有两个从库以半同步复制的方式连接到主库上。
(2)在主库上查看主库使用的复制类型。
mysql> SHOW STATUS LIKE '%rpl_semi_sync_master_status%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
Rpl_semi_sync_master_status的值为ON,说明此时主库使用的是半同步复制。
31.10.3 测试半同步复制
当主库等待从库返回确认结果超时,主库还未收到从库的确认结果,或者从库中的数据快要追赶上主库时,则主库会自动将半同步模式切换为异步模式。反之,主库会自动切换为半同步模式。测试步骤如下:
(1)停止从库的运行,使从库不再同步主库的数据,达到主库等待从库返回确认结果超时的效果。
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)
(2)在主库的testdb数据库下的t_user数据表中插入一条测试数据。
mysql> INSERT INTO testdb.t_user
-> (id, t_name)
-> VALUES
-> (8, 'binghe008');
Query OK, 1 row affected (0.04 sec)
(3)查看主库使用的复制类型。
mysql> SHOW STATUS LIKE '%rpl_semi_sync_master_status%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
+-----------------------------+-------+
1 row in set (0.00 sec)
Rpl_semi_sync_master_status的值为OFF,说明此时主库使用的是异步复制。
注意:停止从库后,从库无法同步主库的数据,主库也接收不到从库返回的确认结果,主库会自动切换为异步复制模式。
(4)启动从库的运行。
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
(5)再次查看主库使用的复制类型时,发现主库已经切换为半同步复制模式。
mysql> SHOW STATUS LIKE '%rpl_semi_sync_master_status%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.01 sec)
注意:关于MySQL半同步复制的知识,读者也可以参考MySQL官方文档,地址是https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html。
- 点赞
- 收藏
- 关注作者
评论(0)