MySQL 8.0.2中的复制特性



作者: 资词翻译组

资词翻译组,由数名数据库技术爱好者组成,旨在传播技术,帮助他人,提升自我。目前的成员有:田丽芳,潘娟,强昌金,王竹峰,侯军伟,吕智超,刘启荣,周彦伟,古雷。

译事三难:信、达、雅。信者,真也,真者,不伪也;达者,至也,至者,无过无不及也;雅者,文学性也,文学性者,当雅则雅当俗则俗也。我们深知能达成此三事,绝非一日之功,亦非常人所能。然,苟利国家生死以,岂因祸福避趋之。我们还是希望竭尽所能,不遗余力,做一点微小的工作,提高姿势水平。由于能力有限,水平一般,有错误不妥之处,还请批评指正,希望能得到大家的资词。
资词翻译组获得MySQL Server团队和MariaDB官方授权,翻译相关技术文章。


MySQL 8 的开发正渐入佳境。与此同时,我们MySQL复制团队也忙的不亦乐乎。我们正在持续引入新颖有趣的特性来提升复制的相关功能。此外,我们一直都在聆听社区的用户心声,并解决大家反馈。我们很高兴能够和大家一起庆祝最新的里程碑开发版(development milestone release),MySQL 8.0.2的发布。为此,我们总结了那些值得注意的改进。后续的博文将为大家提供这些改进的详细信息。

我们加入了以下特性来拓展组复制(Group Replication):

  • 不允许对离组的成员进行更新. 当一个成员自行离开组时,它将被自动设置为super_read_only。这能阻止来自DBA、用户或是路由/代理/负载均衡器的意外更新。除了默认不允许对离开组的成员进行变更新,也可以在启动时就阻止写入。例如,当服务器启动时您可设置它为 super_read_only并启用组复制插件。一旦组复制成功开启,它就会自动正确的调整super_read_only的属性值。在多主模式下,所有加入的成员都会重置super_read_only(为OFF);在单主模式下,只有主库会重置super_read_only。当组复制未能成功开启时(这种情况极少出现),super_read_only属性会被保留,不允许任何写入。实际上最后一个改进在MySQL 5.7.19 and MySQL 8.0.2都实现了。这部分的三个改进都得益于社区成员的反馈 BUG#84728(https://bugs.mysql.com/bug.php?id=84728), BUG#84795(http://bugs.mysql.com/84795), BUG#84733(http://bugs.mysql.com/84733)) 感谢Kenny Gryp!

  • 更多信息被加入到Performance Schema的表中.更多监控能力上的改进被加入到现有的performance schema表中。 “replication_group_members” 和 “replication_group_member_stats” 表被扩展了,现在能够呈现出例如成员角色,成员版本,不同类型的事务(本地/远程)的计数等。

  • 通过指定优先权重值来影响主库的选举.用户能够设定成员权重来影响主库的选择。当当前的主库离开时,拥有最高权重值的成员会被选举为切换对象。

  • 流控机制中的微调项.现在用户可以对流控组件进行更多的微调。用户能设定每个成员的最小配额,整个组的最小提交配额,流控窗口等!


MySQL 8.0.1已经展示出大量被加入到MySQL复制核心架构里的令人瞩目的特性。MySQL 8.0.2又对此进行更多优化:

  • 接收(IO)线程的管理提升甚至可应对磁盘满的情况.该特性提升了接收线程和其他线程的内部协同,并消除了一些资源上的竞争。对于终端用户来说,这意味着即使磁盘变满且接收线程被阻塞,也不会阻塞监控操作,例如 SHOW SLAVE STATUS。一个新的线程状态也被引入用来表示接收线程正在等待磁盘空间。而且,当磁盘空间已满且你无法清理磁盘空间来恢复它的运行时,你可以强制停止它,通常不会有副作用。如果存在正在写入事件,那么该事件会被清除从而使得relay日志处于一致状态。当接收线程正在切换relay日志以及正在等待磁盘空间可用的时候,我们仍需多加注意。

  • 更多的元数据信息加入到二进制日志中.事务的长度被加入到全局事务的日志事件里。这让潜在的优化得以实施以及给二进制日志提供更有力的支持。


