一帘瞭、Sharding-JDBC 采用在 JDBC 層擴展分庫分表朱浴,支持讀寫分離,是一個以 jar 形式提供服務的輕量級組件顶捷,其核心思路是小而美地完成最核心的事情,基于 JDBC 層進行分片的好處是輕量屎篱、簡單服赎、兼容性好以及無需額外的運維工作。缺點是無法跨語言交播,目前僅支持 Java
二重虑、Sharding-JDBC 適用于哪些場景,不適用于哪些場景秦士?是否有性能評估缺厉?
(1)適合場景:
對于關系型數(shù)據(jù)庫數(shù)據(jù)量很大的情況,需要進行水平拆庫和拆表(即分庫和分表),這種場景很適合使用 Sharding-JDBC提针。
舉例說明:假設有一億數(shù)據(jù)的用戶庫命爬,放在 MySQL 數(shù)據(jù)庫里查詢性能會比較低,而采用水平拆庫辐脖,將其分為 10 個庫饲宛,根據(jù)用戶的 ID 模10,這樣數(shù)據(jù)就能比較平均的分在 10 個庫中嗜价,每個庫只有 1000w 記錄艇抠,查詢性能會大大提升。分片策略類型非常多久锥,大致分為 Hash +Mod家淤、Range、Tag 等瑟由。
Sharding-JDBC 還提供了讀寫分離的能力絮重,用于減輕寫庫的壓力。
此外错妖,Sharding-JDBC 可以用在 JPA 場景中绿鸣,如?JPA、Hibernate暂氯、Mybatis潮模,Spring JDBC Template 等任何 Java 的 ORM 框架。Java 的 ORM 框架也都是采用 JDBC 與數(shù)據(jù)庫交互痴施。這也是我們選擇在 JDBC 層擎厢,而非選擇一個 ORM 框架進行開發(fā)的原因。我們希望 Sharding-JDBC 可以盡量的兼容所有的 Java 數(shù)據(jù)庫訪問層辣吃,并且無縫的接入業(yè)務應用动遭。
(2)不合適的場景主要是兩方面:
(2.1)不適合 OLAP 的場景。雖然 Sharding-JDBC 也能做聚合分組查詢神得,但大量的 OLAP 場景厘惦,仍然會比較慢,而且復雜的SQL(如子查詢等)目前還沒有支持哩簿。這種查詢不太適合大數(shù)據(jù)和高并發(fā)的互聯(lián)網(wǎng) online 數(shù)據(jù)庫宵蕉,建議使用合理的 OLTP 查詢。
(2.2)不適合事務強一致的要求节榜。目前 Sharding-JDBC 的事務支持兩種羡玛,一種是弱 XA,另一種是柔性事務(BASE)宗苍。因為 XA的兩階段或三階段提交其性能較低稼稿,因此互聯(lián)網(wǎng)公司基本不會采用薄榛。而無論是弱 XA還是柔性事務,都無法保證事務在任意時間段完全保證一致让歼,其中柔性事務能保證數(shù)據(jù)的最終一致性敞恋,但達到最終一致性的時間仍然不可控。因此對于對跨庫事務強一致要求很高的場景是越,需要從設計方面去考慮數(shù)據(jù)庫schema 的合理性耳舅。
對于 JTA 事務,目前 Shariding-JDBC 沒有實現(xiàn) JTA 的標準倚评。而且由于在互聯(lián)網(wǎng)場景下使用 JTA 比較少見浦徊,因此暫時不支持 JTA 事務。
(3)性能測試報告如下:
(3.1)使用Sharding-JDBC天梧,性能是大家最關心的問題盔性。在數(shù)據(jù)量一致的情況下,使用Sharding-JDBC和原生JDBC的性能測試報告如下:
查詢操作:Sharding-JDBC的TPS為JDBC的TPS的99.8%呢岗。
插入操作:Sharding-JDBC的TPS為JDBC的TPS的90.2%冕香。
更新操作:Sharding-JDBC的TPS為JDBC的TPS的93.1%。
可以看到后豫,Sharding-JDBC在查詢中的性能損失非常低悉尾,插入和更新略高。
(3.2)將單表的數(shù)據(jù)拆分為二挫酿,放入兩個表中构眯,使用Sharding-JDBC和原生JDBC的性能測試報告如下:
查詢操作:TPS雙庫比單庫可以增加大約94%的性能。
插入操作:TPS雙庫比單庫可以增加大約60%的性能早龟。
更新操作:TPS雙庫比單庫可以增加大約89%的性能惫霸。
結果表明,Sharding-JDBC可有效利用水平擴展大幅度提升性能葱弟。
三壹店、sharding-jdbc架構圖
四、sharding-jdbc與mycat 相似性以及區(qū)別
從設計理念上看確實有一定的相似性芝加。主要流程都是SQL 解析 -> SQL 路由 -> SQL 改寫 -> SQL 執(zhí)行 -> 結果歸并硅卢。但架構設計上是不同的。Mycat 是基于 Proxy藏杖,它復寫了 MySQL 協(xié)議将塑,將 Mycat Server 偽裝成一個 MySQL 數(shù)據(jù)庫,而 Sharding-JDBC 是基于 JDBC 的擴展制市,是以 jar 包的形式提供輕量級服務的。
五弊予、sharding-jdbc支持讀寫分離
Sharding-JDBC 從 1.3.0 開始支持讀寫分離祥楣。其功能包括:
(5.1)根據(jù)配置區(qū)分寫庫和多個讀庫,目前暫時只有輪訓策略選取讀庫,可以配合分庫分表使用误褪。
(5.2)通過 Hint 強制指定某次查詢走寫庫责鳍。
(5.3)如果在同一線程且同一數(shù)據(jù)庫連接中有發(fā)現(xiàn) DML 語句,則該 DML 之后的查詢都從寫庫查詢兽间,DML 之前的 DQL 語句不受影響历葛,仍然查詢讀庫。其目的是保持同一用戶線程的數(shù)據(jù)一致性嘀略。
但限于 Sharding-JDBC 本身設計的考慮恤溶,數(shù)據(jù)庫層面的主從切換以及主從數(shù)據(jù)同步,Sharding-JDBC并不負責帜羊。Sharding-JDBC 定位仍然是輕量級的增強版數(shù)據(jù)庫驅動咒程。因此由于主庫和從庫同步延遲導致的數(shù)據(jù)不一致,并不是Sharding-JDBC 的處理范疇讼育。
六帐姻、sharding-jdbc 3.0版本:更名為sharding-sphere
Sharding-Sphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC奶段、Sharding-Proxy和Sharding-Sidecar這3款相互獨立的產(chǎn)品組成饥瓷,詳情請參考官網(wǎng)地址:http://shardingsphere.io/document/current/en/quick-start/。
(6.1) Sharding-JDBC
Sharding-JDBC是Sharding-Sphere的第一個產(chǎn)品痹籍,也是Sharding-Sphere的前身呢铆。
它定位為輕量級Java框架,在Java的JDBC層提供分庫分表词裤、讀寫分離刺洒、數(shù)據(jù)庫治理、柔性事務等服務吼砂。它使用客戶端直連數(shù)據(jù)庫逆航,以jar包形式提供服務,無需額外部署和依賴渔肩,可理解為增強版的JDBC驅動因俐,完全兼容JDBC和各種ORM框架。
(6.2) Sharding-Proxy
Sharding-Proxy是Sharding-Sphere的第二個產(chǎn)品周偎。
它定位為透明化的數(shù)據(jù)庫代理端抹剩,提供封裝了數(shù)據(jù)庫二進制協(xié)議的服務端版本,用于完成對異構語言的支持蓉坎。
Sharding-Proxy屏蔽了底層的分庫分表澳眷,您可以像使用一個簡單的數(shù)據(jù)庫一樣來操作分庫分表的數(shù)據(jù)。目前提供MySQL版本蛉艾,它可以使用任何兼容MySQL協(xié)議的訪問客戶端(如:MySQL Command Client, MySQLWorkbench等)來訪問Sharding-Proxy钳踊,進而進行DDL/DML等操作來變更數(shù)據(jù)衷敌,對DBA更加友好。
七拓瞪、目前分庫分表的中間件有兩種思想缴罗,分別是:
(7.1)類似 Sharding-JDBC 及 TDDL 的增強版 JDBC 驅動思想
(7.2)類似 Mycat 增加中間層,然后在中間層進行分庫分表思想
JDBC 驅動版的優(yōu)點:
1祭埂、輕量面氓,范圍更加容易界定,只是 JDBC 增強蛆橡,不包括 HA舌界、事務以及數(shù)據(jù)庫元數(shù)據(jù)管理
2、開發(fā)的工作量較小航罗,無需關注 nio禀横,各個數(shù)據(jù)庫協(xié)議等
3、運維無需改動粥血,無需關注中間件本身的 HA
4柏锄、性能高,JDBC 直連數(shù)據(jù)庫复亏,無需二次轉發(fā)
5趾娃、可支持各種基于 JDBC 協(xié)議的數(shù)據(jù)庫,如:MySQL缔御,Oralce抬闷,SQLServer
Proxy 版的優(yōu)點:
1、可以負責更多的內(nèi)容耕突,將數(shù)據(jù)遷移笤成,分布式事務等納入 Proxy 的范疇
2、更有效的管理數(shù)據(jù)庫的連接
3眷茁、整合大數(shù)據(jù)思路炕泳,將 OLTP 和 OLAP 分離處理
因此兩種方式互相可以互補,建議使用 Java 的團隊上祈,且僅 OLTP 的互聯(lián)網(wǎng)前端操作培遵。有可能會使用多種數(shù)據(jù)庫的情況,可以選擇 JDBC層的中間件登刺;如果需要 OLAP 和 OLTP 混合籽腕,加以重量級的操作,如數(shù)據(jù)遷移纸俭,分布式事務等皇耗,可以考慮 Proxy 層的中間件。
八揍很、項目地址:
GitHub:https://github.com/shardingjdbc/sharding-jdbc
碼云:https://gitee.com/shardingjdbc/sharding-jdbc