以下是 ShardingSphere 5.x 核心概念 速览,旨在帮助你深入理解其分布式数据库治理的架构设计:
一、核心定位
ShardingSphere 5.x 是 分布式数据库生态系统,提供数据分片、分布式事务、读写分离、数据加密、弹性伸缩等能力,包含两大核心组件:
- ShardingSphere-JDBC:轻量级 Java 框架,在应用层直接操作数据库(无中心化代理)。
- ShardingSphere-Proxy:透明化数据库代理,通过数据库协议提供服务(支持多语言)。
二、核心概念详解
1. 逻辑表 (Logic Table)
- 定义:分布式场景下的虚拟表名,映射到多个物理表(如
t_order
逻辑表对应t_order_0
、t_order_1
等物理表)。 - SQL示例:
SELECT * FROM t_order WHERE user_id = 123; -- 逻辑表名
2. 真实表 (Actual Table)
- 定义:物理数据库中真实存在的表(如
t_order_0
、t_order_1
)。 - 动态生成规则:
sharding: tables: t_order: actual-data-nodes: db_${0..1}.t_order_${0..1} # 生成 db0.t_order_0, db0.t_order_1, db1.t_order_0, db1.t_order_1
3. 分片键 (Sharding Key)
- 作用:用于分片的数据库字段(如
user_id
)。 - 关键点:SQL 中必须包含分片键以定位数据位置。
4. 分片算法 (Sharding Algorithm)
-
类型:
算法类型 描述 配置示例 精确分片 基于 =, IN 等查询(如取模) standard: precise-algorithm-class
范围分片 基于 BETWEEN, >, < 等查询 standard: range-algorithm-class
复合分片 多字段组合分片(如 user_id + order_date) complex: algorithm-class
Hint分片 强制指定路由(通过API干预) hint: algorithm-class
-
自定义实现:
public class CustomShardingAlgorithm implements StandardShardingAlgorithm<String> { @Override public String doSharding(Collection<String> targets, PreciseShardingValue<String> shardingValue) { // 根据 shardingValue 计算目标表后缀 return "t_order_" + shardingValue.getValue().hashCode() % 2; } }
5. 分片策略 (Sharding Strategy)
- 组成:
- 分片键定义:指定参与分片的列。
- 分片算法:绑定具体计算逻辑。
- 配置模板:
sharding: tables: t_order: databaseStrategy: standard: shardingColumn: user_id shardingAlgorithmName: database_hash_mod tableStrategy: standard: shardingColumn: order_id shardingAlgorithmName: table_udf_hash
6. 绑定表 (Binding Table)
- 场景:解决跨表 JOIN 的性能问题(如
t_order
与t_order_item
按相同规则分片)。 - 配置:
sharding: bindingTables: - t_order, t_order_item # 绑定后跨表JOIN直接路由,避免笛卡尔积
7. 广播表 (Broadcast Table)
- 用途:全局维度表(如
t_country
),所有分片数据库存有全量数据。 - SQL同步:更新操作在所有节点执行。
- 配置:
sharding: broadcastTables: t_config, t_country
三、分布式事务
- 支持模式:
- XA:强一致性(如 Atomikos、Narayana)
- SAGA:最终一致性(通过补偿机制)
- BASE:柔性事务(Seata AT模式)
- 配置示例:
props: sharding-transaction-type: BASE # 使用Seata AT模式
四、读写分离
- 核心组件:
- 主库:处理写操作
- 从库:处理读操作(支持负载均衡)
- 配置示例:
masterSlave: name: ms_ds masterDataSourceName: master_ds slaveDataSourceNames: - slave_ds_0 - slave_ds_1 loadBalancerName: round_robin # 轮询负载均衡
五、可插拔架构
- 扩展点:
扩展类型 实现示例 分片算法 自定义 StandardShardingAlgorithm 分布式主键 Snowflake, UUID, 自定义生成器 分布式事务 集成 Seata, Narayana 元数据持久化 支持 ZooKeeper, ETCD, Nacos
六、DistSQL(分布式SQL)
- 作用:通过 SQL 动态管理 ShardingSphere 配置(无需重启)。
- 常用命令:
-- 创建分片规则 CREATE SHARDING TABLE RULE t_order ( DATANODES("db_${0..1}.t_order_${0..1}"), DATABASE_STRATEGY(TYPE="standard", SHARDING_COLUMN=user_id, SHARDING_ALGORITHM=database_mod), TABLE_STRATEGY(TYPE="standard", SHARDING_COLUMN=order_id, SHARDING_ALGORITHM=table_mod) ); -- 查询运行中规则 SHOW SHARDING TABLE RULES FROM schema_name;
七、弹性伸缩(Scaling)
- 流程:
- 全量数据迁移
- 增量数据同步(基于 Binlog)
- 一致性校验(使用 CRC32)
- 流量切换(自动切至新分片)
- 特点:在线水平扩容,对业务透明。
八、数据加密
- 流程:
- 敏感字段加密存储(如 AES 加密手机号)
- 查询时自动解密
- 配置:
encrypt: tables: t_user: columns: phone: cipherColumn: phone_cipher # 密文字段 encryptorName: aes_encryptor encryptors: aes_encryptor: type: AES props: aes-key-value: 123456abc
九、系统化架构图
+---------------------+
| Application |
+----------+----------+
|
| JDBC/Proxy Protocol
|
+----------v----------+
| ShardingSphere-Proxy| +--------------+ +-----------+
| (Orchestration) <---->| Config Center|<---->| ZooKeeper |
+----------+----------+ +--------------+ +-----------+
|
| SQL Execution
|
+----------v-------------------+
| ShardingSphere-JDBC (Embed) |
+----------+-------------------+
|
| Database Protocol
|
+----------v----------+
| Physical Database | (分片1/分片2/读写分离)
+---------------------+
最佳实践建议
- 分片键设计:
- 选择高基数字段(如用户ID)
- 避免热点数据(如按时间分片需加盐)
- 事务选择:
- 强一致性:金融场景 → XA
- 高并发:电商订单 → BASE (Seata)
- 弹性伸缩:
- 预留分片空间(如初始分片数为未来2倍)
- 避免频繁扩容(每次迁移有性能损耗)
- SQL兼容性:
- 避免分布式JOIN(优先用绑定表)
- 分页查询需内存归并(深度分页避免
LIMIT 100000,10
)
通过掌握以上核心概念,你可以灵活构建高性能、易扩展的分布式数据库架构。建议结合官方文档的https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/sharding/进行实践验证。