sharding jdbc 概述
官网:https://shardingsphere.apache.org/
*********************************************************
简 介
基本特性:sharding jdbc定位为轻量级的java框架,以jar包形式提供服务,不需要额外部署,可理解为增强版的jdbc,完全兼容jdbc和各种orm框架,提供分库分表、读写分离、分布式事务、动态配置等功能
兼容各种orm框架,如:jpa、mybatis、jdbcTemplate等
使用任何三方数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等
支持多种数据库,目前支持MySQL,Oracle,SQLServer和PostgreSQL
***************************************************
分库分表
垂直分片:将表按业务类型划分,分散存储在多个数据库中,分摊单个数据库的压力,如果单表的数据量很大,还需结合水评分表将表中的数据进行拆分
水平分片:将表中的数据按照表的一个或多个字段进行拆分,每个分片仅有原来表的部分数据
分库分表不可避免引来跨库事务,在实际处理中,应尽量使用同库不同表,用本地事务; 在不可避免的跨库和高并发场景中,可使用最终一致性的柔性事务确保业务的一致性(sharding jdbc提供了分布式事务功能saga、seata)
相关概念
逻辑表:未拆分前的数据表的名称
真实表:拆分后实际存储数据的表,如原表user为逻辑表,user_0,user_1等就为真实表
数据节点:真实的数据库名称+表的名称,如ds_0.user_0
绑定表:按照相同字段进行拆分的两张表,如order、order_item都使用同一order_id进行拆分,则order、order_item就为绑定表
分片键:拆分表的字段,如user根据id拆分,则id就为user标的分片键
分片算法:支持= 、between、in分片,根据业务场景,使用相关接口自行实现
精确分片算法:PreciseShardingAlgorithm,使用一个字段进行分片,支持=、in
范围分片算法:RangeShardingAlgorithm,使用一个字段进行分片键,支持between
复合分片算法:使用多个字段进行分片
hint分片算法:强制路由分片,需配合HintShardingStrategy使用
分片策略:分片键+分片算法
标准分片策略:提供PreciseShardingAlgorithm、RangeShardingAlgorithm两种算法,处理sql与语句中的=、in、between and,
PreciseShardingAlgorithm必选,用于处理=、in,RangeShardingAlgorithm可选,如不设置,处理between and时使用全表路由
复合分片策略:使用多分片建处理=、in、between and
行表达式分片策略:用Grooy表达式,直接在配置文件中进行分片配置,支持单分片对=、in进行处理
Hint分片策略:强制路由分片
不分片策略:不对数据库、表进行分片处理
数据库分片策略:DatabaseShardingStrategy,对数据库进行分片
表分片策略:TableShardingStrategy,对表进行分片
行表达式:$->{。。。。}
$->{1..3}:表示范围区间
$->{[a,b,c]}:表示枚举值
示例:ds$->{id%2}.user$->{id%2}表示ds0.user0,ds1.user0,ds1.user0,ds1.user1
***************************************************
读写分离:分散单台数据库的读压力
主库:插入、更新、删除使用主库,目前单独使用只支持单主库,可配合分库分表使用
从库:提供读服务,由于主从同步有一定的延时,会存在短暂的数据不一致
****************************************************
分布式事务
XA事务:两阶段事务,强一致性协议,无法满足高并发场景
saga柔性事务:将一个事务看成多个本地事务的组合,发生异常时,可选择向前重试,或者向后回滚
seata柔性事务:
TC(事务协调器):负责协调各事务的运行状态,需单独部署
TM(事务管理器):与TC建立长连接,负责事务的创建,并根据TC反馈的各分支事务的执行状态提交或者回滚全局事务
RM(全局事务参与者):与TC建立长连接,负责向TC汇报本地事务的执行状态,根据TC反馈信息提交或者回滚本地事务