天天看點

Sharding-JDBC簡介主要子產品分片算法使用步驟參考文獻

Sharding-JDBC

簡介

基于關系型資料庫的水準擴充方案有很多開源的解決方案,但成熟穩定的産品鳳毛麟角。

當當自研的資料庫中間層 Sharding-JDBC

在公司内部已廣泛使用,并在開源社群推廣且初見成果。

Sharding-JDBC 采用在

JDBC 協定層擴充分庫分表

,是一個以

jar 形式提供服務的輕量級元件,

其核心思路是小而美地完成最核心的事情。

Sharding-JDBC 是

Client

端級别,MyCAT 是

Server

級别。

Sharding-JDBC 的設計初衷是想提供一個

資料庫中間層

,用于透明的處理分庫分表,而無需業務開發人員在業務代碼中根據分片鍵生成 SQL。

Sharding-JDBC

直接封裝JDBC API

,可以了解為增強版的JDBC驅動,

舊代碼遷移成本幾乎為零

  • 可适用于任何基于java的ORM架構,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 可基于任何第三方的資料庫連接配接池,如:DBCP, C3P0, BoneCP, Druid等。
  • 理論上可支援任意實作JDBC規範的資料庫。雖然目前僅支援MySQL,但已有支援Oracle,SQLServer,DB2等資料庫的計劃。
Sharding-JDBC 的設計初衷是什麼?

第一版的分庫分表并不是現有的 Sharding-JDBC,而是當當的一個内部架構 ddframe 的資料庫子產品,dd-rdb 的其中一項功能就是分庫,沒有分表功能,當時隻是做了簡單的 SQL 解析。後來随着 ddframe 被各個團隊采用,隻分庫的需求漸漸不夠用了,而 dd-rdb 裡面有大量的資料庫 ORM 相關的東西,為了使分庫分表這一核心需求更加純粹,我們才将其中的分片的部分單獨提煉出來并命名為 Sharding-JDBC,用于在 Java 的 JDBC 層面提供一層驅動,無縫的處理這方面的需求。

Sharding-JDBC 适用于哪些場景,不适用于哪些場景

對于關系型

資料庫資料量很大的情況,需要進行水準拆庫和拆表

,這種場景很适合使用 Sharding-JDBC。

舉例說明:假設有一億資料的使用者庫,放在 MySQL 資料庫裡查詢性能會比較低,而采用水準拆庫,将其分為 10 個庫,根據使用者的 ID 模 10,這樣資料就能比較平均的分在 10 個庫中,每個庫隻有 1000w 記錄,查詢性能會大大提升。分片政策類型非常多,大緻分為 Hash + Mod、Range、Tag 等。

Java 的 ORM 架構也都是采用 JDBC 與資料庫互動。這也是我們選擇在 JDBC 層,而非選擇一個 ORM 架構進行開發的原因。我們希望 Sharding-JDBC 可以盡量的相容所有的 Java 資料庫通路層,并且無縫的接入業務應用。

不合适的場景主要是兩方面:

  1. 不适合

    OLAP

    的場景。雖然 Sharding-JDBC 也能做聚合分組查詢,但大量的 OLAP 場景,仍然會比較慢,而且複雜的 SQL(如子查詢等)目前還沒有支援。這種查詢不太适合大資料和高并發的網際網路 online 資料庫,建議使用合理的 OLTP 查詢。
  2. 不适合

    事務強一緻的要求

    。目前 Sharding-JDBC 的事務支援兩種,一種是弱 XA,另一種是柔性事務(BASE)。因為

    XA 的兩階段或三階段送出其性能較低,是以網際網路公司基本不會采用

    。而無論是弱 XA 還是柔性事務,都無法保證事務在任意時間段完全保證一緻,其中柔性事務能保證資料的最終一緻性,但達到最終一緻性的時間仍然不可控。是以對于對跨庫事務強一緻要求很高的場景,需要從設計方面去考慮資料庫 schema 的合理性。
Sharding-JDBC 和其他同類産品有什麼差別?能不能內建到 SparkSQL 或者 Hive?

目前和 Sharding-JDBC 這種

基于 JDBC 層架構類似的

,據我所知隻有

TDDL

,而

TDDL 并未将分庫分表這塊開源

。基于 JDBC 層進行分片的好處是輕量、簡單、相容性好以及無需額外的運維工作。

缺點是無法跨語言,目前僅支援 Java

現在暫時未考慮內建 SparkSQL 或者 Hive。因為 Sharding-JDBC 的定位還是關系型資料庫中間層,為了穩定性的考慮,不會改變資料庫的存儲引擎。未來我們會做基于 Proxy 版本的 Sharding-JDBC-Server,會漸漸的考慮将 Spark 等大資料的查詢方式引入進來。

Sharding-JDBC與Mycat差別

todo

主要子產品

目前Sharding-JDBC共有3個主要子產品,分别為Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar

分片算法

todo

使用步驟

todo

參考文獻

利用Sharding-Jdbc實作分表

sharding-jdbc 分布式資料庫中間件

繼續閱讀