高性能數據庫集羣方案:讀寫分離。 其目的在於將訪問壓力分散到集羣中的多個節點,減輕高並發現的訪問壓力,可是沒有分散存儲壓力。redis
讀寫分離的基本架構圖以下:sql
一主對從或者一主一從,主節點負責讀寫操做,從節點負責讀操做。數據庫
主從分離的實現:服務器
一、數據庫搭建主從集羣,一主多從或者一主一從架構
二、主機負責讀寫操做,從機負責讀操做併發
三、主機經過複製將數據同步到從機,從而使每個數據庫都保證數據的一致性高併發
主從同步的具體原理:性能
將主機的數據複製到多個從機(slaves)中,同步過程當中,主機將數據庫的操做寫到二進制日誌(binary log)中,從機打開一個io線程,打開和主機的鏈接,並將主機的更新日誌寫入從機的中繼日誌中,線程
從機開一個sql線程讀取中繼日誌中的數據,進行更新,從而保證數據的主從數據的一致。日誌
咱們在這裏爲了數據庫的高性能引入了主從分離,可是每每在作架構時,會由於提升系統的高性能,高可用等,引入一些操做,會增長系統的複雜度。 主從的實現不是難點,難點在於引入主從後複雜度隨之而來的解決方案。
讀寫分離,增長了主從複製延遲 和分配機制兩個負責度。
一、主從複製延遲
以 MySQL 爲例,主從複製延遲可能達到 1 秒,若是有大量數據同步,延遲 1 分鐘也是有可能的。主從複製延遲會帶來一個問題:業務服務器將數據寫入數據庫主服務器馬上進行讀取,但此時讀操做的的訪問時從機,主機尚未將數據複製到從機,因此此時查詢會有問題。(好比用戶剛進行註冊,可是登陸的時候卻說無此用戶)
有如下幾種解決方案:
一、根據業務來區分,關鍵業務的讀寫所有指向主機,非關鍵業務採用讀寫分離
二、加入redis,將redis中數據的過時時間設置爲主從延遲的時間,當進行訪問時,redis中有數據,則說明主從同步未完成,若redis中無數據則說明主從同步已完成。
二、分配機制
讀寫分離,怎麼實現讀寫分離呢?怎麼知道讀哪一個數據庫呢?通常有兩種方式:程序代碼封裝和中間件封裝。
一、程序代碼的封裝,在代碼中抽象出來數據訪問層,,實現讀寫操做分離和數據庫服務器鏈接的管理