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

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

高效能資料庫叢集的第一種方式是讀寫分離”,其本質是將訪問壓力分散到叢集中的多個節點,但是沒有分散儲存壓力。第二種方式是分庫分表,既可以分散訪問壓力,又可以分散儲存壓力。

基本原理

關於讀寫分離,基本原理是將資料庫讀寫操作分散到不同的節點上,基本實現:

1.資料庫伺服器搭建主從叢集,一主一從、一主多從都可以。

2.資料庫主機負責讀寫操作,從機只負責讀操作。

3.資料庫主機通過複製將資料同步到從機,每臺數據庫伺服器都儲存了所有的業務資料。

4.業務伺服器將寫操作發給資料庫主機,將讀操作發給資料庫從機。

這裡是主從叢集,而不是主備叢集從機可以理解為僕從,僕從是要幫主人幹活的,

從機是需要提供讀資料的功能的;而備機一般被認為僅僅提供備份功能,不提供訪問功能。

讀寫分離本身的實現邏輯並不複雜,但有兩個細節點將引入設計複雜度:主從複製延遲分配機制

主從複製延遲

MySQL為例,主從複製延遲可能達到1秒,如果有大量資料同步,延遲1分鐘也是有可能的。主從複製延遲會帶來一個問題:如果業務伺服器將資料寫入到資料庫主伺服器後立刻進行讀取,此時讀操作訪問的是從機,主機還沒有將資料複製過來,到從機讀取資料是讀不到最新資料的,業務上就可能出現問題。

解決主從複製延遲有幾種常見的方法:

1.寫操作後的讀操作指定發給資料庫主伺服器

例如,註冊賬號完成後,登入時讀取賬號的讀操作也發給資料庫主伺服器。這種方式和業務強繫結,對業務的侵入和影響較大,如果哪個新來的程式設計師不知道這樣寫程式碼,就會導致一個

bug

2.讀從機失敗後再讀一次主機

這就是通常所說的二次讀取,二次讀取和業務無繫結,只需要對底層資料庫訪問的API進行封裝即可,實現代價較小,不足之處在於如果有很多二次讀取,將大大增加主機的讀操作壓力。例如,黑客暴力破解賬號,會導致大量的二次讀取操作,主機可能頂不住讀操作的壓力從而崩潰。

3.關鍵業務讀寫操作全部指向主機,非關鍵業務採用讀寫分離

例如,對於一個使用者管理系統來說,註冊+登入的業務讀寫操作全部訪問主機,使用者的介紹、愛好、等級等業務,可以採用讀寫分離,因為即使使用者改了自己的自我介紹,在查詢時卻看到了自我介紹還是舊的,業務影響與不能登入相比就小很多,還可以忍受。

分配機制

將讀寫操作區分開來,然後訪問不同的資料庫伺服器,一般有兩種方式:程式程式碼封裝中介軟體封裝

1.程式程式碼封裝

程式程式碼封裝指在程式碼中抽象一個數據訪問層(所以有的文章也稱這種方式為中間層封裝”),實現讀寫操作分離和資料庫伺服器連線的管理。

程式程式碼封裝的方式具備幾個特點:

實現簡單,而且可以根據業務做較多定製化的功能。

每個程式語言都需要自己實現一次,無法通用,如果一個業務包含多個程式語言寫的多個子系統,則重複開發的工作量比較大。

故障情況下,如果主從發生切換,則可能需要所有系統都修改配置並重啟。 目前開源的實現方案中,淘寶的TDDL(Taobao Distributed Data Layer )是比較有名的。它是一個通用資料訪問層,所有功能封裝在jar包中提供給業務程式碼呼叫。其基本原理是一個基於集中式配置的 jdbc datasource實現,具有主備、讀寫分離、動態資料庫配置等功能。

2.中介軟體封裝

中介軟體封裝指的是獨立一套系統出來,實現讀寫操作分離和資料庫伺服器連線的管理。中介軟體對業務伺服器提供SQL相容的協議,業務伺服器無須自己進行讀寫分離。對於業務伺服器來說,訪問中介軟體和訪問資料庫沒有區別,事實上在業務伺服器看來,中介軟體就是一個數據庫伺服器。

資料庫中介軟體的方式具備的特點是:

能夠支援多種程式語言,因為資料庫中介軟體對業務伺服器提供的是標準SQL介面。

資料庫中介軟體要支援完整的SQL語法和資料庫伺服器的協議,實現比較複雜,細節特別多,很容易出現bug,需要較長的時間才能穩定。

資料庫中介軟體自己不執行真正的讀寫操作,但所有的資料庫操作請求都要經過中介軟體,中介軟體的效能要求也很高。

資料庫主從切換對業務伺服器無感知,資料庫中介軟體可以探測資料庫伺服器的主從狀態。例如,向某個測試表寫入一條資料,成功的就是主機,失敗的就是從機。

由於資料庫中介軟體的複雜度要比程式程式碼封裝高出一個數量級,一般情況下建議採用程式語言封裝的方式,或者使用成熟的開源資料庫中介軟體。如果是大公司,可以投入人力去實現資料庫中介軟體,因為這個系統一旦做好,接入的業務系統越多,節省的程式開發投入就越多,價值也越大。