Sharding-Jdbc在3.0後更名爲Shardingsphere它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產品組成。他們均提供標準化的數據分片、分佈式事務和數據庫治理功能,可適用於如Java同構、異構語言、容器、雲原生等各類多樣化的應用場景。mysql
Sharding-Sphere定位爲關係型數據庫中間件,旨在充分合理地在分佈式的場景下利用關係型數據庫的計算和存儲能力,而並不是實現一個全新的關係型數據庫。它經過關注不變,進而抓住事物本質。關係型數據庫當今依然佔有巨大市場,是各個公司核心業務的基石,將來也難於撼動,咱們目前階段更加關注在原有基礎上的增量,而非顛覆。 應用場景: 數據庫讀寫分離 數據庫分表分庫git
相關資料:算法
Sharding-Jdbc官方網址: https://shardingsphere.apache.org/spring
MyCat是一個基於第三方應用中間件數據庫代理框架,客戶端全部的jdbc請求都必需要先交給MyCat,再有MyCat轉發到具體的真實服務器中。sql
Sharding-Jdbc是一個Jar形式,在本地應用層重寫Jdbc原生的方法,實現數據庫分片形式。 MyCat屬於服務器端數據庫中間件,而Sharding-Jdbc是一個本地數據庫中間件框架。數據庫
從設計理念上看確實有必定的類似性。主要流程都是SQL 解析 -> SQL 路由 -> SQL 改寫 -> SQL 執行 -> 結果歸併。但架構設計上是不一樣的。Mycat 是基於 Proxy,它複寫了 MySQL 協議,將 Mycat Server 假裝成一個 MySQL 數據庫,而 Sharding-JDBC 是基於 JDBC 的擴展,是以 jar 包的形式提供輕量級服務的。apache
相似於在微服務中的SpringCloud Ribbon與Nginx區別。springboot
Sharding-Jdbc實現讀寫分離原理,很是容易。只須要在項目中集成主和從的數據源,Sharding-Jdbc自動根據DML和DQL 語句類型鏈接主或者從數據源。服務器
注意: Sharding-Jdbc只是實現鏈接主或者從數據源,不會實現主從複製功能,須要本身配置數據庫自帶主從複製方式。架構
查看MasterSlaveDataSource便可查看該類getDataSource方法獲取當前數據源名稱
DML:數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE 子句組成的查詢塊: SELECT <字段名錶> FROM <表或視圖名> WHERE <查詢條件>
DQL:數據操縱語言DML主要有三種形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 刪除:DELETE
實現讀寫分離原理:
1.須要在配置文件中配置讀寫分離jdbc鏈接所有都交給Sharding-jdbc,配置主數據和從數據庫。主數據庫與從數據庫是經過二進制文件進行數據同步的。
2.Sharding-jdbc 會自動判斷sql 語句類型(DML或者DQL),若是是DML語句的話 會獲取主數據庫的jdbc鏈接配置進行發送請求。若是是DQL語句的話,獲取從數據庫的配置文件進行發送請求。
LogicTable
數據分片的邏輯表,對於水平拆分的數據庫(表),同一類表的總稱。
訂單信息表拆分爲2張表,分別是t_order_0、t_order_1,他們的邏輯表名爲t_order。
ActualTable
在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0、t_order_1。
DataNode
數據分片的最小單元。由數據源名稱和數據表組成,例:test_msg0.t_order_0。配置時默認各個分片數據庫的表結構均相同,直接配置邏輯表和真實表對應關係便可。
ShardingColumn
分片字段。用於將數據庫(表)水平拆分的關鍵字段。SQL中若是無分片字段,將執行全路由,性能較差。Sharding-JDBC支持多分片字段。
ShardingAlgorithm
分片算法。Sharding-JDBC經過分片算法將數據分片,支持經過等號、BETWEEN和IN分片。分片算法目前須要業務方開發者自行實現,可實現的靈活度很是高。將來Sharding-JDBC也將會實現經常使用分片算法,如range,hash和tag等。
SpringBoot整合Sharding-Jdbc分爲兩種方式
第一種爲原生配置方式,本身須要實現接口。 1.分庫算法類須要實現SingleKeyDatabaseShardingAlgorithm<T>接口 2.分表算法類須要實現SingleKeyTableShardingAlgorithm<T>接口
第二種經過配置文件形式配置。 案例好比:t_order 拆分程t_order_0 t_order _1
1.Sharding-JDBC中的路由結果是經過分片字段和分片方法來肯定的,若是查詢條件中有 id 字段的狀況還好,查詢將會落到某個具體的分片。
2.若是查詢沒有分片的字段,會向全部的db或者是表都會查詢一遍,讓後封裝結果級給客戶端。 Sharding-Jdbc和MyCat查詢原理大體相同。
源碼地址:https://gitee.com/MingTian-NiHao/springbootZhengHemysql/tree/dev-sharding-jdbc/