水平拆分的解決方案

分類:技術 時間:2017-01-20

  由於水平拆分牽涉的邏輯比較復雜,當前也有了不少比較成熟的解決方案。這些方案分為兩大類:客戶端架構和代理架構。

客戶端架構

通過修改數據訪問層,如JDBC、Data Source、MyBatis,通過配置來管理多個數據源,直連數據庫,並在模塊內完成數據的分片整合,一般以Jar包的方式呈現。

這是一個客戶端架構的例子:

itread01

可以看到分片的實現是和應用服務器在一起的,通過修改Spring JDBC層來實現

客戶端架構的優點是:

  • 應用直連數據庫,降低外圍系統依賴所帶來的宕機風險

  • 集成成本低,無需額外運維的組件

缺點是:

  • 限於只能在數據庫訪問層上做文章,擴展性一般,對於比較復雜的系統可能會力不從心

  • 將分片邏輯的壓力放在應用服務器上,造成額外風險

代理架構

通過獨立的中間件來統一管理所有數據源和數據分片整合,後端數據庫集群對前端應用程序透明,需要獨立部署和運維代理組件

這是一個代理架構的例子:

itread01

代理組件為了分流和防止單點,一般以集群形式存在,同時可能需要Zookeeper之類的服務組件來管理

代理架構的優點是:

  • 能夠處理非常復雜的需求,不受數據庫訪問層原來實現的限制,擴展性強

  • 對於應用服務器透明且沒有增加任何額外負載

缺點是:

  • 需部署和運維獨立的代理中間件,成本高

  • 應用需經過代理來連接數據庫,網絡上多了一跳,性能有損失且有額外風險

各方案比較
 出品方架構模型支持數據庫分庫分表讀寫分離外部依賴是否開源實現語言支持語言最後更新Github星數
MySQL Fabric MySQL官方 代理架構 MySQL python 無限制 4個月前 35
Cobar 阿裏巴巴 代理架構 MySQL Java 無限制 兩年前 1287
Cobar Client 阿裏巴巴 客戶端架構 MySQL Java Java 三年前 344
TDDL 淘寶 客戶端架構 無限制 Diamond 只開源部分 Java Java 未知 519
Atlas 奇虎360 代理架構 MySQL C 無限制 10個月前 1941
Heisenberg 百度熊照 代理架構 MySQL Java 無限制 2個月前 197
TribeDB 個人 代理架構 MySQL NodeJS 無限制 3個月前 126
ShardingJDBC 當當 客戶端架構 MySQL Java Java 當天 1144
Shark 個人 客戶端架構 MySQL Java Java 兩天前 84
KingShard 個人 代理架構 MySQL Golang 無限制 兩天前 1836
OneProxy 平民軟件 代理架構 MySQL 未知 無限制 未知 未知
MyCat 社區 代理架構 MySQL Java 無限制 兩天前 1270
Vitess Youtube 代理架構 MySQL Golang 無限制 當天 3636
Mixer 個人 代理架構 MySQL Golang 無限制 9個月前 472
JetPants Tumblr 客戶端架構 MySQL Ruby Ruby 10個月前 957
HibernateShard Hibernate 客戶端架構 無限制 Java Java 4年前 57
MybatisShard MakerSoft 客戶端架構 無限制 Java Java 11個月前 119
Gizzard Twitter 代理架構 無限制 Java 無限制 3年前 2087

如此多的方案,如何進行選擇?可以按以下思路來考慮:

  1. 確定是使用代理架構還是客戶端架構。中小型規模或是比較簡單的場景傾向於選擇客戶端架構,復雜場景或大規模系統傾向選擇代理架構

  2. 具體功能是否滿足,比如需要跨節點ORDER BY,那麽支持該功能的優先考慮

  3. 不考慮一年內沒有更新的產品,說明開發停滯,甚至無人維護和技術支持

  4. 最好按大公司->社區->小公司->個人這樣的出品方順序來選擇

  5. 選擇口碑較好的,比如github星數、使用者數量質量和使用者反饋

  6. 開源的優先,往往項目有特殊需求可能需要改動源代碼

按照上述思路,推薦以下選擇:

  • 客戶端架構:ShardingJDBC

  • 代理架構:MyCat或者Atlas


Tags: 水平拆分

文章來源:


ads
ads

相關文章
ads

相關文章

ad