1. 程式人生 > >高效能資料庫叢集:讀寫分離

高效能資料庫叢集:讀寫分離

 高效能資料庫叢集方案:讀寫分離。 其目的在於將訪問壓力分散到叢集中的多個節點,減輕高並發現的訪問壓力,但是沒有分散儲存壓力。

 讀寫分離的基本架構圖如下:

    

一主對從或者一主一從,主節點負責讀寫操作,從節點負責讀操作。

主從分離的實現:

  1、資料庫搭建主從叢集,一主多從或者一主一從

  2、主機負責讀寫操作,從機負責讀操作

  3、主機通過複製將資料同步到從機,從而使每一個數據庫都保證資料的一致性

  主從同步的具體原理:

      將主機的資料複製到多個從機(slaves)中,同步過程中,主機將資料庫的操作寫到二進位制日誌(binary log)中,從機開啟一個io執行緒,開啟和主機的連線,並將主機的更新日誌寫入從機的中繼日誌中,

    從機開一個sql執行緒讀取中繼日誌中的資料,進行更新,從而保證資料的主從資料的一致。

我們在這裡為了資料庫的高效能引入了主從分離,但是往往在做架構時,會因為提高系統的高效能,高可用等,引入一些操作,會增加系統的複雜度。 主從的實現不是難點,難點在於引入主從後複雜度隨之而來的解決方案。

讀寫分離,增加了主從複製延遲 和分配機制兩個負責度。

1、主從複製延遲

  以 MySQL 為例,主從複製延遲可能達到 1 秒,如果有大量資料同步,延遲 1 分鐘也是有可能的。主從複製延遲會帶來一個問題:業務伺服器將資料寫入資料庫主伺服器立刻進行讀取,但此時讀操作的的訪問時從機,主機還沒有將資料複製到從機,所以此時查詢會有問題。(比如使用者剛進行註冊,但是登入的時候卻說無此使用者)

  有以下幾種解決方案:

    1、根據業務來區分,關鍵業務的讀寫全部指向主機,非關鍵業務採用讀寫分離

    2、加入redis,將redis中資料的過期時間設定為主從延遲的時間,當進行訪問時,redis中有資料,則說明主從同步未完成,若redis中無資料則說明主從同步已完成。

2、分配機制

  讀寫分離,怎麼實現讀寫分離呢?怎麼知道讀哪個資料庫呢?一般有兩種方式:程式程式碼封裝和中介軟體封裝。

  1、程式程式碼的封裝,在程式碼中抽象出來資料訪問層,,實現讀寫操作分離和資料庫伺服器連線的管理