如何保證數據庫集群時候,主從庫一致性的問題?


前言:

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

 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的數據就繼續讀主庫,否則就讀從庫
————————————————
版權聲明:本文為CSDN博主「X_Ming_H」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xmh594603296/article/details/82461222


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM