doc: 阅读mysql group replication文档

This commit is contained in:
wu xiangkai
2025-10-17 15:29:13 +08:00
parent d4890cb337
commit 7b360b4d06

View File

@@ -11,6 +11,11 @@
- [Primary Election Algorithm](#primary-election-algorithm) - [Primary Election Algorithm](#primary-election-algorithm)
- [Finding the Primary](#finding-the-primary) - [Finding the Primary](#finding-the-primary)
- [Multi-Primary Mode](#multi-primary-mode) - [Multi-Primary Mode](#multi-primary-mode)
- [Transaction checks](#transaction-checks)
- [Data Definition Statements](#data-definition-statements)
- [Version Compatibility](#version-compatibility)
- [Group Membership](#group-membership)
- [group\_replication\_member\_expel\_timeout](#group_replication_member_expel_timeout)
# Mysql Group Replication # Mysql Group Replication
@@ -181,3 +186,58 @@ group replication是一个最终一致性的系统其代表当incoming traffi
如果想要为group中的每个事务提供一致性保证可以使用`group_replication_consistency`系统变量实现。可以根据group中工作负载和数据读写的优先级来选择合适的设置同时应考虑提升一致性所引入的同步操作对性能带来的影响。可以针对独立的session来设置该系统变量从而保护对并发性敏感的事务。 如果想要为group中的每个事务提供一致性保证可以使用`group_replication_consistency`系统变量实现。可以根据group中工作负载和数据读写的优先级来选择合适的设置同时应考虑提升一致性所引入的同步操作对性能带来的影响。可以针对独立的session来设置该系统变量从而保护对并发性敏感的事务。
##### Transaction checks
当group在multi-primary mode下部署时事务将会被校验确保其和该模式兼容。如下strict consistency checks将会在multi-primary部署模式下被校验
- 如果事务在SERIALIZABLE的隔离级别下被执行那么在`synchronizing itself with the group`指通过原子广播向group发送write set和write values时提交操作将会失败
- 如果事务执行时目标table拥有级联约束那么在`synchronizing itself with the group`时,其提交将会失败
- 如果在MGR中允许级联在不同的members中级联操作影响的行可能有不同这样会影响members中数据的一致性
上述校验通过`group_replication_enforce_update_everywhere_checks`的system variable来进行控制。在multi-primary mode的场景下system variable应该被设置为`ON`但是该校验可以被关闭通过将system variable设置为`OFF`。当在single-primary模式下部署时system variable必须被设置为`OFF`
##### Data Definition Statements
在Group Replication在multi-primary模式下的拓扑中需要额外关注DDL的执行场景。
mysql 8.4支持atomic ddlddl语句的执行要么提交、要么删除类似一个原子的事务。对于DDL语句无论其是否是原子的都会隐式的终止当前session中活跃的事务如同在执行ddl statements之前执行了`COMMIT`。这将代表DDL statements无法在另一事务中执行也无法在`start transaction ... commit`中执行更无法将多个ddl statements整合在一个事务中执行。
Group Replication基于的是乐观的replication范式statements首先会被乐观的执行并且在后续有需要时回滚。每个server在执行statements之前不会先确保在group内达成共识。故而在multi-primary mode下对DDL进行复制需要更加注意。
`如果在执行DDL对schema进行变更时也对同一张表的数据执行了DML变更那么在DDL变更被完成并复制到所有members之前需要确保DML操作在同一个server上被处理。`
如果没有确保上述行为,那么可能会导致数据的不一致性,从而导致操作被中断或被部分完成。
但是当group通过single-primary模式被部署时该问题则不会发生所有修改操作都会被发送到同一server即primary server。
##### Version Compatibility
为了实现最佳兼容性和性能group中的所有members都应当运行在相同的mysql server版本下从而保证相同版本的group replication。在multi-primary mode下该要求将更加重要因为所有加入到group的members都处于read/write模式。如果group中的成员运行了多个mysql版本则存在部分成员和其他成员不兼容的风险不同版本成员之间支持的方法可能有所不同。
为了防范上述问题当新member加入到group时包含之前的member被升级或重启的场景该member将会对group中的其他members进行兼容性检查。
在multi-primary mode下兼容性检查的结果尤为重要。如果新加入member运行的mysql server版本比`当前group中member最小的版本号`更高那么其将以read-only的模式加入到group中。
如果group运行在multi-primary mode下使用了不同的mysql server versionsgroup replication将自动管理memebers的read/write和read-only状态。如果member离开group那么离开后`当前运行最低版本的members`将会自动被设置为read/write模式。
如果将运行在single-primary mode下的group修改为在multi-primary下运行那么可以使用`group_replication_switch_to_multi_primary_mode()`方法group replication将会自动将members设置为正确的模式。并且对于运行的版本比lowest-version高的members其状态将会被自动设置为read-only而运行lowest-version则将会被设置为read/write状态。
### Group Membership
在mysql group replication中多个servers组成了replication group。group拥有UUID形式的名称。group是动态的server可以在任何时刻加入/离开group。在server加入或离开group时group能够对自身进行调整。
如果server加入到group其会自动从现存的server处拉取最新的状态令自身保持最新状态。如果server离开group例如因维护而下线那么剩余的servers将会监测到server已经离开并且自动对group进行reconfigure。
group replication中拥有一个group membership service其定义了哪些servers处于online状态并加入到group。online servers的列表被称为`view`。group中每个server都拥有一致的view能够获知给定时刻哪些servers作为group中的members是活跃的。
group members不仅需要对事务的提交达成一致也需要对当前的view达成一致。如果现有members认同一个新的server应该成为group的一部分那么group将被reconfigure并将该server纳入group这也将触发view的变更。如果server离开group不管是主动还是非预期退出group将会动态调整配置并且触发view的变更。
如果member自愿离开group那么其首先会触发动态的group reconfiguration在此期间所有的members都应该就`new view without the leaving server`达成一致。
但是如果member非预期的退出group例如因网络连接中断而停止运行则非预期退出的member无法发起reconfiguration。在该场景下group replication的failure detection mechanism将会在member离开的短暂时间期间之后检测到该退出行为并且提出`a reconfiguration of the group without the failed member`
当member主动离开group时reconfiguration需要majority of servers达成一致但是如果该group无法达成一致例如因为网络分区导致在线servers数量没有达到majority那么系统将无法动态的更改configuration为了防止split-brain场景系统会处于阻塞状态。对于该种情况需要管理员的干预。
对于member而言下线一小段时间并且在failure detection mechanism探知到该failure前尝试重新加入group是可能的此时group也不会reconfigre并移除该member。在该场景下重新加入group的member将会忘记之前的状态`但是若存在其他members发送给其崩溃前状态的消息`,这将可能会造成数据不一致的问题。
为了检测这种情况MGR会检测相同server的新实例server address和port号相同想要加入到group而server的旧实例也被作为member的场景。那么在这种情况下新实例的加入操作将会被阻塞直到旧实例可以通过reconfiguration被移除。
##### group_replication_member_expel_timeout
通过`group_replication_member_expel_timeout`的system variable引入了一个waiting period允许members该时间内重新连接到group从而避免被从group中驱逐。如果member在该时间范围内重新连接到了group那么该member可以重新在group中处于活跃状态。但是当member超过expel timeout并且从group中被驱逐时或通过`STOP GROUP_REPLICATION`语句停止group replication时或server failure时其必须作为新的实例加入到group中。