本文介绍了如何在MySQL中实现半同步复制。内容非常详细,感兴趣的朋友可以参考一下。希望对大家有帮助。
MySQL复制架构有三种方式:异步、全同步和半同步复制。
三种复制模式
第一种是异步复制,这是一种经典的主从复制。主从默认架构是异步的,性能相对更好。但是仍然会有数据丢失。
第二种是完全复制,比如MySQL Cluster,属于完全复制。实际上,MySQL
其实Cluster的发展并不是很顺利,更多的时候是实验室产品,但是时间固定在2016年12月12日,MySQL 5.7.17。
遗传算法群的主要特征
Replication插件引入增强了MySQL最初的高可用性方案(最初的复制方案),并提供了重要的功能-写入更多内容,确保组内的高可用性,并确保数据的最终一致性。有点像甲骨文的RAC。
第三种是介于异步复制和完全复制之间的方案,即半同步半同步复制。自从MySQL 5.5推出以来,就是对异步和全复制的补充,具体来说,应该是对MySQL Cluster的补充。
如果我们将此与甲骨文联系起来,它实际上有点类似于甲骨文的高可用性模式。在Oracle中,有最大性能模式、最大保护模式和最大高可用模式,其中最大性能模式是异步的,类似于异步复制的作用,最大保护模式是完全数据同步,有点类似于全复制方案,而最大高可用模式介于两者之间,甚至可以实现动态切换,类似于半同步复制的作用。
半同步复制
要开启半同步,我们需要安装插件,这个过程非常简单。的基本要求是在异步复制的情况下,版本在5.5以上,变量have_dynamic_loading为YES。
显示像“%have_dynamic_loading%”这样的变量;
- -
|变量名|值|
- -
|有_动态_加载|是|
- -
集合中的1行(0.00秒)在基本目录中,您可以轻松找到所需的插件。is /usr的当前基础目录,可以根据关键字找到插件。
#找到。-名称“semisync_master.so”。/lib 64/MySQL/plugin/semi sync _ master . so。/lib 64/MySQL/plugin/debug/semi sync _ master . so
安装插件只是两个简单的命令。
安装插件rpl _ semi _ sync _ master soname ' semi sync _ master . so ';
查询正常,0行受影响(0.11秒)
安装插件rpl _ semi _ sync _ slave soname ' semi sync _ slave . so ';
查询正常,0行受影响(0.00秒)安装后检查mysql.plugin,查看插件记录是否存在,或使用show plugins。
从mysql.plugin中选择*;
- -
|名称| dl |
- -
| rpl _ semi _ sync _ master | semi sync _ master . so |
| rpl _ semi _ sync _ slave | semi sync _ slave . so |
- -
2行一组(0.00秒)当然,默认的半同步开关还没有打开。
/p>
> show variables like 'rpl_semi_sync_master%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
4 rows in set (0.00 sec)这里涉及到两个参数rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled,比较直观。
打开即可。set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=1;如果在master端简单验证,也可以使用show status
> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+当然在slave端也需要做同样的操作,然后在slave端重启IO_Thread即可。
> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)Master端检查Rpl_semi_sync_master_statusSlave端检查
Rpl_semi_sync_slave_status
半同步在MySQL 5.6,5.7的变化
MySQL 5.7中新增了一个参数来控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。
> show variables like 'rpl_semi_sync_master_wait_point';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+
1 row in set (0.00 sec)而在MySQL 5.6中是什么设置呢,是AFTER_COMMIT
这两个参数该怎么理解。我参考了https://sanwen8.cn/p/105GRDe.html 中的图片。
master的数据写入了binlog,slave 刷新到磁盘(relay log),所以在OLTP的场景下,master需要等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端
而MySQL 5.7中的半同步复制,有个叫法是Loss-Less半同步复制。实现的方式有了一些差别。
这种模式(AFTER_SYNC),事务是在提交之前发送给Slave,当Slave没有接收成功,并且如果发生Master宕机的场景,不会导致主从不一致,因为此时Master端还没有提交,所以主从都没有数据。
简单测试半同步复制
我们来简单看看半同步复制的一些小测试。
create database testsync;
然后创建一个表,插入一行数据。很明显执行速度很快。
> create table testsync.test(id int);
Query OK, 0 rows affected (0.07 sec)
> insert into testsync.test values(100);
Query OK, 1 row affected (0.01 sec)我们模拟网络延迟的情况,直接把slave停掉。
stop slave;这个时候在Master端插入数据就会有很慢。这个过程持续了大概10秒多。
> insert into testsync.test values(101);
Query OK, 1 row affected (10.00 sec)这里为什么是10秒,和一个扮同步复制的参数有关。单位是毫秒,所以换算下来就是10秒。
> show variables like 'rpl_semi_sync_master_timeout';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+
我们看看扮同步复制的开关。
> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
+-----------------------------+-------+slave端也是OFF的状态。
我们恢复状态,把slave启动。然后在Master端继续插入一条记录,速度就很快了。
> insert into testsync.test values(102);
Query OK, 1 row affected (0.00 sec)此时的开关是打开的。
> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+查看数据库日志,其实也能看到很明确的信息。
2017-02-04T23:37:44.551667+08:00 2145633 [Warning] Timeout waiting for
reply of binlog (file: mysql-bin.000017, pos: 1056976828), semi-sync up
to file mysql-bin.000017, position 1056976573.
2017-02-04T23:37:44.551713+08:00 2145633 [Note] Semi-sync replication switched OFF.
2017-02-04T23:41:05.824146+08:00
2145900 [Note] Start binlog_dump to master_thread_id(2145900)
slave_server(13058), pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.824194+08:00
2145900 [Note] Start semi-sync binlog_dump to slave (server_id: 13058),
pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.835505+08:00 0 [Note] Semi-sync replication switched ON at (mysql-bin.000017, 1056977083)
关于怎么实现MySQL中的半同步复制就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/95845.html