一、 什么是半同步复制
① 异步复制
mysql默认的复制都是异步的,主机在提交事务后,并不关心从机是否接受并处理,这里的问题是:很有可能主从之间数据不一致。但是为什么mysql默认还是要异步了,因为这种复制最简单,性能好。
② 全同步复制
当主机提交了事务后,必须等所有的从机执行完成以后才返回给客户端。因为要等所有的从机都执行,肯定性能会下降。
③ 半同步复制
当主机提交了事务后,只需要等一台从机执行完成以后就返回给客户端。相对于异步复制,半同步复制牺牲了一定的性能,提高了数据的安全性。
④ 半同步复制的原理
客户端给主机发送事务操作,主机提交了事务后,主机发送binlog日志给从机,从机写入到中继日志relay log里面, 然后告诉主机已经接收完毕,这时主机才返回给客户端执行完毕。
这里有一个问题:假如从机一直宕机,那么主机不是就卡着了吗? 并不会,当主机发现从机响应超时,主机会自动切换恒异步复制模式,直到下一次同步没有超时再转换成半同步复制。
半同步的性能其实跟异步同步性能其实没有太大的差别,最关键的是主机和从机之间网络的带宽是最大的因素,所以我们在主机和从机搭建的网络一定要很好才可以。
relay log日志 中继日志
理解:relay log很多方面都跟binary log差不多。
区别是:从机I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致
二、安装半同步复制插件
① 插件位置
mysql-5.7.16/lib/plugin
② 安装
install plugin rpl_semi_sync_master soname 'semisync_master.so'; ##主机插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; ##从机插件
建议主从两边都安装
查看是否安装成功:show plugins;
#以上的启动方式是在命令行操作,是临时生效的;永久生效需将如下设置写在my.cnf配置文件中。
下面是主从配置放到一起的,为了方便后面主从切换;如果不需要可以在主机配置master.so,从机配置slave.so
##半同步插件
plugin_dir = /usr/local/mysql-5.7.16/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1
手动开启和关闭:
主机:set global rpl_semi_sync_master_enabled = 1;
从机:set global rpl_semi_sync_slave_enabled = 1;
三、 参数说明
① show variables like 'rpl%';
(root@localhost) [test]> show variables like 'rpl%';
+-------------------------------------------+------------+
| 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_for_slave_count | 1 | ##如果是1主4从 这个参数表示可以设置几个从机数据同步后,返回信号给主机, 默认是1个从机。 master提交后所需的应答数量。
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | ON | ##从机半复制是否开启
| rpl_semi_sync_slave_trace_level | 32 | ##不用管
| rpl_stop_slave_timeout | 31536000 | ##
+-------------------------------------------+------------+
rpl_semi_sync_master_wait_no_slave 参数说明
当状态变量Rpl_semi_sync_master_clients中的值于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即异步复制。
说得直白一点,如果我的架构是1主2从,2个从都采用了半同步复制,且设置的是rpl_semi_sync_master_wait_for_slave_count=2,如果其中一个挂掉了,对于rpl_semi_sync_master_wait_no_slave设置为ON的情况,此时显示的仍然是半同步复制,如果rpl_semi_sync_master_wait_no_slave设置为OFF,则会立刻变成异步复制。
rpl_semi_sync_master_wait_point参数说明
AFTER_SYNC意味着半同步复制,在binary log被flush之后,在存储引擎commit前进入等待,这可以保证数据在被复制到从库前不被其他会话可见;
AFTER_COMMIT意味着半同步复制在存储引擎commit之后进入等待,尽管发起commit的会话还未收到commit成功的提示,其他的会话已经可以看到commit后的数据。
after_sync性能比after_commit要好,因为在组提交的情况下after_sync比after_commit每组的事务更多。
rpl_stop_slave_timeout参数说明
5.6.13之后引入的参数,控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave,命令 stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能,可以通过rpl_stop_slave_timeout参数控制stop slave 的执行时间。默认值是31536000秒=1年
② show status like 'rpl%';
(root@localhost) [test]> show status like 'rpl%';
+--------------------------------------------+-------+
| 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 | 3 |
| Rpl_semi_sync_master_no_times | 2 |
| Rpl_semi_sync_master_no_tx | 2 |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1227 |
| Rpl_semi_sync_master_tx_wait_time | 2454 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-------+
Rpl_semi_sync_master_clients : ##表示半同步复制从机的个数 这个参数很重要Rpl_semi_sync_master_net_avg_wait_time #平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time #总共等待时间
Rpl_semi_sync_master_net_waits #等待次数
Rpl_semi_sync_master_no_times #关闭半同步复制的次数
Rpl_semi_sync_master_no_tx #表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status #表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures #调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time #事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time #事物的总共传输时间
Rpl_semi_sync_master_tx_waits #事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse # 网上有人理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions #当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数