当在组复制组成员之间发送异常大的消息时,可能会导致某些组成员被报告为失败并被驱逐出组。这是因为组复制的组通信引擎(XCom,一种 Paxos 变体)使用的单线程占用处理消息的时间过长,因此某些组成员可能会将接收方报告为失败。默认情况下,大消息会自动拆分为片段,这些片段会分别发送,并由接收方重新组装。
系统变量 group_replication_communication_max_message_size
为组复制通信指定最大消息大小,超过此大小的消息将被分片。默认的最大消息大小为 10485760 字节(10 MiB)。允许的最大值与 replica_max_allowed_packet
系统变量的最大值(1 GB)相同。group_replication_communication_max_message_size
必须小于 replica_max_allowed_packet
,因为应用线程无法处理大于允许的最大数据包大小的消息片段。要关闭分片,请为 group_replication_communication_max_message_size
指定零值。
与大多数其他组复制系统变量一样,您必须重新启动组复制插件才能使更改生效。例如
STOP GROUP_REPLICATION;
SET GLOBAL group_replication_communication_max_message_size= 5242880;
START GROUP_REPLICATION;
当所有组成员都已收到并重新组装了消息的所有片段时,分片消息的消息传递才算完成。分片消息在其标头中包含信息,使在消息传输期间加入的成员能够恢复在其加入之前发送的早期片段。如果加入的成员无法恢复片段,它将从组中驱逐自己。
组使用的组复制通信协议版本必须允许分片。您可以使用 group_replication_get_communication_protocol()
获取组正在使用的通信协议,该函数返回组支持的最旧 MySQL 服务器版本。如有必要,请使用 group_replication_set_communication_protocol()
将通信协议版本设置得足够高(8.0.16 或更高版本)以允许分片。有关更多信息,请参见 第 20.5.1.4 节,“设置组的通信协议版本”。
如果复制组无法使用分片,因为某些成员不支持它,则可以使用系统变量 group_replication_transaction_size_limit
限制组接受的事务的最大大小。超过此大小的事务将回滚。您还可以使用 group_replication_member_expel_timeout
在将怀疑已失败的成员从组中驱逐之前留出更多时间(最多一个小时)。