作者:AnibalPinto 译:徐轶韬
这是有关Group Replication 的一致性选项group_replication_consistency的后续帖子。我们建议您先阅读这个https://mysqlhighavailability.com/group-replication-consistency-levels/了解使用此解决方案的概述。
群组复制集群能够自动检测故障,并调整活动成员的视图,即成员资格配置。此外,如果群组以单主模式部署,则当成员资格更改时,将执行检查以确定群组中是否还有主要成员。如果没有,则应从次要成员列表中选择一个新的。通常,这称为从成员升级。
鉴于系统检测到故障并自动重新配置自身的事实,用户可能还期望一旦发生成员升级,新的主要成员数据处于与之前数据状态完全相同的状态。换句话说,一旦用户能够对新的主要成员进行读取和写入,用户期望没有积压的复制事务需要处理。实际上,用户可能期望一旦他的应用程序故障转移到新的主要成员,即使是临时的,也不会读取旧数据或写入旧数据记录。
现在......当用户激活并正确调整流量控制时,升级之后,暂时从新的主要成员中读取陈旧数据的可能性非常小,因为不应该有事务积压,或者如果有积压则应该很小。此外,某些群组复制用户具有代理/中间件层,用于在升级后管理应用程序对主要成员的访问,并在该级别强制执行一致性标准。
直到MySQL 8.0.14出现之前,没有真正的机制阻止应用程序与处理积压事务的应用程序竞争,从而读取或写入陈旧数据。
主要成员故障转移的一致性保证
从MySQL 8.0.14开始,用户可以在升级后指定新的主要成员行为。有一个名为group_replication_consistency的新选项,它控制新的主要成员,阻止读取和写入,直到完全应用积压的事务或者操作使用MySQL 8.0.14之前的行为。如果该选项设置为BEFORE_ON_PRIMARY_FAILOVER,则激活上述新行为。详细地说,对具有group_replication_consistency ='BEFORE_ON_PRIMARY_FAILOVER'的新主服务器发出事务时,如果服务器仍然在应用复制待办事项(积压)时,这些事务将被阻止,直到完成应用待处理日志。因此可以防止以下异常:
对于只读和读写事务,不会产生过时读取。这可以防止旧主数据库将过时读取外部化到应用程序。
读写事务没有虚假回滚,因为写入事务与仍在等待处理的待办事项中的复制读写事务(积压事务)冲突。
读写事务没有读取偏差,例如:

此查询不会导致冲突,但会写入过时的值。
注意,用户的这个选项,表明他更喜欢一致性而不是可用性。这是用户必须考虑的权衡类型。
如何使用它
要在升级主要成员时,启用保持读取和写入,您需要设置 group_replication_consistency =' BEFORE_ON_PRIMARY_FAILOVER'。默认情况下,该值是EVENTUAL,不会产生任何的读取和写入错误,因为启用了超级只读模式super_read_only 。
group_replication_consistency是一个系统变量,您可以通过常规的Perfomance_Schema,SELECT或SHOW命令检查当前值。
非阻止查询
当group_replication_consistency ='BEFORE_ON_PRIMARY_FAILOVER'时,并非所有读取都被阻止。在发生升级后,用户必须能够在应用时检查服务器。这对于调试,监视,可观察性和故障排除很有用。
基本上,允许执行不修改数据的查询,例如:
SHOW commands
SET option
DO
EMPTY
USE
SELECTing from performance_schema database
SELECTing from table PROCESSLIST on database infoschema
SELECTing from sys database
SELECT command that don’t use tables
SELECT command that don’t execute user defined functions
STOP GROUP_REPLICATION command
SHUTDOWN command
RESET PERSIST
STOP GROUP_REPLICATION命令
SHUTDOWN命令
RESET PERSIST
请注意,事务不能永久保留。如果超过wait_timeout,则返回ER_GR_HOLD_WAIT_TIMEOUT。
为了保证群组不回应过时数据,组中的所有成员都应该在其配置中持久化设置group_replication_consistency =' BEFORE_ON_PRIMARY_FAILOVER',当升级次要成员时,将挂起事务,直到主要成员应用所有积压事务。

结论
Group Replication继续开发,该解决方案可以提高数据一致性的保证。
请试试MySQL 8.0.14上提供的这个新功能并给我们您的反馈!




