ShardingSphere-JDBC 数据分片 YAML 配置详解
shardingsphere 项目地址: https://gitcode.com/gh_mirrors/shard/shardingsphere
什么是数据分片
数据分片是将大型数据库中的数据分散到多个物理节点上的技术方案。通过水平拆分的方式,可以有效解决单机数据库在数据量增长时面临的性能瓶颈问题。ShardingSphere-JDBC 作为一款轻量级的 Java 框架,提供了强大的数据分片能力,能够透明化地处理分库分表操作,使开发者无需关心底层数据分布细节。
YAML 配置的优势
YAML 作为一种人类友好的数据序列化语言,在配置数据分片规则时具有显著优势:
- 结构清晰:通过缩进层级直观展示配置项之间的关系
- 可读性强:比传统 XML 或 properties 文件更易于理解和维护
- 开发高效:减少样板代码,自动完成数据源创建过程
- 版本友好:便于纳入版本控制系统进行管理
核心配置项解析
1. 表分片规则配置
表分片规则是配置中最核心的部分,主要包含以下元素:
tables:
t_order: # 逻辑表名
actualDataNodes: ds_${0..1}.t_order_${0..1} # 实际数据节点
databaseStrategy: # 分库策略
standard:
shardingColumn: user_id
shardingAlgorithmName: db_sharding_algo
tableStrategy: # 分表策略
standard:
shardingColumn: order_id
shardingAlgorithmName: table_sharding_algo
- actualDataNodes:定义实际数据节点,格式为
数据源名.表名
,支持行表达式语法 - 分库/分表策略:支持标准分片、复合分片、Hint分片和不分片四种策略
2. 自动分片表配置
对于无需显式指定分片规则的表,可以使用自动分片配置:
autoTables:
t_order_auto:
actualDataSources: ds_0,ds_1
shardingStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: auto_table_sharding_algo
3. 绑定表配置
绑定表指具有相同分片规则的主表和子表,配置后可以优化关联查询:
bindingTables:
- t_order,t_order_item
4. 默认策略配置
为未单独配置的表提供默认分片策略:
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: default_db_sharding
defaultTableStrategy:
none:
5. 算法配置
ShardingSphere 支持多种分片算法:
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
auditors:
sharding_key_required_auditor:
type: DML_SHARDING_CONDITIONS
实际配置示例解析
下面我们通过一个典型配置示例来理解各配置项的实际应用:
dataSources:
ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0
username: root
password:
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_inline
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- t_order,t_order_item
shardingAlgorithms:
t_order_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
这个配置实现了:
- 定义了两个数据源 ds_0 和 ds_1
- 对 t_order 表进行分表,根据 order_id 取模分配到 t_order_0 和 t_order_1
- 使用雪花算法生成 order_id
- 将 t_order 和 t_order_item 设为绑定表关系
最佳实践建议
- 命名规范:为分片算法和序列生成器使用有意义的名称
- 分片键选择:选择分布均匀的列作为分片键,避免数据倾斜
- 绑定表优化:对关联查询频繁的表配置绑定关系
- 算法测试:上线前充分测试分片算法是否符合预期
- 监控配置:配合 ShardingSphere 的监控功能观察分片效果
常见问题处理
- 分片键缺失:通过配置审计策略可以强制要求 SQL 中包含分片键
- 跨库查询:尽量避免多表关联查询,或使用绑定表优化
- 分布式事务:对于跨分片的写操作,考虑使用分布式事务解决方案
- 数据迁移:扩容时可以使用 ShardingSphere 的数据迁移工具
通过合理配置 YAML 文件,开发者可以轻松实现复杂的数据分片需求,而 ShardingSphere-JDBC 会自动处理底层路由和结果归并等复杂逻辑,大大降低了分库分表的实施难度。
shardingsphere 项目地址: https://gitcode.com/gh_mirrors/shard/shardingsphere
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考