1、前言
一般對於業務記錄類隨時間會不斷增加的數據,當數據量增加到一定量(一般認爲整型值爲主的表達到千萬級,字符串爲主的表達到五百萬)的時候,性能將遇到瓶頸,同時調整表結構也會變得非常困難。爲了避免生產遇到這樣的問題,在做系統設計時需要預估可能產生的數據量:預估記錄主體個數預估記錄主體產生的記錄數(e.g.用戶訂單表預估數據量=預估用戶數單用戶產生訂單數),預估達到一定量時,就不得不考慮分庫分表了。
目前國內比較成熟的開源數據庫中間件有sharding-jdbc、mycat,而drds是阿里雲最近推出的商業產品,考慮到大部分公司都在使用阿里雲,做一個全家桶,也是一個不錯的選擇。接下來將對這三款產品的優缺點及適用場景做以介紹。
2、sharding-jdbc
可以看出 sharding-jdbc 作爲一個組件集成在應用內,而mycat則作爲一個獨立的應用需要單獨部署,drds則是阿里雲的一個獨立產品,不過需要結合rds一起使用。
從架構上看 sharding-jdbc 更符合分佈式架構的設計,直連數據庫,沒有中間應用,理論性能是最高的(實際性能需要結合具體的代碼實現,理論性能可以理解爲上限,通過不斷優化代碼實現,逐漸接近理論性能)。
同時缺點也很明顯,由於作爲組件存在,需要集成在應用內,意味着作爲使用方,必須要集成到代碼裏,使得開發成本相對較高;另一方面,由於需要集成在應用內,使得需要針對不同語言(java、C、PHP……)有不同的實現(事實上sharding-jdbc目前只支持java),這樣組件本身的維護成本也會很高。最終將應用場景限定在由java開發的應用這一種場景下。
sharding-jdbc 發展爲 Sharding-Sphere,包含 sharding-jdbc、Sharding-Proxy、Sharding-Sidecar。
- | Sharding-JDBC | Sharding-Proxy | Sharding-Sidecar |
---|---|---|---|
Database | Any | MySQL | MySQL |
Connections Cost | More | Less | More |
Heterogeneous Language | Java Only | Any | Any |
Performance | Low loss | High loss | Low loss |
Centre-less | Yes | No | No |
Static Entry | No | Yes | No |
項目地址:
GitHub: https://github.com/apache/shardingsphere
碼雲: https://gitee.com/Sharding-Sphere/sharding-sphere
3、mycat
mycat 是支持SQL92標準,遵守Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。
作爲對比可以參考上表中的Sharding-Proxy,需要單獨部署,由於遵守Mysql原生協議,應用時不需要特殊處理,和使用MySQL是一樣的,所以應用場景不受限制;但是mycat不支持二維路由,僅支持單庫多表或多庫單表,同時由於自定義連接池,這樣就會存在mycat自身維護一個連接池,MySQL也有一個連接池,任何一個連接池上限都會成爲性能的瓶頸,而mycat的連接池設計也略顯粗暴,當請求鏈接數大於設置連接池上限時直接拋出異常,因此在配置mycat連接池的大小是,需要結合場景做合理設置。
總的來說,mycat以邏輯表的形式屏蔽掉應用處理分庫分表的複雜邏輯,遵守Mysql原生協議,跨語言,跨平臺,有着更爲通用的應用場景。
4、DRDS
DRDS 兼容 MySQL 協議和語法,支持分庫分表、平滑擴容、服務升降配、透明讀寫分離和分佈式事務等特性,具備分佈式數據庫全生命週期的運維管控能力。可以看成 mycat 的商業化產品,也就是mycat所有的優點它都有,而且作爲一個商業化產品使用上更爲簡單透明,功能也更爲豐富;如果不差錢而且正準備對數據做重構,那麼drds是一個不錯的選擇,之所以說準備做數據重構時考慮用drds,是因爲drds不是一個簡單的做 sharding 路由,即使原來使用的是rds,也無法通過drds做路由,唯一的辦法新建drds實例,定義路由規則(drds支持二維路由),導入歷史數據,然後就可以開心的使用drds了。
https://help.aliyun.com/product/29657.html
5、總結
- | sharding-JDBC | mycat | drds |
---|---|---|---|
性能 | 高 | 中 | 高 |
應用場景限制 | java應用 | 無 | 無 |
是否支持自定義sharding路由 | 是 | 是 | 是 |
最大支持sharding路由維度 | 2 | 1 | 2 |
分佈式事務 | 開發中 | 支持弱xa、支持XA分佈式事務(1.6.5) | 支持以下分佈式事務策略:FREE、2PC、XA、FLEXIBLE |
限制 | 不支持子語句,不支持UNION 和 UNION ALL,不支持批量插入,不支持DISTINCT聚合 | 詳見《MYCAT權威指南》——5.6 Mycat 目前存在的限制 | 未明確說明 |
是否開源 | 是 | 是 | 否 |