当 Group Replication 组成员之间发送异常大的消息时,可能会导致部分组成员被报告为失败并被驱逐出组。这是因为 Group Replication 的组通信引擎(XCom,Paxos 的变体)使用的单线程被占用处理消息的时间太长,因此部分组成员可能会报告接收者失败。从 MySQL 8.0.16 开始,默认情况下,大消息会自动拆分为单独发送的片段,并由收件人重新组装。
系统变量
group_replication_communication_max_message_size
指定组复制通信的最大消息大小,超过该大小的消息将被分段。默认最大消息大小为 10485760 字节 (10 MiB)。最大允许值与
replica_max_allowed_packet
和
slave_max_allowed_packet
系统变量的最大值相同,为 1073741824 字节 (1 GB)。的设置
group_replication_communication_max_message_size
必须小于
replica_max_allowed_packet
或
slave_max_allowed_packet
设置,因为应用程序线程无法处理大于最大允许数据包大小的消息片段。要关闭碎片,请为 指定一个零值
group_replication_communication_max_message_size
。
与大多数其他 Group Replication 系统变量一样,您必须重新启动 Group Replication 插件才能使更改生效。例如:
STOP GROUP_REPLICATION;
SET GLOBAL group_replication_communication_max_message_size= 5242880;
START GROUP_REPLICATION;
当消息的所有片段都已被所有组成员接收并重新组装时,片段消息的消息传递被认为是完整的。分段消息在其标头中包含信息,使成员能够在消息传输期间加入以恢复在其加入之前发送的较早片段。如果加入的成员未能恢复碎片,它将自己从该组中驱逐。
一个复制组要使用分片,所有组成员必须是 MySQL 8.0.16 或更高版本,并且该组使用的组复制通信协议版本必须允许分片。您可以使用该函数检查组正在使用的通信协议,该
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
在怀疑失败的成员被驱逐出组之前允许额外的时间(最多一个小时)。