如果你对MySQL的复制内部实现感兴趣,我们很欣慰地告诉您我们已经对我们的组件架构做了一些清理以及增加了一项有趣的服务。

  • 组成员事件内部通知到其他组件.利用新服务架构,组复制插件现在可以将组成员相关的事件通知到服务里的其他组件。例如通知成员变更以及仲裁(Quorum)消失。其他组件也能对此信息进行反馈。用户能写他们自己的组件来注册和监听这些事件。

  • 从XCom的内部结构中移除节点的冗余信息.这项工作移除了XComs结构里的一些冗余信息,使之更简单且更少犯错地来追踪离开或重新加入的服务器,然而对之前的视图,系统中还是会存在些陈旧的信息。

  • 对XCom核心的一些优化以及新的代码风格.XCom已经修复了一些bug并且代码风格已经转型来符合google的编码规范。如果你是一位开发者并且喜欢看我们 Paxos(http://mysqlhighavailability.com/the-king-is-dead-long-live-the-king-our-homegrown-paxos-based-consensus/) 的实现,该改变会让你更容易地去阅读并理解代码。

  • 移除了针对非常旧的二进制日志格式的跨版本转换代码.这个清理是指移除了用来将旧版本MySQL产生的二进制日志转换成可被较新版本MySQL识别的较新的二进制日志格式(5.0版本及以上)的代码。

另一件让人感兴趣的变化是我们已经修改了以下MySQL 8.0.2的复制默认项:

  • 默认复制元数据存储在(InonoDB)的系统表里.当遇到复制崩溃并自动恢复到复制点时,该默认项让复制更健壮。同时,较新的特性需要存储元数据信息到表里(例如,组复制,多源复制)。这符合MySQL 8的发展方向和其中新数据字典(New Data Dictionary)的要求。

  • 对基于行的应用器(row-based applier)默认开启哈希扫描.也许这并不是个受欢迎的改变,但当从库存在没有主键的表时,它是可以发挥作用的。当使用行复制时,这个改变可以将该情况下的性能恶化最小化。因为它减少了更新所有行需要的表扫描次数。

  • 默认开启Write set extraction.该选项使得用户在开启组复制或主库上使用基于WRITESET的依赖追踪时减少一步配置操作。

  • 二进制日志过期项默认开启.默认30天后二进制日志过期(expire-logs-days=30)。


如您所见,我们一直忙碌不停。事实上,MySQL 8.0.2在很多方面都展示了优秀的特性。(http://mysqlserverteam.com/the-mysql-8-0-2-milestone-release-is-availableMySQL 8.0.2)在复制方面,我们非常欣慰能看到如此多有趣的特性正在被发布。

今后还会有博文来给大家更详细地介绍上述的特性,请关注我们。事实上,您可以去试用这些功能了。因为您能从这里(https://dev.mysql.com/downloads/mysql/8.0.html#downloads)下载MySQL 8.0.2的安装包。要注意的是MySQL 8.0.2是里程碑开发版(https://dev.mysql.com/doc/mysql-development-cycle/en/development-milestone-releases.html)(DMR),GA版(https://dev.mysql.com/doc/mysql-development-cycle/en/ga-releases.html)还未发布。使用风险您自行承担。不要忘了,反馈一直备受欢迎且感激不尽。 您可以通过bug提交(http://bugs.mysql.com),feature提交(http://bugs.mysql.com),复制邮箱清单(https://lists.mysql.com/replication)来将它发送给我们或是在本博文下方留言(追评)。MySQL 8渐入佳境!我们也激动不已


明星学员

曾*浩 就职于广东众望通科技股份有限公司

转正7000

谭* 就职于GEA国际集团(锆德教育资讯(深圳)有限公司广州分公司

转正8000

刘* 就职于睿盟计算机科技有限公司

转正8000

林*勇 就职于南方人才市场

转正6000

李*达 就职于云景科技

8000

吴* 就职于北京易诚互动网络技术有限公司

转正6000