一、遇到的問題
隨着互聯網技術和業務規模的發展,單個db的表里數據越來越多,sql的優化已經作用不明顯或解決不了問題了,這時系統的瓶頸就是單個db了(或單table數據太大)。這時候就涉及到分庫分表的問題了,很多開源解決方案來解決這個問題。比如(排名不分先后):
- 當當網的sharding-jdbc
- 攜程的ctripcorp
- 阿里的Cobar
- 第三方mycat(基於Cobar)
本片主要以sharding-jdbc為例研究下分庫分表的實施方案。
二、sharding-jdbc簡介
- Sharding-JDBC是一個開源的適用於微服務的分布式數據訪問基礎類庫。
- Sharding-JDBC定位為輕量級java框架,使用客戶端直連數據庫,以jar包形式提供服務,未使用中間層,無需額外部署,無其他依賴,DBA也無需改變原有的運維方式,可理解為增強版的JDBC驅動,舊代碼遷移成本幾乎為零。
- Sharding-JDBC完整的實現了分庫分表,讀寫分離和分布式主鍵功能,並初步實現了柔性事務。
- 性能比較,摘錄自官方:
三、解決的問題
1. 分庫分表
- SQL解析功能完善,支持聚合,分組,排序,LIMIT,TOP等查詢,並且支持級聯表以及笛卡爾積的表查詢
- 支持內、外連接查詢
- 分片策略靈活,可支持=,BETWEEN,IN等多維度分片,也可支持多分片鍵共用,以及自定義分片策略
- 基於Hint的強制分庫分表路由
2. 讀寫分離
- 獨立使用讀寫分離支持SQL透傳
- 一主多從的讀寫分離配置,可配合分庫分表使用
- 基於Hint的強制主庫路由
3. 柔性事務
- 最大努力送達型事務
- TCC型事務(TBD)
4. 分布式主鍵
- 統一的分布式基於時間序列的ID生成器
5. 兼容性
- 可適用於任何基於java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
- 可基於任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid等
- 理論上可支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL
6. 靈活多樣的配置
- Java
- YAML
- Inline表達式
- Spring命名空間
- Spring boot starter
7. 分布式治理能力 (2.0新功能)
- 配置集中化與動態化,可支持數據源、表與分片策略的動態切換(2.0.0.M1)
- 客戶端的數據庫治理,數據源失效自動切換(2.0.0.M2)
- 基於Open Tracing協議的APM信息輸出(2.0.0.M3)