当在组复制组成员之间发送异常大的消息时,可能会导致某些组成员被报告为失败并从组中驱逐。这是因为组复制的组通信引擎(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
在将怀疑已失败的成员从组中驱逐之前留出更多时间(最多一小时)。