mysql5.7 半同步复制

一、 什么是半同步复制

① 异步复制

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事物回复的次数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值