由於水平拆分牽涉的邏輯比較復雜,當前也有了不少比較成熟的解決方案。這些方案分為兩大類:客戶端架構和代理架構。
客戶端架構
通過修改數據訪問層,如JDBC、Data Source、MyBatis,通過配置來管理多個數據源,直連數據庫,並在模塊內完成數據的分片整合,一般以Jar包的方式呈現。
這是一個客戶端架構的例子:
可以看到分片的實現是和應用服務器在一起的,通過修改Spring JDBC層來實現
客戶端架構的優點是:
-
應用直連數據庫,降低外圍系統依賴所帶來的宕機風險
-
集成成本低,無需額外運維的組件
缺點是:
-
限於只能在數據庫訪問層上做文章,擴展性一般,對於比較復雜的系統可能會力不從心
-
將分片邏輯的壓力放在應用服務器上,造成額外風險
代理架構
通過獨立的中間件來統一管理所有數據源和數據分片整合,後端數據庫集群對前端應用程序透明,需要獨立部署和運維代理組件
這是一個代理架構的例子:
代理組件為了分流和防止單點,一般以集群形式存在,同時可能需要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 | 代理架構 | 無限制 | 有 | 有 | 無 | 無 | 是 | Java | 無限制 | 3年前 | 2087 |
如此多的方案,如何進行選擇?可以按以下思路來考慮:
-
確定是使用代理架構還是客戶端架構。中小型規模或是比較簡單的場景傾向於選擇客戶端架構,復雜場景或大規模系統傾向選擇代理架構
-
具體功能是否滿足,比如需要跨節點
ORDER BY
,那麽支持該功能的優先考慮 -
不考慮一年內沒有更新的產品,說明開發停滯,甚至無人維護和技術支持
-
最好按大公司->社區->小公司->個人這樣的出品方順序來選擇
-
選擇口碑較好的,比如github星數、使用者數量質量和使用者反饋
-
開源的優先,往往項目有特殊需求可能需要改動源代碼
按照上述思路,推薦以下選擇:
-
客戶端架構:ShardingJDBC
-
代理架構:MyCat或者Atlas
Tags: 水平拆分
文章來源: