本節列出和解釋了組複製相關的要求和限制。html
要使用組複製,每一個MySQL節點必須知足如下條件:mysql
組中的每一個成員都必須配置如下選項:sql
--log-bin[=log_file_name]
。MySQL組複製會複製二進制日誌的內容,所以必須開啓二進制日誌。--log-slave-updates
。節點須要記錄applier已應用的日誌。組中的每一個節點都須要記錄它們所接收到並應用的全部事務,這是必須的,由於恢復過程是依賴於組中參與者的二進制日誌來進行的。所以,組中每一個成員都必須保留每一個事務的副本,即便某事務不是在該節點上開始的。--binlog-format=row
。組複製依賴於基於行格式的二進制日誌,以便在組中傳播所發生的更改能保持一致性。並且,在探測組中不一樣節點間發生的併發事務是否衝突時,須要從行格式的日誌中提取一些內容來作比較。--gtid-mode=ON
。組複製使用GTID(全局事務ID)來精確跟蹤每一個節點上已經提交了哪些事務。也所以能夠推斷出某節點上要執行的事務是否和已執行的事務(每一個節點上都有副本)衝突。換句話說,GTID是整個組複製判斷事務是否衝突的基礎。--master-info-repository=TABLE
和--relay-log-info-repository=TABLE
。applier須要將 master 和 relay log 的元數據信息寫入到系統表 mysql.slave_master_info 和 mysql.slave_relay_log_info 中。這保證了組複製插件具備一致性恢復的能力和複製的元數據事務管理能力。--transaction-write-setextraction=XXHASH64
,以便將行寫入到二進制日誌中時,節點也收集寫集。寫集基於每行的主鍵,是惟一標識被更改行的標籤的簡化形式,該標籤後續會用於探測事務衝突性。--slave-parallel-workers=N
(N是applier線程數量)、--slavepreserve-commit-order=1
以及--slave-parallel-type=LOGICAL_CLOCK
。--slaveparallel-workers=N
表示啓用多applier線程,組複製依賴於創建在全部參與節點都以相同順序接收和應用、提交事務的一致性機制,所以還必須設置--slave-preserve-commit-order=1
以保證並行事務的最終提交是和原事務所在順序位置一致的。最後,爲了決定哪些事務能夠並行執行,relay log 必須包含由--slave-parallel-ype=LOGICAL_CLOCK
生成的事務父信息(transaction parent information)。當嘗試加入一個只設置了--slave-parallel-workers
大於0,卻沒有設置其餘兩項的新成員,將會報錯並阻止它的加入。下面是使用組複製已知的限制:網絡
--binlog-checksum=NONE
。Gap Locks:在驗證階段中(certification process),不會考慮 Gap Locks,所以在 InnoDB 的外部沒法獲取任何關於Gap 鎖的信息。多線程
注意:併發
除非你的應用程序或業務需求依賴於REPEATABLE READ(MySQL默認該隔離級別),不然建議在組複製中使用READ COMMITTED隔離級別。在READ COMMITTED隔離級別中,InnoDB基本上不會使用Gap Locks,這將使得InnoDB自帶的衝突探測能和組複製的衝突探測相互對齊從而保持一致。app
group_replication_single_primary_mode=OFF
)不支持多級外鍵依賴,特別是表上定義了級聯的外鍵約束(CASCADING foreign key constraints)。這是由於多主模型下執行外鍵約束的級聯操做可能會出現未檢測到的衝突,從而致使組內成員間數據不一致。所以,咱們推薦在使用多主模型時,在每一個節點上都設置group_replication_enforce_update_everywhere_checks=ON
以免出現未檢測到的衝突。在單主模型下沒有這種問題,由於沒有併發寫操做,從而不可能會出現未被探測到的衝突。LOAD DATA INFILE
的文件切割爲多個小塊。多主模型可能出現死鎖:在多主模型下,SELECT ... FOR UPDATE
語句可能會致使死鎖。這是由於組內成員之間不會共享鎖資源(譯註:share nothing),所以這樣的語句可能達不到預期的結果。性能