天天看點

如何保證資料庫叢集時候,主從庫一緻性的問題?

前言:

  資料庫叢集,讀寫分離現在可以說是項目必備的了,但是我們如何保證其每個資料庫的資料一緻性?

 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的資料就繼續讀主庫,否則就讀從庫

繼續閱讀