以下是群組複製的已知限制。請注意,針對多主模式群組描述的限制和問題,在單主模式叢集發生容錯移轉事件期間,當新選出的主要執行個體從舊的主要執行個體清除其套用程式佇列時,也可能適用。
群組複製建立於以 GTID 為基礎的複製之上,因此您也應該注意 第 19.1.3.7 節「使用 GTID 複製的限制」。
--upgrade=MINIMAL
選項。 使用 MINIMAL 選項 (--upgrade=MINIMAL
) 進行 MySQL 伺服器升級後,無法啟動群組複製,因為此選項不會升級複製內部程式相依的系統表格。間隙鎖定。 群組複製的並行交易驗證程序不會將間隙鎖定納入考量,因為關於間隙鎖定的資訊在
InnoDB
之外無法取得。請參閱 間隙鎖定 以取得更多資訊。注意對於多主模式中的群組,除非您在應用程式中依賴
REPEATABLE READ
語意,否則建議您搭配群組複製使用READ COMMITTED
隔離層級。InnoDB 不會在READ COMMITTED
中使用間隙鎖定,這會使 InnoDB 內部的本機衝突偵測與群組複製執行的分散式衝突偵測一致。對於單主模式中的群組,只有主要執行個體會接受寫入,因此READ COMMITTED
隔離層級對群組複製並不重要。表格鎖定與具名鎖定。 驗證程序不會將表格鎖定 (請參閱第 15.3.6 節「LOCK TABLES 和 UNLOCK TABLES 陳述式」) 或具名鎖定 (請參閱
GET_LOCK()
) 納入考量。二進位記錄檔檢查碼。 MySQL 8.4 中的群組複製支援檢查碼,因此群組成員可以使用預設設定
binlog_checksum=CRC32
。binlog_checksum
的設定不一定要對群組的所有成員都相同。當檢查碼可用時,群組複製不會使用檢查碼來驗證
group_replication_applier
通道上的傳入事件,因為事件是從多個來源寫入該轉送記錄檔,並且是在實際寫入來源伺服器的二進位記錄檔之前寫入,這時才會產生檢查碼。檢查碼用於驗證group_replication_recovery
通道和群組成員上任何其他複製通道上的事件完整性。SERIALIZABLE 隔離層級。 預設情況下,多主群組不支援
SERIALIZABLE
隔離層級。將交易隔離層級設定為SERIALIZABLE
會將群組複製設定為拒絕認可交易。並行 DDL 與 DML 操作。 當使用多主模式時,不支援對相同物件執行,但在不同伺服器上的並行資料定義陳述式和資料操作陳述式。在物件上執行資料定義語言 (DDL) 陳述式期間,在相同物件上執行並行的資料操作語言 (DML),但在不同的伺服器執行個體上執行時,會有在不同執行個體上執行的衝突 DDL 未被偵測到的風險。
具有串聯限制的外來索引鍵。 多主模式群組 (所有成員都設定為
group_replication_single_primary_mode=OFF
) 不支援具有多層外來索引鍵相依性的表格,特別是具有已定義CASCADING
外來索引鍵限制的表格。這是因為多主模式群組執行的串聯操作所導致的外來索引鍵限制可能會導致未被偵測到的衝突,並導致群組成員之間的資料不一致。因此,我們建議在多主模式群組中使用的伺服器執行個體上設定group_replication_enforce_update_everywhere_checks=ON
,以避免未偵測到的衝突。在單主模式中,這不是問題,因為它不允許同時寫入群組的多個成員,因此沒有未偵測到衝突的風險。
多主模式的死鎖。當群組以多主模式運作時,
SELECT .. FOR UPDATE
陳述式可能會導致死鎖。這是因為鎖定並未在群組的成員之間共享,因此這類陳述式的預期結果可能無法實現。複寫篩選器。全域複寫篩選器無法用於設定為群組複寫的 MySQL 伺服器實例,因為在某些伺服器上篩選交易會導致群組無法就一致狀態達成共識。通道特定的複寫篩選器可以用於非直接參與群組複寫的複寫通道,例如群組成員也充當群組外部來源的複本時。它們不能用於
group_replication_applier
或group_replication_recovery
通道。加密連線。如果使用 OpenSSL 1.1.1 或更高版本編譯,MySQL 中可以使用 TLSv1.3 協定的支援。群組複寫支援 TLSv1.3,可用於群組通訊連線和分散式復原連線。
group_replication_recovery_tls_version
和group_replication_recovery_tls_ciphersuites
可用於設定客戶端對任何加密套件選擇的支援,包括僅在需要時使用非預設的加密套件。請參閱第 8.3.2 節,「加密連線 TLS 協定和加密方式」。複製操作。群組複寫會啟動和管理分散式復原的複製操作,但設定為支援複製的群組成員也可以參與使用者手動啟動的複製操作。如果操作涉及正在執行群組複寫的群組成員,您可以手動啟動複製操作,前提是複製操作不會移除並取代接收方上的資料。因此,如果正在執行群組複寫,則啟動複製操作的陳述式必須包含
DATA DIRECTORY
子句。請參閱第 20.5.4.2.4 節,「其他用途的複製」。
單一複寫群組中可包含的 MySQL 伺服器最大數量為 9 個。如果其他成員嘗試加入群組,其請求會被拒絕。此限制是透過測試和基準測試識別出的安全界限,在此界限內,群組可以在穩定的區域網路中可靠地執行。
如果單一交易產生的訊息內容過大,導致訊息無法在 5 秒的時間範圍內透過網路在群組成員之間複製,則成員可能會被懷疑為失敗,然後被驅逐,僅僅因為它們忙於處理交易。大型交易也可能因為記憶體配置問題而導致系統速度變慢。為了避免這些問題,請使用以下緩解措施
如果因大型訊息而發生不必要的驅逐,請使用系統變數
group_replication_member_expel_timeout
,以允許在懷疑失敗的成員被驅逐之前有額外的時間。您可以在最初的 5 秒偵測期後,允許最多一小時的時間,然後再將可疑成員從群組中驅逐。預設允許額外 5 秒的時間。在可能的情況下,盡量限制交易的大小,然後再由群組複寫處理。例如,將
LOAD DATA
使用的檔案分割成較小的區塊。使用系統變數
group_replication_transaction_size_limit
來指定群組接受的最大交易大小。預設最大交易大小為 150000000 位元組 (約 143 MB);超過此大小的交易會被回滾,並且不會傳送至群組複寫的群組通訊系統 (GCS) 以分發至群組。請根據群組需要容忍的最大訊息大小來調整此變數的值,請記住,處理交易所需的時間與其大小成正比。使用系統變數
group_replication_compression_threshold
來指定應用壓縮的訊息大小上限。此系統變數預設為 1000000 位元組 (1 MB),因此大型訊息會自動壓縮。當群組複寫的群組通訊系統 (GCS) 收到符合group_replication_transaction_size_limit
設定許可,但超過group_replication_compression_threshold
設定的訊息時,就會執行壓縮。如需更多資訊,請參閱第 20.7.4 節,「訊息壓縮」。使用系統變數
group_replication_communication_max_message_size
來指定訊息被分割的訊息大小上限。此系統變數預設為 10485760 位元組 (10 MiB),因此大型訊息會自動分割。如果壓縮後的訊息仍然超過group_replication_communication_max_message_size
限制,GCS 會在壓縮後執行分割。如需更多資訊,請參閱第 20.7.5 節,「訊息分割」。
最大交易大小、訊息壓縮和訊息分割都可以透過為相關系統變數指定零值來停用。如果您已停用所有這些安全措施,則複寫群組成員的套用程式執行緒可以處理的訊息上限大小是成員的 replica_max_allowed_packet
系統變數的值,該變數的預設值和最大值為 1073741824 位元組 (1 GB)。當接收成員嘗試處理訊息時,如果訊息超過此限制,則會失敗。群組成員可以產生並嘗試傳輸至群組的訊息上限大小為 4294967295 位元組 (約 4 GB)。這是群組複寫 (XCom,Paxos 變體) 的群組通訊引擎接受的封包大小的硬性限制,該引擎會在 GCS 處理訊息後接收訊息。當原始成員嘗試廣播訊息時,如果訊息超過此限制,則會失敗。