近日,腾讯云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的功能实现全面突破和领先。
以上就是金山云为您带来的【干货】腾讯云CDB属性升级,TXSQL 5.7实现真正复制强制一致的相关内容,如果您还想了解更多腾讯云CDB,TXSQL,5.7,SQL,【干货】腾讯云CDB属性升级,TXSQL,5.7实现真正复制强制一致的相关问题您可以点击页面中的链接进行具体了解。金山云提供云服务器,云主机,云存储,私有云,数据库,物理主机,RDS,KS3,SLB,KEC的全套产品服务,部分产品可以免费体验,而且会有定期的优惠、代金券等相关的活动。成立7年来,金山云始终坚持以客户为中心的服务理念,提供安全、可靠、稳定、高品质的云计算服务。以上是对【干货】腾讯云CDB属性升级,TXSQL 5.7实现真正复制强制一致相关介绍,如果觉得对您有帮助可以收藏。欢迎随时查看。