前言:
資料庫叢集,讀寫分離現在可以說是項目必備的了,但是我們如何保證其每個資料庫的資料一緻性?
1 半同步複制
簡單的說就是: 主庫發生增删改操作的時候,會等從庫及時複制了并且通知了主庫, 才會把這個操作叫做成功.
優點:保證資料一緻性
缺點:就是會慢
專業的講:
半同步複制,是等待其中一個從庫也接收到Binlog事務并成功寫入Relay Log之後,才傳回Commit操作成功給用戶端;如此半同步就保證了事務成功送出後至少有兩份日志記錄,一份在主庫Binlog上,另一份在從庫的Relay Log上,進而進一步保證資料完整性;半同步複制很大程度取決于主從網絡RTT(往返時延),以插件 semisync_master/semisync_slave 形式存在。
2 資料庫中間件
如果有了資料庫中間件,所有的資料庫請求都走中間件,這個主從不一緻的問題可以這麼解決:
所有的讀寫請求都走中間件,然後寫的請求路由到主庫,讀的請求路由到從庫
但是我們中間件會記錄寫庫的一個key,在設定一個允許同步時間,假設是1s
當有一個寫請求過來時候,生成一個key A ,馬上路由寫到主庫,然後立馬有一個讀請求過來。 從庫可能是舊資料,或者沒有來得及同步。 如果時間是在1s内的,就對應的key繼續路由到主庫。如果在1s以後的,就路由到從庫。
說白了,中間件就是給個同步時間,給你同步,在同步時間内,所有的請求都落在主庫
3 緩存記錄寫key法
1 将某個庫上的某個key要發生寫操作,記錄在cache裡,并設定“經驗主從同步時間”的cache逾時時間,例如1s
2 修改資料庫
(1)先到cache裡檢視,對應庫的對應key有沒有相關資料
(2)如果cache hit,有相關資料,說明這個key上剛發生過寫操作,此時需要将請求路由到主庫讀最新的資料
(3)如果cache miss,說明這個key上近期沒有發生過寫操作,此時将請求路由到從庫,繼續讀寫分離
方案優點:相對資料庫中間件,成本較低
方案缺點:為了保證“一緻性”,引入了一個cache元件,并且讀寫資料庫時都多了一步cache操作
總結:
就是兩個思路
1 半同步複制 , 等從庫複制成功才傳回寫成功
2 設一個key記錄着一次寫的資料,然後設定一個同步時間,如果在這個時間内,有一個讀請求,看看對應的key有沒有相關資料,有的話,說明資料近期發生過寫事件,這樣key的資料就繼續讀主庫,否則就讀從庫