# 18.7.5 消息碎片

当 Group Replication 组成员之间发送异常大的消息时,可能会导致某些组成员被报告为失败并被逐出组。这是因为 Group Replication 的组通信引擎(XCom,Paxos 变体)使用的单个线程处理消息的时间过长,因此某些组成员可能会报告接收器失败。从 MySQL 8.0.16 开始,默认情况下,大消息会自动拆分为片段,这些片段分别发送并由收件人重新组装。

系统变量group_replication_communication_max_message_size指定组复制通信的最大消息大小,超过该大小的消息将被分段。默认的最大消息大小为 10485760 字节 (10 MiB)。最大允许值与最大允许值相同replica_max_allowed_pa​​cketslave_max_allowed_pa​​cket系统变量,即 1073741824 字节 (1 GB)。设置为group_replication_communication_max_message_size必须小于replica_max_allowed_pa​​cket要么slave_max_allowed_pa​​cket设置,因为应用程序线程无法处理大于最大允许数据包大小的消息片段。要关闭碎片,请为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 通信协议版本必须允许分片。您可以使用以下命令检查组使用的通信协议group_replication_get_communication_protocol()函数,它返回组支持的最旧的 MySQL 服务器版本。MySQL 5.7.14 的版本允许消息压缩,MySQL 8.0.16 的版本也允许消息的分段。如果所有组成员都在 MySQL 8.0.16 或更高版本,并且不需要允许早期版本的成员加入,您可以使用group_replication_set_communication_protocol()将通信协议版本设置为 MySQL 8.0.16 或更高版本以允许分片的功能。有关详细信息,请参阅第 18.5.1.4 节,“设置组的通信协议版本”.

如果复制组由于某些成员不支持而无法使用分片,则系统变量group_replication_transaction_size_limit可用于限制组接受的事务的最大大小。在 MySQL 8.0 中,默认设置约为 143 MB。超过此大小的事务将回滚。您还可以使用系统变量group_replication_member_expel_timeout在被怀疑失败的成员被逐出小组之前允许额外的时间(最多一个小时)。