最近學習了阿里資深技術專家李運華的架構設計關于讀寫分離的教程,頗有收獲,總結一下。
1 讀寫分離概述
基本架構圖:
2 適用場景
讀寫分離不是銀彈,并不是一有性能問題就上讀寫分離,而是應該先優化,例如優化慢查詢,調整不合理的業務邏輯,引入緩存查詢等只有確定系統沒有優化空間后才考慮讀寫分離集群。
3 引入的系統復雜度問題
問題一 主從復制延遲
問題二 分配機制
如何將讀寫操作區分開來,然后訪問不同的數據庫服務器?
解決方案1 客戶端程序代碼封裝實現
基本架構圖
業界開源實現
- Sharding-JDBC定位為輕量級JAVA框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。
- 淘寶TDDL淘寶根據自身業務需求研發了 TDDL ( Taobao Distributed Data Layer )框架,主要用于解決 分庫分表場景下的訪問路由(持久層與數據訪問層的配合)以及異構數據庫之間的數據同步 ,它是一個基于集中式配置的 JDBC DataSource 實現,具有分庫分表、 Master/Salve 、動態數據源配置等功能。
解決方案2 服務端中間件封裝
基本架構圖
業界開源實現
- MySQL官方推薦的MySQL Router
MySQL Router是輕量級的中間件,可在應用程序和任何后端MySQL服務器之間提供透明路由。它可以用于各種各樣的用例,例如通過有效地將數據庫流量路由到適當的后端MySQL服務器來提供高可用性和可伸縮性。可插拔架構還使開發人員能夠擴展MySQL Router以用于自定義用例。
基于MySQL Router可以實現讀寫分離,故障自動切換,負載均衡,連接池等功能。
- MySQL官方提供的MySQL Proxy
- 360開源的Atlas
Atlas是由平臺部基礎架構團隊開發維護的一個基于MySQL協議的數據中間層項目。它是在mysql-proxy的基礎上,對其進行了優化,增加了一些新的功能特性。
常見的開源數據庫中間件對比:
功能 |
Sharding-JDBC |
TDDL |
Amoeba |
Cobar |
MyCat |
基于客戶端還是服務端 |
客戶端 |
客戶端 |
服務端 |
服務端 |
服務端 |
分庫分表 |
有 |
有 |
有 |
有 |
有 |
MySQL交互協議 |
JDBC Driver |
JDBC Driver |
前端用NIO,后端用JDBC Driver |
前端用NIO,后端用BIO |
前后端均用NIO |
支持的數據庫 |
任意 |
任意 |
任意 |
MySQL |
任意 |
- TDDL 不同于其它幾款產品,并非獨立的中間件,只能算作中間層,是以 Jar 包方式提供給應用調用。屬于JDBC Shard 的思想,網上也有很多其它類似產品。
- Amoeba 是作為一個真正的獨立中間件提供服務,即應用去連接 Amoeba 操作 MySQL 集群,就像操作單個 MySQL 一樣。從架構中可以看來,Amoeba 算中間件中的早期產品,后端還在使用 JDBC Driver。
- Cobar 是在 Amoeba 基礎上進化的版本,一個顯著變化是把后端 JDBC Driver 改為原生的 MySQL 通信協議層。后端去掉 JDBC Driver 后,意味著不再支持 JDBC 規范,不能支持 Oracle、PostgreSQL 等數據。但使 用原生通信協議代替 JDBC Driver,后端的功能增加了很多想象力,比如主備切換、讀寫分離、異步操作等。
- MyCat 又是在 Cobar 基礎上發展的版本,兩個顯著點是:
(1)后端由 BIO 改為 NIO,并發量有大幅提高;(2)增加了對Order By、Group By、limit 等聚合功能的支持(雖然 Cobar 也可以支持 Order By、Group By、Limit 語法,但是結果沒有進行聚合,只是簡單返回給前端,聚合功能還是需要業務系統自己完成)。