mysql半同步复制机制

在mysql主从复制中,有一下几种复制的方法

异步复制(Asynchronous replication)
Mysql中默认的方式就是异步的,master在受到客户提交的请求后,马上返回结果,而slave中是否同步并处理是不会考虑的,所以这样的话,虽然效率高但是数据的完整性得不到保障,如果master down了,需要从slave中选举出一个master,如果master中提交的修改没有传到slave上,就会导致新的master有数据的缺失

全同步复制(Fully synchronous replication)
当master执行完一个请求时,所有的slave都同步以后才将结果返回给客户。很明显这样的话效率会非常的低下

为了更好的权衡效率和数据一致性,所以又有了半同步复制机制
半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。
主从复制的基本原理如下图
这里写图片描述
其中的log dumper线程用来给I/O线程来传送binlog(二进制日志),来达到更新从库完成同步的作用。
而半同步机制增加了一个ack,即是否成功收到事务的标志码。也就是dumper线程除了发送事务到slave,还承担了接收slave的ack工作。如果出现异常,没有收到ack,那么将自动降级为普通的复制,直到异常修复。
所以说半同步同样也存在问题,虽然相对于全同步与全异步有所折衷。
(1)异常发生后就变成了普通的复制,可以有效降低数据不一致的情况,但是也不是完全避免了。
(2)dumper线程中增加了一个ack,所以加大其工作量,所以效率必然会受到影响。
(3)在MySQL 5.5和5.6使用after_commit的模式下, 即如果slave 没有收到事务,也就是还没有写入到relay log 之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从机,两边的数据就会出现不一致。 在此情况下,slave会少一个事务的数据。

在5.7的版本下推出了Loss-less Semi-Synchronous Replication架构
其中增加了rpl_semi_sync_master_wait_point参数
这个参数有两个值
1.AFTER_COMMIT(5.6默认值)
master将每个事务写入binlog ,传递到slave往relay log上写,同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。
**2.AFTER_SYNC(**5.7默认值)
master 将每个事务写入binlog , 传递到slave 刷新到磁盘(relay log)。master等待slave 反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。 即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。

半同步复制的安装部署

要想使用半同步复制,必须满足以下几个条件:

1. MySQL 5.5及以上版本

2. 变量have_dynamic_loading为YES

3. 异步复制已经存在

首先加载插件

因用户需执行INSTALL PLUGIN, SET GLOBAL, STOP SLAVE和START SLAVE操作,所以用户需有SUPER权限。

主:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

从:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

查看插件是否加载成功

有两种方式

  1. 1.
mysql> show plugins;

rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL  
  1. 2.
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.00 sec)

启动半同步复制

在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步

主:

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

从:

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

以上的启动方式是在命令行操作,也可写在配置文件中。

主:

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

从:

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制

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

重启从上的IO线程

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。

查看半同步是否在运行

主:

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)

从:

mysql> show status like 'Rpl_semi_sync_slave_status';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.20 sec)

这两个变量常用来监控主从是否运行在半同步复制模式下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值