Otter同步原理理解

今年下半年開始,接手了部門內(nèi)otter同步的運維事項。雖然閱讀了github上的wiki文檔,但是對otter的雙向同步原理依然不熟悉。

昨天(2019.12.9)睡覺時,不知道為什么突然靈光一閃,開始理解了otter同步的一些過程。

現(xiàn)在在這里記錄下來,作為備忘。


這里主要分兩部分:雙向同步、雙A同步來講。

這兩個概念在otter的頁面上是通過是否有配置主站點來區(qū)分的。

有配置主站點的話就是雙A同步,否則是雙向同步。

雙A同步會有數(shù)據(jù)回環(huán)的問題,雙向同步不會。

我在維護(hù)otter同步的過程中就有碰到過雙向同步配置成雙A同步,導(dǎo)致某張表更新頻繁的時候,讀取到了中間版本,這個后面會說明。

先記住結(jié)論:如果不是兩地同時寫,配置成雙向同步就已經(jīng)足夠了。


雙向同步

假設(shè)有這樣一個雙向同步A <---> B,兩個pipline:piplineA負(fù)責(zé)將A的數(shù)據(jù)同步到B,piplineB負(fù)責(zé)將B的數(shù)據(jù)同步到A

為了便于說明,我們只假設(shè)只同步一張表version。version表只有兩個字段:id,version,其中id是主鍵。并且表中只有一筆數(shù)據(jù),id=1

A、B兩地的version表,一開始只有一筆數(shù)據(jù)

這個時候,假設(shè)A將version更新為2,那么兩地binlog的變化流程如下:

雙向同步過程中,兩地的binlog變化示意圖

可以看到最后binlog再次恢復(fù)到平靜,兩地數(shù)據(jù)保持一致。

雙A同步

雙A同步如果也只是單純是雙向同步的流程的話,會出現(xiàn)數(shù)據(jù)不一致的情況,考慮下面的流程


雙A同步如果不做額外的處理的話,會出現(xiàn)數(shù)據(jù)不一致的問題

到最后binlog穩(wěn)定下來的時候,出現(xiàn)了數(shù)據(jù)不一致的問題

為此,otter引入主站點的概念,并規(guī)定備站點到主站點的數(shù)據(jù),還需要再一次從主站點回放到備戰(zhàn)點。

因此流程變?yōu)椋?/p>

雙A同步引入主站點的概念,消除了數(shù)據(jù)可能不一致的風(fēng)險

最終我們看到,兩地的數(shù)據(jù)又恢復(fù)了一致

雙A同步的中間版本問題

關(guān)于雙A同步備站點會回放的驗證,可以開啟mysql的sql記錄:

SET GLOBAL general_log = 'ON';

來觀察sql回放過程,這里只做簡單說明。

A、B配置雙A同步,A為備站點。同步表為back,初始數(shù)據(jù)如下:


雙A同步中初始值

1. 在A地連續(xù)執(zhí)行5次更新語句 update back set value=concat(value,'a')

2. 觀察general_log,這5次的變更是否有回放到A地

A地的5次更新sql
B地回放到A地的這5次sql

注意到general_log中有5次回放(截圖只截了4次,太長了),這5次回放是從B->A的。

也就是說,在雙A同步中因為有備站點數(shù)據(jù)回放的關(guān)系,如果在回放還沒完成的時候去查詢備站點,那么就會查詢到中間版本。

所以查詢到中間版本是因為:

1. 查詢的是備站點的數(shù)據(jù)

2. 主站點到備站點的網(wǎng)絡(luò)可能比較慢,導(dǎo)致處理回放的過程比較長,容易讀取到中間版本


以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容