组复制MySQL Group Replication(简称 MGR)是MySQL官方在已有的Binlog复制框架之上,基于Paxos协议实现的一种分布式复制形态。RDS MySQL集群系列实例支持组复制。本文介绍如何使复制方式为组复制。
背景信息
使用了组复制的MySQL集群能够基于分布式Paxos协议自我管理,具有很强的数据可靠性和数据一致性。相比传统主备复制方式,组复制具有以下优势:
数据的强一致性:组复制集群能够自主管理集群,当主库故障时,能够主动进行故障节点剔除和主备切换,并且切换后主备库的数据仍然保持一致。
数据的强可靠性:组复制中事务在提交时,一定保证数据已经复制到了超过半数的节点,因此在多数派可用的情况下,能够保证数据不丢失。
全局事务强一致性:组复制具备集群的节点间的数据全局一致读和全局一致写能力,可根据业务需要修改group_replication_consistency参数设置读写的一致性等级。
说明数据的全局一致读能力:您可以在备库上设置Session级别的group_replication_consistency参数为BEFORE,然后执行查询语句。此时,备库会等到主库上所有先于此查询语句的事务应用完成后,再执行这条查询语句。
数据的全局一致写能力:您可以在主库上设置Session级别的group_replication_consistency参数为AFTER,然后执行写事务,这个事务会等到所有节点应用成功后,再在主库上返回提交成功的消息。
多数派:指集群中超过半数以上的节点。
应用场景
要求数据强可靠和强一致的业务场景,例如金融、电商、核心交易系统等。
前提条件
实例满足以下条件:
系列:RDS MySQL集群系列实例。
说明高可用系列实例升级为集群系列实例的方法,请参见高可用系列升级为集群系列。
版本:内核小版本大于或等于MySQL 8.0 20221231。如需升级内核小版本,请参见升级内核小版本。
存储引擎:InnoDB。
内存:大于或等于8 GB。如需升级实例规格,请参见变更配置。
实例节点个数大于等于3,且为单数。
在有数据库代理的情况下,代理版本:大于或等于Maxscale_MySQL_2.2.12_20230302。如需升级数据库代理版本,请参见升级独享代理内核小版本。
产品类型:标准版
您可以到RDS控制台实例的基本信息页面查看实例的系列、版本、规格等信息。
使用限制
存在X-Engine引擎表的实例不能使用组复制。
可以通过以下SQL语句检查是否存在X-Engine引擎表,查询结果为0表示不存在X-Engine引擎表。
SELECT COUNT(1) FROM information_schema.TABLES WHERE ENGINE = 'xengine' AND table_schema NOT IN( 'information_schema', 'performance_schema', 'mysql', 'test', 'sys', '__recycle_bin__' );
存在无主键表的实例不能使用组复制。
可以通过以下SQL语句检查是否存在无主键表,查询结果为0表示不存在无主键表。
SELECT COUNT(1) AS count FROM information_schema.TABLES t1 LEFT OUTER JOIN information_schema.columns t2 ON t1.table_schema = t2.TABLE_SCHEMA AND t1.table_name = t2.TABLE_NAME AND t2.COLUMN_KEY = 'PRI' WHERE t2.table_name IS NULL AND t1.table_type = 'BASE TABLE' AND t1.TABLE_SCHEMA NOT IN( 'information_schema', 'performance_schema', 'mysql', 'sys' );
除了上述限制外,业务层面的组复制的使用限制,请参见官网文档Requirements and Limitations。
影响
将异步或半同步复制方式切换为组复制方式时,会出现实例切换,请在业务低峰期进行。请确保您的应用程序具有重连机制,重连机制需要在您的应用程序中设置。实例切换的影响请参见实例切换的影响。
技术实现
组复制是基于Paxos协议实现的一种分布式复制形态。详细实现原理请参见组复制简介。
注意事项
组复制性能弱于异步复制,内存资源消耗多于异步和半同步复制,性能敏感型或资源敏感型业务请在测试后使用。
为保证组复制集群的稳定运行,在使用组复制时,系统会将以下参数设为固定值,如下所示。
disabled_storage_engines=MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY,XENGINE gtid_mode=ON enforce_gtid_consistency=ON log_slave_updates=ON binlog_format=ROW slave_preserve_commit_order=ON rpl_semi_sync_master_enabled=OFF rpl_semi_sync_slave_enabled=OFF master_info_repository=TABLE relay_log_info_repository=TABLE binlog_transaction_dependency_tracking=WRITESET transaction_write_set_extraction=XXHASH64 slave_parallel_type=LOGICAL_CLOCK replication_communication_stack=MYSQL group_replication_single_primary_mode=ON group_replication_paxos_single_leader=ON group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER
费用
使用组复制不需要额外支付费用。
操作步骤
新创建使用组复制的实例
在创建RDS MySQL集群系列实例时,参数模板选择MySQL_InnoDB_8.0_集群系列_组复制参数模板,即可开通复制方式为组复制的实例。
已创建的实例变更为组复制
如果您已经有RDS MySQL集群系列实例,可以在实例基本信息页面的实例拓扑管理区域,单击修改数据复制方式,在弹出的对话框中选中组复制,单击确认,即可将实例复制方式变更为组复制。
组复制也可以切换为异步或半同步复制。
常见问题
Q:使用组复制后,还能切换回异步或半同步复制模式吗?
A:可以。异步、半同步、组复制三种复制模式可以相互切换,您可以在实例基本信息页面的实例拓扑管理区域,单击修改数据复制方式,在弹出的对话框中修改复制方式。
Q:使用组复制后,备节点还支持可读吗?
A:支持。由于组复制的各节点之间使用Paxos协议,在备节点负载过高的情况下,会影响主节点写入性能,建议开通数据库代理服务进行读写分离,数据库代理支持配置读权重和复制延迟阈值,可有效避免备节点负载过高。
Q:组复制支持多主模式吗?
A:不支持。RDS MySQL当前只提供单主模式的组复制实例。多主模式下集群的稳定性很差,任意节点的抖动或故障,都会影响全集群的可用性。
Q:为什么使用组复制要求内存大于等于8 GB?
A:在开启组复制后,Xcom层中维护了一个约1 GB的Xcom Cache,用来储存Xcom message。组复制的事务认证模块会维护一个认证信息数组,占用一定的内存。组复制还会开启额外的后台线程,消耗部分内存。如果购买的实例规格内存偏小,在有大查询等内存使用率较高的场景下,会导致实例OOM。因此,我们推荐开启组复制的实例尽量选取内存较大的规格。
Q:使用组复制后,应该购买通用型规格还是独享型规格?
A:由于组复制会使用额外的内存,所以当购买的规格内存较小时(8 GB~16 GB),推荐选取通用型规格,可以规避部分管控内存消耗,提升实例的可用内存;
如果所购买内存较大(如32 GB),推荐选取独享型规格实例,可以获取更好的隔离性与高峰性能。
相关API
API | 描述 |
调用CreateDBInstance接口创建复制方式为组复制的集群系列实例时,您需要将DBParamGroupId参数值设置为rpg-sys-01040407010400,其他参数请按需配置。 | |
调用ModifyDBInstanceHAConfig接口修改实例的复制方式为组复制时,您需要将SyncMode参数设置为Mgr,其他参数请按需配置。 |