MySQL进阶运维与架构主从复制

举报
Ustinian_2022 发表于 2022/07/27 18:02:00 2022/07/27
【摘要】 31.10 基于半同步模式搭建MySQL主从复制环境MySQL支持使用半同步模式搭建MySQL的主从复制环境。默认情况下,MySQL的主从复制是异步的,向主库中写入数据,从库是否同步了主库的数据,主库无法确认。如果主库和从库的数据不一致,并且主库发生故障,此时从库就会丢失部分数据。为了避免这种情况的发生,就需要使用MySQL的半同步复制模式。31.10.1 半同步参数说明使用半同步复制时,主...

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。