MySQL 強同步復(fù)制是指多個 MySQL 數(shù)據(jù)庫之間進(jìn)行同步復(fù)制時,保證數(shù)據(jù)的強一致性,即只有數(shù)據(jù)完全一致才能被視為同步完成。
在 MySQL 強同步復(fù)制中,使用了兩個關(guān)鍵技術(shù):二進(jìn)制日志(binlog)和 GTID(Global Transaction ID)。
// 配置 GTID gtid_mode=ON enforce_gtid_consistency=ON // 配置 binlog log-bin=mysql-bin binlog-format=ROW sync-binlog=1 // 配置主從關(guān)系 server-id=1 // 主庫 log-slave-updates=1 // 從庫記錄 binlog replicate-do-db=test // 從庫復(fù)制的數(shù)據(jù)庫 // 配置復(fù)制賬號 create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%';
通過以上代碼可以看出,MySQL 強同步復(fù)制需要先設(shè)置 GTID 模式,可以避免出現(xiàn)不一致的情況。同時,使用 ROW 格式的 binlog 可以記錄每一行數(shù)據(jù)的修改,而不是整個語句。將從庫設(shè)為 log-slave-updates,可以讓從庫將 binlog 記錄到自己的 binlog 中,這樣在從庫上執(zhí)行的事務(wù)也可以被記錄并同步到主庫。設(shè)置復(fù)制賬號可以讓從庫通過網(wǎng)絡(luò)連接到主庫并復(fù)制數(shù)據(jù)。
通過以上步驟,當(dāng)主庫執(zhí)行一個事務(wù)時,會生成一個唯一的 GTID,并將這個 GTID 和 binlog 記錄下來。當(dāng)從庫要復(fù)制這個事務(wù)時,會通過 binlog 查找對應(yīng)的 GTID,然后執(zhí)行對應(yīng)的事務(wù),保證數(shù)據(jù)的一致性。
總體來說,MySQL 強同步復(fù)制的實現(xiàn)較為復(fù)雜,但可以保證數(shù)據(jù)的強一致性,有效避免了多個數(shù)據(jù)庫之間數(shù)據(jù)不一致的問題。