【干货】腾讯云CDB属性升级,TXSQL 5.7实现真正复制强制一致
近日,腾讯云CDB迎来MySQL 5.7版本的更新。MySQL 5.7GA版本从5.7.9到如今的5.7.18,版本已经越来越稳定。从oracle官方版本发布的Release Notes中,看到最近的两个版本5.7.17和5.7.18主要是以bug修改为主。
众所周知,腾讯云CDB for MySQL5.7版本除了性能的极大提升之外,也增加了很多新功能特性,比如GIS数据类型和空间索引,Json数据类型,Generated colum以及函数索引, 数据加密,还有Group Relication等等重磅功能。
而腾讯云上已经有用户需要用到上述的一些功能,所以也是从今年四月份就开始做TXSQL 5.7(TXSQL是腾讯云数据库团队维护的MySQL内核分支)的版本,并在四月底提交了版本进行测试。本次,腾讯云的TXSQL 5.7是基于MySQL 5.7.18版本。
目前腾讯云TXSQL 5.7的第一版,在复制强制一致、自动转换MyISAM表为InnoDB表、增加不同的工作模式等方面有着非常重大的突破。
1. 复制强制一致
了解的人都知道,在MySQL的semisync设有超时机制,配置参数为rpl_semi_sync_master_timeout。一旦master在设定的时间内没有等到slave的确认(比如网络故障),semisync就会关闭,主动降级为默认的异步复制模式。异步复制模式最大的问题就是master不用等待slave的确认。那么当master挂掉的时候,切换到slave,就存在丢数据的可能。
针对数据可能丢失这一点,腾讯云在TXSQL 5.7增加了一个新的选项rpl_semi_sync_wait_forever。在其为ON的时候,master会一直等待slave的确认。如果长时间等不到确认,系统告警,这时候可以设置rpl_semi_sync_wait_forever为OFF,来唤醒master中的等待线程,同时将semisync降级为异步模式。在这种情况下,如果master在最终收到slave确认,而且slave追赶到最新的binglog后会自动开启semisync。
11. 方案设计
(1) 设置rpl_semi_sync_master_timeout到一个无限大的值
这样可以实现master一直等待,但是当想回到正常的timeout模式时,我们需要记住之前的rpl_semi_sync_master_timeout的设置值。这样可能需要加一个系统的状态变量来保存这个值。另外,这样会导致在处理rpl_semi_sync_master_timeout值变化时的逻辑变复杂。
(2) 增加新变量rpl_semi_sync_wait_forever
既然在上一种方案需要一个新的状态变量,腾讯云就直接增加一个变量来作为一直等待的开关。在rpl_semi_sync_wait_forever为ON的时候,master会一直等待slave的确认。如果长时间等不到确认,系统告警,则可以设置rpl_semi_sync_wait_forever为OFF,来唤醒master中的等待线程,同时将semisync降级为异步模式。在这种情况下,如果master在最终收到slave确认,而且slave追赶到最新的binglog后会自动开启semisync。
(3)基于paxos的semisync
MySQL5.7中支持rpl_semi_sync_master_wait_for_slave_count,但在某一个slave没有在rpl_semi_sync_master_timeout时间内返回确认,即便是master等到了rpl_semi_sync_master_wait_for_slave_count个slave的确认,master还是会从semisync降级到异步模式。在semisync中支持paxos协议会从根本上解决这个问题,实现真正意义上的强一致。
目前,腾讯云选择的为(2)方案,这主要是因为,现网实例中基本都是一主一备,(3)的方案比较重,(2)的实现明显优于(1)。方案(3)适合对强一致要求更高的应用场景,目前,腾讯云已经列入开发计划,预计下半年推出。
1.2 实现原理
(1) 设置rpl_semi_sync_wait_forever为ON之后
a. 新进来的事务需要一直等待。
b. 之前老的事务如果发生超时,需要继续等待。
因为如果用户设置为ON之后,预期是不会发生超时。
(2)设置rpl_semi_sync_wait_forever为OFF
如果此时有一直在等待的事务,要唤醒。最初的方案是
signal_waiting_sessions_all()来唤醒这些事务,然后如果事务等待的时间超过了rpl_semi_sync_master_timeout,降级为异步模式。如果等待的时间wait_time < rpl_semi_sync_master_timeout,那么继续等待rpl_semi_sync_master_timeout - wait_time。但是通过sysbench压测发现这样的方案会导致死锁,。
所以最终的简化方案是:
1.3 新增状态
2. 自动转换MyISAM表为InnoDB表
MyISAM表因为不支持事务,所以存在故障恢复丢数据的可能。在复制环境下,如果使用MyISAM表,master和slave就可能出现不一致情况。即使腾讯云强烈建议用户只使用InnoDB表,但是还是无法避免用户在某些情况仍然去使用MyISAM表。为了解决这个问题,腾讯云提供了新的选项,在建表的时候默认将MyISAM表转为InnoDB表。
新增变量
可选值
由于InnoDB内部的一些限制,会导致有些情况下转换失败。
(1) auto-increment
在InnoDB中只允许定义一个自增列,并且这个列必须被定义为主键。在MyISAM中则无此限制。
(2) max key length
在InnoDB中,innodb_large_prefix关闭的情况下,max key length不能大于767,而在MyISAM中,则不能大于1000。
(3) row format
在InnoDB中,innodb_strict_mode开启的情况下,row format FIXED是不支持的。
3. 增加不同的工作模式
除了复制强制一致、自动转换MyISAM表为InnoDB表,这两项功能的实现以外,在TXSQL 5.7中,腾讯云还为其增加了READ_ONLY模式。
众所周知,MySQL 5.7中增加了一个新的参数offline_mode(WL#3836),设置此参数为OFF,server拒绝对外服务,root用户可以对系统进行诊断操作或升级操作等。在TXSQL 5.7中增加了READ_ONLY模式,不同的工作模式,将会实现更多的功能。
目前,这只是腾讯云TXSQL 5.7的第一个版本,从总体功能来看,这些已经实现的功能,都相对来说非常的人性化和实用。这也将进一步促进腾讯云CDB的功能实现全面突破和领先。