分库分表技术方案
2025-07-28 16:44:32 0 举报
分库分表在线动态迁移方案图,分库分表通过双写灰度机制实现历史数据动态迁移,支持基因算法分库分表,历史数据映射表,分布式事务等。
作者其他创作
大纲/内容
分片键解析流程不经过事务
ShardingKeyResolverHandle分片键解析器
从数据源写入经过事务
库3单表结构
需要回滚
根据用户ID确定分表索引
事务模板管理
分片键类型判断
不需要回滚
数据同步
通过交易单号解析业务类型
ConnectionProxy连接代理包装
库3
事务提交阶段
库4
成功
B端业务
OLD_ORDER
售后
解析订单号获取业务类型
是
算法类型
否
执行SQL操作不经过事务
配置为单体库
实时查询
通过交易单号解析用户ID
是否命中灰度?
结果一致性校验
老订单库保留写四个分库写入
事务回滚阶段
异常类型判断
写请求
返回缓存结果
ShardingKeyResolverUtil缓存处理
绑定到ThreadLocal
CustomStandardTableShardingAlgorithmCustomStandardShardingAlgorithm
读写请求
trade_id
跨库聚合查询
是,新数据
老订单库单体数据库
逐个调用connection.commit
商城业务
库2
灰度策略判断
是否库4?
商城
根据业务类型路由到主库
标准分片
库1业务库
是否包含分片键?
否,历史数据
SHARDING_GRAYSCALE策略
ShardingRouteManager指定?
库4分表_1到分表_8
返回结果
SHARDING策略ShardingRouteManager生效
库1
路由到异构库OB不经过事务
订单分片逻辑
执行分片解析
缓存到ThreadLocal
记录错误日志告警处理
操作类型判断
是否写操作?
**业务
CustomComplexTableShardingAlgorithmCustomComplexShardingAlgorithm
异常
指定异构库
配置为分库
遍历所有参与连接
业务请求
经过事务处理
解析订单号获取用户ID
逐个调用connection.rollback
无分片键路由逻辑
ShardingRouteProxyAnnotationInterceptor分库路由拦截器
order_idp_order_idorigin_order_id
一致
复合分片
不一致
双写逻辑经过事务处理
订单号解析
主数据源写入经过事务
一致性检查
生成事务ID
缓存命中?
查询mapping表order_sharding
清理事务上下文
分布式事务入口
自定义分片算法
用户ID % 8 + 1计算分表索引
读操作
四个分库写入
指定具体数据源
SHARDING_GRAYSCALE
未指定
库1单表结构
OceanBase异构库支持复杂分析查询只读,不经过事务
分片键解析流程经过事务处理
事务拦截器
业务类型判断
订单号是否超过阈值?
部分读流量走分库分表逻辑
获取数据源连接
只写如老库
获取user_id和business_type
库2单表结构
order_1order_2...order_8
操作类型
OLD_ORDER策略
灰度路由拦截器
开始事务
写操作
执行结果
是否双写?
ConnectionFactory连接工厂管理
计算最终路由结果
业务类型路由
重新抛出异常
接口配置判断
禁用自动提交
最终数据源路由
不分表,使用主表
根据业务类型确定数据库
查询类型判断
路由到指定数据源
SHARDING
SQL解析和分片键检测
业务逻辑执行
读请求
0 条评论
下一页