分库分表实战:ShardingSphere落地指南
ShardingSphere核心组件选择
ShardingSphere提供ShardingSphere-JDBC(轻量级Java驱动)和ShardingSphere-Proxy(透明化数据库代理)两种模式。JDBC适合Java应用直接集成,性能更高;Proxy支持多语言,适合异构系统。根据业务场景选择:高频交易系统推荐JDBC,跨语言环境使用Proxy。
数据分片策略设计
水平分片需明确分片键(如用户ID、订单时间)和分片算法(取模、范围、哈希)。例如订单表按用户ID取模分8库,每个库再按月份分12表。配置示例:
yaml
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds_$->{0..7}.t_order_$->{202301..202312}
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.precise-algorithm-class-name=com.example.HashModAlgorithm
分布式主键生成
内置Snowflake和UUID生成器,建议自定义扩展避免跨机房时钟问题。配置示例:
yaml
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=snowflake
分布式事务管理
BASE模式使用Seata集成,强一致性场景启用XA事务。配置Seata代理数据源:
java
@Bean
public DataSource dataSource() throws SQLException {
return ShardingSphereDataSourceFactory.createDataSource(
dataSourceMap,
Collections.singleton(shardingRuleConfig),
new Properties(),
new SeataATShardingSphereTransactionManager()
);
}
弹性伸缩与数据迁移
使用ShardingSphere-Scaling进行在线扩容。通过增量同步+全量校验实现不停机迁移,执行流程:
- 创建迁移任务配置源库和目标库
- 启动全量数据同步
- 启动增量日志同步
- 校验数据一致性后切换流量
监控与治理
集成Prometheus暴露指标,关键监控项包括:
- 分片SQL执行延迟分布
- 连接池活跃线程数
- 分布式事务成功率
配置示例:
yaml
spring.shardingsphere.metrics.enabled=true
spring.shardingsphere.metrics.prometheus.enabled=true
常见问题解决方案
跨库JOIN :使用绑定表避免笛卡尔积,配置关联表相同分片规则。分页排序 :通过归并引擎内存计算,需控制offset大小。分布式ID冲突:调整Snowflake的workerId分配策略,推荐使用ZK协调。