MySQL中的半同步复制(r11笔记第65天)
公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-02-04 23:48:08 · 原文链接
关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。
三种复制方式
第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方式,就是属于异步的,相对来说性能要好一些。但是还是会有丢失数据的情况。
第二种是全复制,比如说MySQL Cluster这样的方式,是属于全复制的,实际上MySQL Cluster其实发展并不大顺利,更多时候是一个实验室产品,但是时间定格在2016年12月12日,MySQL 5.7.17 GA的重大特性group replication插件推出,增强了MySQL原有的高可用方案(原有的Replication方案),提供了重要的特性—多写,保证组内高可用,确保数据最终一致性。有点类似Oracle里面的RAC.
第三种是在异步和全复制之间的一种方案,就是半同步semi-sync replication。自MySQL 5.5推出,是对异步和全复制的一种补充,确切的说,应该是对MySQL Cluster这种方案的补充。
如果把这个和Oracle联系起来,其实和Oracle高可用模式有点类似,Oracle中是最大性能模式,最大保护模式,最大高可用模式,其中最大性能模式就是异步的方式,类似于异步复制的角色,最大保护模式是完全的数据同步,有点类似于全复制的方案,而最大高可用模式是介于两者之间,甚至可以达到动态切换,和半同步复制的角色差不多。
半同步复制
要开启半同步,我们需要安装插件,这个过程就很简单了。基本的要求是在满足异步复制的情况下,版本在5.5以上,并且变量have_dynamic_loading为YES
> show variables like '%have_dynamic_loading%';+----------------------+-------+| Variable_name | Value |+----------------------+-------+| have_dynamic_loading | YES |+----------------------+-------+1 row in set (0.00 sec)在base目录下,可以很容易找到所需的插件。当前的base目录为/usr,可以根据关键字找到插件。
# find . -name "semisync_master.so"./lib64/mysql/plugin/semisync_master.so./lib64/mysql/plugin/debug/semisync_master.so
要安装插件就是两个简单的命令。
> install plugin rpl_semi_sync_master soname 'semisync_master.so';Query OK, 0 rows affected (0.11 sec)
> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';Query OK, 0 rows affected (0.00 sec)安装后查看mysql.plugin看看插件记录是否存在,或者使用show plugins也可以。
> select * from mysql.plugin;+----------------------+--------------------+| name | dl |+----------------------+--------------------+| rpl_semi_sync_master | semisync_master.so || rpl_semi_sync_slave | semisync_slave.so |+----------------------+--------------------+2 rows in set (0.00 sec)当然默认半同步的开关还没有打开。
> 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 中的图片。

