当在组复制组成员之间发送异常大的消息时,它可能会导致一些组成员被报告为失败并从组中驱逐出去。这是因为组复制的组通信引擎(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()
获取组当前使用的通信协议版本。如果必要,可以使用 group_replication_set_communication_protocol()
将通信协议版本设置为足够高(8.0.16 或更高)以允许分割。有关更多信息,请参阅 第 20.5.1.4 节,“设置组的通信协议版本”。
如果复制组无法使用分割,因为一些成员不支持它,可以使用系统变量 group_replication_transaction_size_limit
限制组接受的最大事务大小。超过该大小的事务将回滚。您也可以使用 group_replication_member_expel_timeout
允许额外的时间(最多一小时)在成员被怀疑失败之前被驱逐出组。