mgr关键参数-group_replication_consistency

group_replication_consistency
group_replication_consistency是MySQL 8.0.14为解决MGR中一致性读提供的参数,可以在全局或单个事务中进行配置。分为以下5种可选值:
0
官方文档解释:
当组复制正在运行时,可以更改此系统变量的值。group_replication_consistency是一个服务器系统变量,而不是特定于组复制插件的变量,因此不需要重新启动组复制即可使更改生效。更改系统变量的会话值将立即生效,更改全局值将对更改后启动的新会话生效。 更改此系统变量的全局设置需要GROUP_REPLICATION_ADMIN权限
group_replication_consistency控制一个组提供的事务一致性保证。您可以全局配置一致性,也可以按事务配置一致性。group_replication_consistency还配置了新当选的初选在单个初选组中使用的围栏机制。只读(RO)事务和读写(RW)事务都必须考虑变量的影响。以下列表显示了该变量的可能值,按增加事务一致性保证的顺序排列:
EVENTUAL:
RO和RW事务在执行之前都不等待应用前面的事务。这是添加此变量之前组复制的行为。RW事务不等待其他成员应用事务。这意味着事务可以在一个成员上先于其他成员外化。这也意味着,在主故障切换的情况下,新的主可以在之前的主事务全部应用之前接受新的RO和RW事务。 RO事务可能会导致值过期,RW事务可能会因冲突而导致回滚
BEFORE_ON_PRIMARY_FAILOVER:
New RO or RW transactions with a newly elected primary that is applying backlog from the old primary are held (not applied) until any backlog has been applied. This ensures that when a primary failover happens, intentionally or not, clients always see the latest value on the primary. This guarantees consistency, but means that clients must be able to handle the delay in the event that a backlog is being applied. Usually this delay should be minimal, but does depend on the size of the backlog.
新的RO或RW事务与新选择的主事务(该主事务正在应用旧主事务中的囤积)将被保留(不应用),直到应用任何囤积为止。这确保了在发生主故障切换时,无论是否有意,客户端始终可以看到主故障切换的最新值。这保证了一致性,但意味着客户端必须能够在应用囤积的情况下处理延迟。通常这种延迟应该是最小的,但这取决于积压工作的大小。
BEFORE
RW事务在应用之前等待所有先前的事务完成。RO事务在执行之前等待所有先前的事务完成。这确保了该事务仅通过影响事务的延迟来读取最新的值。通过确保同步仅用于RO事务,这减少了每个RW事务上的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
AFTER
RW事务等待,直到其更改已应用于所有其他成员。此值对RO事务没有影响。此模式确保在本地成员上提交事务时,任何后续事务都会读取任何组成员上的写入值或最近的值。将此模式与主要用于RO操作的组一起使用,以确保应用的RW事务在提交后随处应用。您的应用程序可以使用它来确保后续读取获取包括最新写入在内的最新数据。通过确保同步仅用于RW事务,这减少了每个RO事务上的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
BEFORE_AND_AFTER
RW事务等待1)在应用之前完成所有先前的事务,以及2)直到其更改已应用于其他成员。RO事务在执行之前等待所有先前的事务完成。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
个人理解以及一些实验记录:
一、EVENTUAL:
RO和RW事务执行前不会等待先序事务的回放完成,也不会影响后序事务等待该事务回放完成,只需要在超过半数节点冲突检测通过以后即可提交;RW事务不等待其他成员完成应用事务,意味着事务可以在其他成员完成之前提交。这就可能在在主库发生故障转移的情况下,新主数据库可以在先前的主要事务完成全部应用之前就开始接受新的RO和RW事务。RO事务可能导致过时的数据,RW事务可能会因冲突而导致回滚。 性能最好,但是存在安全风险!
1、经测试当group_replication_unreachable_majority_timeout=0时:
当group_replication_consistency=EVENTUAL的时候,所有的slave都正常关闭的时候,是可以继续dml的,但是slave异常关闭的时候,留下的master是不可以继续提供服务的,因为不满足多数派,因为即便是不等待回放完成,但是也需要等待paxos协议认证通过,本地节点才可以提交!
二、BEFORE_ON_PRIMARY_FAILOVER: (建议这个就可以)
在发生切换时,连到新主的事务包括RO和RW事务都会被阻塞,等待先序提交的事务回放完成;这样确保在故障切换时客户端都能读取到主服务器上的最新数据,保证了一致性,但是客户端可能出现延迟等待主库处理完成积压的事务。通常这种延迟应该是较小的,但取决于积压事务的量。 与积压量成正比!
2、经测试当group_replication_unreachable_majority_timeout=0时:
group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER的时候,所有slave都正常关闭的时候,留下的那个primary节点是可以继续提供服务;
但是如果你异常终止slave节点(SECONDARY节点),如下图所示:我直接同时kill -9 所有slave节点的进程,就会变成如下所示状态,此时留下的primary节点无法继续提供服务, 因为不满足多数派!尝试dml将会卡住,默认情况下会一直卡住,并且此时主库read only参数并没有打开!
0
如下所示read only参数没有打开!因为设置 group_replication_unreachable_majority_timeout=0,少数节点永远不退出组!
0
执行dml操作将会卡住:然后看连接状态为:waiting for handler commit
0
同时错误日志提示如下:
2023-07-27T22:55:06.764075+08:00 0 [ERROR] [MY-011495] [Repl] Plugin group_replication reported: 'This server is not able to reach a majority of members in the group. This server will now block all updates. The server will remain blocked until contact with the majority is restored. It is possible to use group_replication_force_members to force a new group membership.'
3、经测试当group_replication_unreachable_majority_timeout=10(非零值)
group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER的时候,所有slave都正常关闭的时候(shutdown的方式关闭),留下的那个primary节点是可以继续提供服务;
但是如果你异常终止slave节点(SECONDARY节点),我直接同时kill -9 所有slave节点的进程,就会变成如下所示状态,此时留下的primary节点无法继续提供服务, 仅剩下的primary节点状态变成了error状态,并且变成read only了;
group_replication_unreachable_majority_timeout+5秒后,剩下的primary节点就变成error了,并且read only!所以不会一直卡下去,超时后事务就会由于read only而报错
0
0
错误日志如下所示:主要过程:
2023-07-29T22:35:25.383899+08:00 0 [ERROR] [MY-011496] [Repl] Plugin group_replication reported: 'This server is not able to reach a majority of members in the group(5秒探测到无法连接大部分节点). This server will now block all updates. The server will remain blocked for the next 10 seconds. Unless contact with the majority is restored, after this time the member will error out and leave the group. It is possible to use group_replication_force_members to force a new group membership.'
2023-07-29T22:35:35.384901+08:00 96 [ERROR] [MY-011711] [Repl] Plugin group_replication reported: 'This member could not reach a majority of the members for more than 10 seconds. The member will now leave the group as instructed(指示) by the group_replication_unreachable_majority_timeout option.'
2023-07-29T22:35:35.385321+08:00 96 [ERROR] [MY-011712] [Repl] Plugin group_replication reported: 'The server was automatically set into read only mode after an error was detected(发现).'
2023-07-29T22:35:35.385617+08:00 96 [System] [MY-011565] [Repl] Plugin group_replication reported: 'Setting super_read_only=ON.'
2023-07-29T22:36:05.385562+08:00 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Timeout while waiting for the group communication engine to exit!'
#等待组通信引擎退出时超时 ,参数 group_replication_components_stop_timeout控制
2023-07-29T22:36:05.385678+08:00 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member has failed to gracefully leave the group.'  #该成员未能正常地离开组
2023-07-29T22:36:05.463319+08:00 0 [System] [MY-011504] [Repl] Plugin group_replication reported: 'Group membership changed: This member has left the group.'
2023-07-29T22:36:05.463751+08:00 98 [System] [MY-013373] [Repl] Plugin group_replication reported: 'Started auto-rejoin procedure attempt 1 of 3'  #尝试自动重连到多数节点的组,参数 group_replication_autorejoin_tries 控制!
2023-07-29T22:36:05.470564+08:00 99 [System] [MY-010597] [Repl] 'CHANGE REPLICATION SOURCE TO FOR CHANNEL 'group_replication_applier' executed'. Previous state source_host='', source_port= 0, source_log_file='', source_log_pos= 1189, source_bind=''. New state source_host='', source_port= 0, source_log_file='', source_log_pos= 4, source_bind=''.
2023-07-29T22:36:05.635528+08:00 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error on opening a connection to peer node 172.16.196.192:33081 when joining a group. My local port is: 33101.'
2023-07-29T22:36:05.635776+08:00 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error on opening a connection to peer node 172.16.196.192:33091 when joining a group. My local port is: 33101.'
2023-07-29T22:37:05.485253+08:00 98 [Warning] [MY-013374] [Repl] Plugin group_replication reported: 'Timeout while waiting for a view change event during the auto-rejoin procedure'
2023-07-29T22:37:05.485405+08:00 98 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member is leaving a group without being on one.'
2023-07-29T22:49:05.573188+08:00 98 [System] [MY-013375] [Repl] Plugin group_replication reported: 'Auto-rejoin procedure attempt 3 of 3 finished. Member was not able to join the group.'   #尝试三次结束;
三、BEFORE:性能约下降10%
RW事务在应用之前等待所有先前的事务完成。RO事务在执行之前等待所有先前的事务完成。这确保了该事务仅通过影响事务的延迟来读取最新的值。通过确保同步仅用于RO事务,这减少了每个RW事务上的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
四、AFTER:性能极差
RW事务等待,直到其更改已应用于所有其他成员。此值对RO事务没有影响。此模式确保在本地成员上提交事务时,任何后续事务都会读取任何组成员上的写入值或最近的值。将此模式与主要用于RO操作的组一起使用,以确保应用的RW事务在提交后随处应用。您的应用程序可以使用它来确保后续读取获取包括最新写入在内的最新数据。通过确保同步仅用于RW事务,这减少了每个RO事务上的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
五、BEFORE_AND_AFTER:性能极差
RW事务等待所有先序的事务在应用之前完成且直到其更改在其它成员上完成应用。RO事务在执行之前等待所有先前的事务完成。这可以保证此事务在最新的数据快照上执行,并且一旦事务完成,所有后续任何不管在哪个成员上执行的事务都会读取包含其更改的数据状态。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证
总结:
注意如下参数设置:
1、group_replication_unreachable_majority_timeout:表示多数派节点不可达超时时间。即网络故障分区后,设置该参数非0值后,少数派节点就会在group_replication_unreachable_majority_timeout+5秒后自动退出,少数状态的成员处理的所有阻塞事务将被回滚,且处于少数状态的成员将转变为ERROR状态。 这个参数在少数派设置起效果!
2、group_replication_member_expel_timeout :标记为UNREACHABLE 状态的节点经过该参数设置的时间阈值后就会被剔除集群(准确的说应该是group_replication_member_expel_timeout*group_replication_autorejoin_tries的时间后就会剔除 ),也就是从集群拓扑中剔除,此时投票基数会减1; 这个参数在 多数节点 设置起效果!
3、group_replication_autorejoin_tries  #指定成员在被开除或在达到group_replification_unreachable_majority_timeout设置之前无法联系到组的大多数成员时,自动重新加入组的尝试次数
4、group_replication_components_stop_timeout  #无法正常执行stop group_replication的超时时间
group_replication_consistency是MySQL 8.0.14为解决MGR中一致性读提供的参数,可以在全局或单个事务中进行配
1)EVENTUAL:确保最终一致性,并不能保证数据实时同步。(MySQL 8.0.14 之前只有这一个选项)
2)BEFORE:确保本地强一致性,并不保证其他节点数据实时同步;
3)AFTER:确保全局强一致性,可以保证所有节点数据实时同步;
4)BEFORE_AND_AFTER:最安全级别别,确保本地强一致性,全局强一致性。结合 BEOFRE 和 AFTER 的特性。
5)BEFORE_ON_PRIMARY_FAILOVER:确保从节点晋升为主节点后的本地一致性;
请使用浏览器的分享功能分享到微信等