方法1:半同步復制
介於異步復制和同步復制之間,主庫在執行完客戶端提交的事務后不會立即返回給客戶端,
而是至少要等到一個從庫接收並寫到redo log中,才會返回給客戶端,相對於異步復制,半同步復制提高了數據的安全性
- 半同步復制原理
事務在主庫寫完binlog后,需要從庫返回一個已接收,才能返回給客戶端
確保事務提交后binlog至少傳輸到一個從庫
不保證從庫應用完這個事務的binlog
優點:利用數據庫原生功能,比較簡單
缺點:主庫的寫請求時延會增長,吞吐量會降低
方法2:數據庫中間件
流程
- 所有的讀寫請求都走數據庫中間件,通常情況下寫請求走主庫,讀請求走從庫
- 記錄所有路由到寫庫的key, 如果在主從同步的窗口內(假設500ms),有讀請求過來了,
此時從庫有可能還是舊的數據,就需要將key上的讀請求路由到主庫訪問 - 在主從同步時間過完后,對應key的讀請求繼續路由到從庫
優點:能保證絕對一致,
缺點:數據庫中間件的成本較高
方法3:緩存記錄寫key法
- 寫請求
- 如果key要發生寫操作,記錄到cache里,設置主從同步的緩存超時時間,比如500ms
- 然后修改主數據庫
- 讀請求
- 先到緩存里查,對應key有沒有相關數據
- 如果有,說明緩存命中,這個key剛剛發生過寫操作,此時需要將請求路由主庫讀取最新的數據
- 如果沒有,說明緩存沒有命中,說明這個key近期沒有發生過寫操作,此時將請求路由到從庫,繼續讀寫分離
優點:相對數據庫中間件,成本較低
缺點:為了保證一致性,引入了cache組件,並且讀寫數據庫時都多了緩存操作