當在群組複製群組成員之間傳送異常大的訊息時,可能會導致某些群組成員回報為失敗並從群組中驅逐。這是因為群組複製的群組通訊引擎 (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
,在懷疑失敗的成員從群組中驅逐之前,允許額外的時間 (最多一小時)。