MySQL 5.7.3的Semi-Synchronous Replication持久化数据到多个Slave上

在MySQL5.7.3上, 我们发布了一个新的semi-synchronous功能。使用这个功能,可以更好的保障数据一致性和持久性。下面,请允许我为大家介绍一下这个功能。

在读这篇文章之前,你需要知道什么是semi-synchronous replication. 如果你以前没有了解过semi-synchronous replication,你可以阅读MySQL手册的 Seim-Synchronous Replication 章节。 MySQL 手册介绍的很详细,这里我就不再赘述了。

持久化数据到多个Slave

这个新功能允许用户设置:在事物成功提交之前,它的数据应该被复制到多少个slave上。换句话说,semisync master的事物需要等待多少个slave给它应答。简化的处理过程如下图所示:
Master和Slave同时出故障是很少发生的,但是仍然会发生。比如,如果master和slave在同一个数据中心,那么数据中心突然断电将导致master和slave同时不可用。 通过使用这个新功能,你可以将多个semisync slave安装在不同的地点,并且配置semisync master 复制事物的数据到至少2个slave上,来增加MySQL 数据库系统的可用性。配置semisync master复制事物到越多的semisync slave,就会有越好的数据持久性。

如何配置这个功能

这个功能添加了一个新的semisync master plugin 系统变量。
  • rpl_semi_sync_master_wait_slave_count
这是一个整形的变量,有效值为1-1024. 从这个变量我们可以看出,这个功能只关心数据应该被复制到多少个slave上,而不关心数据被复制到哪些slave上。它的缺省值是1,可以被动态的修改。你也许奇怪为什么可以动态的修改,下面我介绍一下动态修改时的逻辑:

  • 当配置修改后,新的配置将会应用到所有正在等待的事物上包括那些在修改之前就开始等待的事物。

假设rpl_semi_sync_master_wait_slave_count = 2,两个slave分别是slave1 和 slave2.

  1. Transaction1 开始等待2个 ACKs.
  2. Semisync master 收到 slave1的ACK
  3. 用户运行 slave3,并且修改semisync master的 rpl_semi_sync_master_wait_slave_count 为 3
  4. Semisync master 收到slave2的ACK(此时transaction1仍然要等待)
  5. Semisync master 收到slave3的ACK
  6. Semisync master 唤醒正在等待的transaction1

从上面的执行过程可以看到, Transaction1 需要等带3个ACK.

减小rpl_semi_sync_master_wait_slave_count也是相似的:
  1. Transaction1 开始等待 3个 ACK.
  2. Semisync master 收到了slave1 和slave2的ACK.
  3. 用户修改 rpl_semi_sync_master_wait_slave_count 为 2.
  4.  Semisync master唤醒transaction1,因为它已经收到了 2个 ACK

结论

通过使用这个功能,用户的MySQL数据库系统对大的事故有更强的抵抗力,甚至能在灾难中存活下来,保持可用性。如果正在担心这样的问题发生,那么这个功能是为你准备的,请试用MySQL-5.7.3的semi-synchronous replication.

参考

MySQL 5.7.3的其他新功能介绍:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>