mysql 组复制(MGR)系列文章(二)之组复制两种模式

一、介绍

组复制在单主模式或多主模式下运行。组的模式是由group_replication_single_primary_mode系统变量指定,该变量在所有成员上必须相同。ON表示单主模式,这是默认模式,OFF表示多主模式。不可能以不同模式部署组的成员,例如,一个成员配置为多主模式,而另一个成员则配置为单主模式。

在组复制运行时,您无法手动更改group_replication_single_primary_mode的值。在MySQL 8.0.13中,您可以使用group_replication_switch_to_sile_primary_mode()和group_replication_sitch_to_multi_primary_mode()函数在组复制仍在运行时将组从一种模式移动到另一种模式。这些功能管理更改组模式的过程,并确保数据的安全性和一致性。在早期版本中,要更改组的模式,必须停止组复制,并更改所有成员的group_Replication_single_primary_mode值。然后对组进行完全重启(由group_replication_boottrap_group=ON的服务器引导),以实现对新操作配置的更改。您不需要重新启动mysql服务器。


二、单主模式

2.1、单主模式介绍

在单主模式(group_replication_single_primary_mode=ON)下,该组有一个设置为读写模式的单主服务器。组中的所有其他成员都设置为只读模式(super_read_only=ON)。主服务器通常是引导组的第一个服务器。加入该组的所有其他服务器都会知道主服务器,并把自己自动设置为只读模式。

在单主模式下,组复制强制只有一台服务器能够写入,因此与多主模式相比,一致性检查可以不那么严格,DDL语句也不需要特别小心处理。选项group_replication_enforce_update_everywhere _checks的作用是启用或禁用组的严格一致性检查。在单主模式下此系统变量必须设置为OFF。

当选举新的主服务器时,它可能有一堆已应用于旧主服务器但尚未应用于此服务器的写操作。在这种情况下,在新主服务器赶上旧主服务器之前,读写事务可能会导致冲突并被回滚,只读事务可能会造成读取到老数据。组复制的流控制机制最大限度地减少了快速和慢速成员之间的差异,如果激活并正确调整,则可以降低发生这种情况的可能性。从MySQL 8.0.14开始,您还可以使用group_replication_consistance系统变量来配置组的事务一致性级别,以防止此问题。设置group_replication_consistance=BEFORE_ON_PRIMARY_FAILOVER(或任何更高的一致性级别),当选举发生时,会在新选择的主服务器上保存新事务,直到所有积压的事务应用完成。

2.2、单主模式选举算法
1、考虑的第一个因素是哪个或哪些成员运行的MySQL Server版本最低。如果所有组成员都运行MySQL 8.0.17或更高版本,则成员首先按其版本的补丁版本排序。如果任何成员运行的是MySQL Server 5.7或MySQL 8.0.16或更低版本,则成员首先按其版本的主要版本排序,补丁版本将被忽略。

2、如果有多个成员运行最低MySQL Server版本,则考虑的第二个因素是每个成员的成员权重,由成员上的group_replication_member_weight系统变量指定。如果组中的任何成员正在运行MySQL Server 5.7,而该系统变量不可用,则忽略此因素。
group_replication_member_weight系统变量指定了一个0-100范围内的数字。所有成员的默认权重为50,因此将低于此权重的权重设置为降低其排序,将高于此权重的权限设置为增加其排序。您可以使用此权重功能来优先使用更好的硬件,或确保在主服务器的计划维护期间故障转移到特定成员。

3、如果有多个成员运行最低的MySQL Server版本,并且这些成员中有多个具有最高的成员权重(或忽略成员权重),则考虑的第三个因素是每个成员生成的服务器uuid的词典顺序,具有最低词典顺序服务器UUID的成员被选为主节点,其他节点作为从节点。

2.3、查看成员角色
要找出在单主模式下部署时当前哪个服务器是主服务器,请使用performance_schema.replication_group_members表中的MEMBER_ROLE列。例如:
mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------------------+-------------+
| MEMBER_HOST             | MEMBER_ROLE |
+-------------------------+-------------+
| remote1.example.com     | PRIMARY     |
| remote2.example.com     | SECONDARY   |
| remote3.example.com     | SECONDARY   |
+-------------------------+-------------+

或者通过SHOW STATUS LIKE 'group_replication_primary_member'这个状态变量也可以查看主节点,但是这个变量在未来被弃用,所以不建议使用此参数


三、多主模式

3.1、多主模式介绍
在多主模式(group_replication_single_primary_mode=OFF)下,没有成员具有特殊角色,即没有主节点和从节点之分。与其他组成员兼容的任何成员在加入组时都设置为读写模式,可以处理写事务。

组复制是一个最终的一致性系统。这意味着,在写入流量比较低或停止时,所有组成员都有相同的数据内容,但是当写入流量较大时,特别是如果某些成员的写入吞吐量低于其他成员,则可能会产生过时的读取。在多主模式下,速度较慢的成员还可能累积过多的待认证和申请事务,从而导致更大的冲突和认证失败风险。为了限制这些问题,您可以激活和调整组复制的流控制机制,以尽量减少快成员和慢成员之间的差异。有关流量控制的更多信息,请参阅流量控制部分。
从MySQL 8.0.14开始,如果你想为组中的每个事务提供事务一致性保证,你可以使用group_replication_consistance系统变量来实现。有关事务一致性的更多信息,请参阅事务一致性保证部分。

3.2、事务检查
当一个组以多主模式部署时,会检查事务以确保它们与该模式兼容。在多主模式下部署组复制时,会进行以下严格的一致性检查:
  • 如果事务是在SERIALIZABLE隔离级别下执行的,那么它在与组同步时提交失败。
  • 如果一个事务针对具有级联约束的外键的表执行,那么在与组同步时,它的提交将失败。

这些检查由group_replication_enforce_update_everywhere _checks系统变量控制。在多主模式下,系统变量通常应设置为ON,但可以通过将系统变量设置为OFF来停用检查。在单主模式下部署时,系统变量必须设置为OFF。

posted @   有形无形  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示