1臼隔、回環(huán)問題的產(chǎn)生
數(shù)據(jù)回環(huán)的產(chǎn)生如上圖所示,數(shù)據(jù)從A實例通過數(shù)據(jù)組件到B實例之后盲泛,又會從B實例回到A實例濒持,從而形成了數(shù)據(jù)同步環(huán)的問題。
2寺滚、解決方案
要解決數(shù)據(jù)回環(huán)的問題柑营,主要的思路就是能給同步組件產(chǎn)生的binlog打標,用來標記binlog是同步組件寫入的村视。binlog的打標通常有兩種方案官套,具體的方案如下:
a、同步數(shù)據(jù)寫到對端時, 同一個事務(wù)帶上一個特定操作,對向鏈路識別這個操作奶赔,決定整個事務(wù)是否同步
同步組件在寫入目標端庫的時候會帶上一個特殊的操作邏輯惋嚎,用來識別是否同步,如果識別到了這種標記就中斷同步
優(yōu)點:通用站刑,什么版本的mysql都支持
缺點:會有一點mysql的binlog冗余
實踐:otther(阿里的開源雙向同步組件)瘸彤,解決雙向同步回環(huán)問題用的就是這種模式。
b笛钝、依賴數(shù)據(jù)庫自身提供的防回環(huán)機制(比如 MySQL GTID),同步工具做相應(yīng)動作
GTID:集群內(nèi)事務(wù)唯一ID质况,GTID=server_uuid:transaction_id
自動GTID生成:
手動設(shè)置GTID:
凡是由同步組件更新的數(shù)據(jù)都會將GTID設(shè)置成源端的GTID,這樣再反向鏈路中就可以通過gtid中的server_id數(shù)據(jù)判斷出是否需要同步了
優(yōu)點:沒有額外的binlog數(shù)據(jù)產(chǎn)生
確定:mysql數(shù)據(jù)庫版本必須要支持gtid
實踐:cloud-canal (商業(yè)版本的同步組件)玻靡,解決雙向同步回環(huán)問題用的就是這種模式结榄。