讀寫分離需要將讀/寫操作區分開來,然後訪問不同的數據庫服務器;分庫分表需要不同的數據訪問不同的數據庫服務器,兩者本質上都是一種分配機制,將不同的SQL語句發送到不同的數據庫服務器。
常見的分配實現方式有兩種:程序代碼封閉和中間件封閉。
一、程序代碼封裝
程序代碼封裝指的是在代碼中抽象一個數據訪問層來實現讀寫分離、分庫分表。例如,基於Hibernate進行簡單封裝,就可以實現 讀寫分離。
目前開源的實現方案中,淘寶的TDDL(Taobao Distributed Data Layer,外號:頭都大了)是比較有名的。它是一個通用數據訪問層,所有功能封裝在Jar包中供業務代碼調用。其基本原理是一個基於集中式的Jdbc datasource實現,具有主備、讀寫分離、動態數據庫配置等功能。
二、數據庫中間件封裝
中間件封裝指的是獨立一套系統出來,實現讀寫分離和分庫分表操作。
中間件對業務服務器提供SQL兼容的協議,對於 業務服務來說,訪問中間件和訪問數據庫沒有區別,事實上在業務服務器看來,中間件就是一個數據加服務器。
目前的開源數據庫中間件方案中,MySQL官方先是提供了mysql-proxy,後又推出MySQL router。 MySQL Router主要功能有讀寫分離、故障自動切換、負載均衡、連接池等。
奇虎360公司也開源了自己的數據庫中間件Atlas,Atlas是基於MySQL proxy實現的。