邮件碎片
在组复制组成员之间发送异常大的消息时,可能导致某些组成员被报告为失败并从该组驱逐。这是因为组复制的组通信引擎(XCom,一个Paxos变体)使用的单线程占用的消息处理时间太长,因此某些组成员可能会报告接收者失败。从MySQL 8.0.16开始,默认情况下,大型邮件信息会自动拆分为片段,分别发送并由收件人重新组合。
系统变量group_replication_communication_max_message_size
为组复制通信指定最大消息大小,在该最大消息大小之上,消息将被分段。默认的最大邮件大小为10485760字节(10 MiB)。允许的最大值与slave_max_allowed_packet
系统变量的最大值相同,为1073741824字节(1 GB)。的设置group_replication_communication_max_message_size
必须小于该slave_max_allowed_packet
设置,因为应用程序线程无法处理大于的消息片段slave_max_allowed_packet
。要关闭分段,请为指定零值group_replication_communication_max_message_size
。
与大多数其他组复制系统变量一样,您必须重新启动组复制插件才能使更改生效。例如:
STOP GROUP_REPLICATION ;SET GLOBAL group_replication_communication_max_message_size= 5242880;START GROUP_REPLICATION ;
当所有组成员都已接收并重新组合了消息的所有片段时,就认为碎片消息的消息传递已完成。碎片消息的标头中包含信息,这些信息使成员能够在消息传输期间加入,以恢复在加入之前发送的较早的碎片。如果加入成员无法恢复碎片,则将其从组中驱逐出去。
为了使复制组能够使用分段,所有组成员必须位于MySQL 8.0.16或更高版本,并且该组使用的“组复制”通信协议版本必须允许分段。您可以使用group_replication_get_communication_protocol()
UDF 检查组正在使用的通信协议,该 UDF返回该组支持的最旧的MySQL Server版本。MySQL 5.7.14的版本允许压缩消息,而MySQL 8.0.16的版本也允许消息分段。如果所有组成员都位于MySQL 8.0.16或更高版本,并且不需要允许早期版本的成员加入,则可以使用group_replication_set_communication_protocol()
UDF将通信协议版本设置为MySQL 8.0.16或更高版本,以允许分段。有关更多信息,请参见“设置组的通信协议版本”。
如果复制组由于某些成员不支持而无法使用分段,group_replication_transaction_size_limit
则可以使用系统变量来限制该组接受的最大事务大小。在MySQL 8.0中,默认设置约为143 MB。超过此大小的事务将回滚。您还可以使用系统变量group_replication_member_expel_timeout
允许有更多时间(最多一个小时),然后将怀疑是失败的成员从组中驱逐出去。