ShardingSphere jdbc實現分庫分表核心概念詳解
ShardingSphere
ShardingSphere是一套開源的分佈式數據庫中間件解決方案組成的生態圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產品組成。他們均提供標準化的數據分片、分佈式事務和數據庫治理功能。
Sharding-JDBC
定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。
1)適用於任何基於Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
2)基於任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
3)支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL。
Sharding-JDBC包含的一些核心概念
1)邏輯表-LogicTable
數據分片的邏輯表,對於水平拆分的數據庫(表),同一類表的總稱。例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。
2)實際表-ActualTable
在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0到t_order_9。
3)數據節點-DataNode
數據分片的最小單元。由數據源名稱和數據表組成,例:ds_1.t_order_0。配置時默認各個分片數據庫的表結構均相同,直接配置邏輯表和真實表對應關系即可。如果各數據庫的表結果不同,可使用ds.actual_table配置。
4)動態表-DynamicTable
邏輯表和真實表不一定需要在配置規則中靜態配置。比如按照日期分片的場景,真實表的名稱隨著時間的推移會產生變化。此類需求Sharding-JDBC是支持的,不過目前配置並不友好,會在新版本中提升。
5)綁定表-BindingTable
指在任何場景下分片規則均一致的主表和子表。例:訂單表和訂單項表,均按照訂單ID分片,則此兩張表互為BindingTable關系。BindingTable關系的多表關聯查詢不會出現笛卡爾積關聯,關聯查詢效率將大大提升。
6)分片鍵-ShardingColumn
分片字段。用於將數據庫(表)水平拆分的關鍵字段。例:訂單表訂單ID分片尾數取模分片,則訂單ID為分片字段。SQL中如果無分片字段,將執行全路由,性能較差。Sharding-JDBC支持多分片字段。
7)分片算法-ShardingAlgorithm
分片算法。Sharding-JDBC通過分片算法將數據分片,支持通過等號、BETWEEN和IN分片。分片算法目前需要業務方開發者自行實現,可實現的靈活度非常高。未來Sharding-JDBC也將會實現常用分片算法,如range,hash和tag等。
8)SQL Hint
對於分片字段非SQL決定,而由其他外置條件決定的場景,可使用SQL Hint靈活的註入分片字段。例:內部系統,按照員工登錄ID分庫,而數據庫中並無此字段。SQL Hint支持通過ThreadLocal和SQL註釋(待實現)兩種方式使用。
9)廣播表broadcastTable
所有的分⽚數據源中都存在的表,表結構和表中的數據在每個數據庫中均完全⼀致,例如:數據字典表,公共配置表。
10)分佈式主鍵生成策略
Sharding-JDBC 內部支持UUID和Snowflake生成分佈式主鍵。
分片策略算法
ShardingSphere-JDBC在分片策略上分別引入瞭分片算法、分片策略兩個概念,當然在分片的過程中分片鍵也是一個核心的概念;在此可以簡單的理解分片策略 = 分片算法 + 分片鍵
分片算法
提供瞭抽象分片算法類:ShardingAlgorithm
,根據類型又分為:精確分片算法、區間分片算法、復合分片算法以及Hint分片算法;
- 精確分片算法:對應
PreciseShardingAlgorithm
類,主要用於處理=
和IN
的分片;
public class PreciseDBShardingAlgorithm implements PreciseShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { //todo } }
- 區間分片算法:對應
RangeShardingAlgorithm
類,主要用於處理BETWEEN AND
,>
,<
,>=
,<=
分片;
public class RangeShardingDBAlgorithm implements RangeShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { //todo } }
- 復合分片算法:對應
ComplexKeysShardingAlgorithm
類,用於處理使用多鍵作為分片鍵進行分片的場景;
public class ComplexKeysShardingDBAlgorithm implements ComplexKeysShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { //todo } }
- Hint分片算法:對應
HintShardingAlgorithm
類,用於處理使用Hint
行分片的場景;
public class HintShardingDBAlgorithm implements HintShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { //todo } }
以上所有的算法類都是接口類,具體實現交給開發者自己。
分片策略
分片策略基本和上面的分片算法對應,包括:標準分片策略、復合分片策略、Hint分片策略、內聯分片策略、不分片策略;
- 標準分片策略:對應
StandardShardingStrategy
類,提供PreciseShardingAlgorithm
和RangeShardingAlgorithm
兩個分片算法,PreciseShardingAlgorithm
是必須的,RangeShardingAlgorithm
可選的;
public final class StandardShardingStrategy implements ShardingStrategy { private final String shardingColumn; private final PreciseShardingAlgorithm preciseShardingAlgorithm; private final RangeShardingAlgorithm rangeShardingAlgorithm; }
- 復合分片策略:對應
ComplexShardingStrategy
類,提供ComplexKeysShardingAlgorithm
分片算法;可以發現支持多個分片鍵;
public final class ComplexShardingStrategy implements ShardingStrategy { @Getter private final Collection<String> shardingColumns; private final ComplexKeysShardingAlgorithm shardingAlgorithm; }
- Hint分片策略:對應
HintShardingStrategy
類,通過 Hint 指定分片值而非從 SQL 中提取分片值的方式進行分片的策略;提供HintShardingAlgorithm
分片算法;
public final class HintShardingStrategy implements ShardingStrategy { @Getter private final Collection<String> shardingColumns; private final HintShardingAlgorithm shardingAlgorithm; }
- 內聯分片策略:對應
InlineShardingStrategy
類,沒有提供分片算法,路由規則通過表達式來實現; - 不分片策略:對應
NoneShardingStrategy
類,不分片策略;
分片策略配置類
在使用中我們並沒有直接使用上面的分片策略類,ShardingSphere-JDBC分別提供瞭對應策略的配置類包括:
StandardShardingStrategyConfiguration
ComplexShardingStrategyConfiguration
HintShardingStrategyConfiguration
InlineShardingStrategyConfiguration
NoneShardingStrategyConfiguration
以上就是ShardingSphere jdbc實現分庫分表核心概念詳解的詳細內容,更多關於ShardingSphere jdbc分庫分表的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Sharding-Jdbc 自定義復合分片的實現(分庫分表)
- SpringBoot整合sharding-jdbc實現自定義分庫分表的實踐
- Java ShardingJDBC實戰演練
- Java中ShardingSphere 數據分片的實現
- SpringBoot使用Sharding-JDBC實現數據分片和讀寫分離的方法