数据加密、读写分离、广播表与绑定表
ShardingSphere 系列 · 第 4/7 篇
上一篇:《ShardingJDBC 分片策略实战》 · 下一篇:《ShardingSphere 内核——解析路由改写执行归并》
开头:分片之外,还有安全、读扩展与多表 join
Course 分片跑通后,生产还会遇到:密码列加密、读写分离、字典广播表、用户与订单绑定表关联。ShardingSphere 在规则层一并解决,应用仍面向逻辑表。


一、数据加密
user 表示例:明文 password,密文 password_cipher。
CREATE TABLE user (
userid VARCHAR(64) PRIMARY KEY,
username VARCHAR(32),
password VARCHAR(64),
password_cipher VARCHAR(64),
...
);在 shardingdb1/2 建 user_1、user_2。
配置要点
- 分片:
userid+ HASH_MOD / INLINE(字符串需hashCode再取模) - 主键:
NANOID或UUID - 加密规则:
spring.shardingsphere.rules.encrypt.tables.user.columns.password.plainColumn=password
spring.shardingsphere.rules.encrypt.tables.user.columns.password.cipherColumn=password_cipher
spring.shardingsphere.rules.encrypt.tables.user.columns.password.encryptorName=user_password_encry
spring.shardingsphere.rules.encrypt.encryptors.user_password_encry.type=SM3
spring.shardingsphere.rules.encrypt.encryptors.user_password_encry.props.sm3-salt=12345678可选 AES、MD5、SM4 等。插入时自动写密文;按 password 查询会转为密文列条件。



二、读写分离
数据层:MySQL 主从或 Canal 等同步;应用层:readwrite-splitting 把写路由主库、读路由从库。
spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=userdb.user
spring.shardingsphere.rules.readwrite-splitting.data-sources.userdb.static-strategy.write-data-source-name=m0
spring.shardingsphere.rules.readwrite-splitting.data-sources.userdb.static-strategy.read-data-source-names[0]=m1
spring.shardingsphere.rules.readwrite-splitting.data-sources.userdb.load-balancer-name=user_lb
spring.shardingsphere.rules.readwrite-splitting.load-balancers.user_lb.type=ROUND_ROBIN负载策略还有:RANDOM、TRANSACTION_ROUND_ROBIN、FIXED_PRIMARY(读也走主)等。

配置完成后:写操作(insert/update/delete)路由到 m0 主库;读操作(select)按 ROUND_ROBIN 轮询 m1 从库。开启 sql-show=true 可在日志里对比 Logic SQL 与 Actual SQL 的数据源名称。
三、广播表
广播表:每个分片库都有相同结构与相同数据(如字典 dict)。配置:
spring.shardingsphere.rules.sharding.tables.dict.actual-data-nodes=m$->{0..1}.dict
spring.shardingsphere.rules.sharding.broadcast-tables=dict插入一条 dict,会写入 m0、m1 的 dict。
广播表适合字典、配置等各分片都需要且数据量小的表。配置 broadcast-tables=dict 后,对 dict 的 insert/update/delete 会自动同步到所有分片库,无需在业务代码里双写。
四、绑定表
绑定表:分片规则一致的表(如 user 与 user_course_info 均按 userid 分表)。配置:
spring.shardingsphere.rules.sharding.binding-tables[0]=user,user_course_info关联 SQL:
SELECT uci.* FROM user_course_info uci, user u WHERE uci.userid = u.userid- 无绑定:4 种表组合 → 笛卡尔式 4 条 SQL
- 有绑定:仅
user_1↔user_course_info_1、user_2↔user_course_info_2两条
无 binding-tables 时,两表各 2 片会产生 2×2=4 条 Actual SQL;配置绑定后 ShardingSphere 知道 user_i 只与 user_course_info_i 关联,SQL 数量减半,避免无效笛卡尔积。


五、分片审计
内置 DML_SHARDING_CONDITIONS:要求对逻辑表的 DML 必须带分片键(可 allow-hint-disable)。可自定义 SPI 扩展审计规则。
spring.shardingsphere.rules.sharding.tables.course.audit-strategy.auditor-names[0]=course_auditor
spring.shardingsphere.rules.sharding.auditors.course_auditor.type=DML_SHARDING_CONDITIONSHint 查询若不带分片键可能触发拦截——团队可用作规范约束。
小结
- Encrypt 对应用透明;RW 解耦读扩展;广播 同步维表;绑定 避免 join 爆炸。
- 配置项多,关键是理解规则类型而非死记 key(见 ss-05 内核)。
- 下一篇:SQL 在 ShardingSphere 内的五段流水线。