InnoSQL从MySQL 5.7.20版本开始调研、测试和使用MGR特性,结合考拉海购的业务场景,我们对MGR进行了深度优化,解决了大量5.7版本的MGR bug并进行了针对性增强。在考拉未被阿里收购前,考拉的绝大部分MySQL实例均已替换为网易数帆下基于MGR的RDS产品,相关的问题分析和优化,在本专栏的前两年文章中有详细介绍。

5.7版本上MGR的不足也受到了Oracle MySQL开发团队的重视,在8.0版本上,MGR社区版有非常重大的改进,相比5.7版本(社区版)更加适合线上使用,包括可调节的xcom cache大小,在线切换单主/多主模式等等。不过依然有不少特性,在我们的实践中认为比较重要的,但8.0社区版还未提供。本文就举例介绍下相比社区MySQL 8.0.19版本,InnoSQL 8.0.19版本在MGR上新增的一些功能特性。

单主(single primary)优化模式

该优化主要针对MGR的冲突检测模块,这是为了支持多主/multi-master模式(以及单主模式进行主从切换场景)。因为需要确保在多个节点上进行的DML操作没有冲突,所以在每个节点的内存中维护了所有已经提交的事务writeset。只有那些已经在所有节点都已经提交/回放的事务对应的writeset才能通过垃圾清理进行内存空间回收。即所有节点的gtid_executed都已经推进到该事务前面。

但这对于非主从切换状态的单主模式,这么做并没有意义。尤其在写压力较大,节点间有一定复制延迟的场景下,冲突检测数据库占据的内存非常可观,反而可能因为内存不足而导致mysqld oom。

新增group_replication_certification_database_size动态参数,非零为优化模式。启用优化后节点可自主清理冲突检测数据库垃圾,不受其他节点gtid_executed影响。这样可以有效减小冲突检测数据库对内存资源的占用,同时也能够大幅缩短该数据库进行垃圾清理时的mutex持有时间,防止阻塞前台的业务DML操作,提升了性能稳定性。

动态调整冲突检测数据库垃圾清理周期

新增group_replication_garbage_collect_period动态参数,用于及时清理writeset垃圾。

社区的策略是每分钟清理一次,但在大实例大压力场景下,一分钟可能会累积很多writeset,一是占据过多内存,二是清理时阻塞前台业务。

该功能配合单主优化模式更佳,因为在很多场景下,调低周期没用,如果所属事务还未在所有节点提交,那些writeset还是无法清理的。

动态调整节点gtid_executed广播周期

新增group_replication_broadcast_gtid_executed_period动态参数,在未开启单主优化模式时,该参数决定了冲突检测数据库垃圾清理周期。用于及时清理writeset垃圾;

该功能在单主非优化模式下使用,此时group_replication_garbage_collect_period和group_replication_broadcast_gtid_executed_period保持一致。为了能够尽快清理掉垃圾,通过缩短广播周期来尽快同步其他节点gtid_executed。

冲突检测数据库流控

新增group_replication_flow_control_writeset_threshold动态参数,在writeset个数达到阈值后,启动节点流控机制。用于缩小主从复制延迟,降低内存消耗;

该功能也是在单主非优化模式下使用,主要是稳定性角度考虑。避免writeset过多导致mysqld oom。稳定压倒一切,即使损失部分性能。

故障恢复时数据源选择策略优化

优先选择非Primary节点作为复制源; 避免从primary节点拉binlog对上面的业务造成不必要的影响。

流控及冲突检测状态

当前冲突检测状态group_replication_conflict_detection_status,本周期配额group_replication_flow_control_quota_size及已使用量group_replication_flow_control_quota_used;

暴露更多状态来提高可观测性。比如节点是否处于流控状态。比如应该启用冲突检测的时候是否没有启用?

其他

除了上述之外,还有一些特性未介绍。其中包括上一篇已介绍过的MGR arbiter/log member特性:

- MGR日志节点特性:

新增group_replication_log_member只读参数,参数开启表示对应MySQL进程为MGR日志节点,业务创建的所有innodb表均自动转换为blackhole表。即日志节点不保存业务数据,仅保留Binlog日志文件。用于降低MGR部署成本;

- MGR投票节点特性:

新增group_replication_arbiter_member只读参数,参数开启表示对应MySQL进程为MGR投票节点。该节点无业务数据,无Binlog日志文件。用于进一步降低MGR部署成本。

最后,日常安利下网易数帆旗下网易轻舟的MGR on K8S产品。其所使用的InnoSQL内核版本已在考拉海购业务场景大规模集群下充分验证,性能和稳定性有保证。




mysql MRR机制 mysql mgr缺点_MySQL