Sharding-JDBC 系列专题 - 第八篇:数据治理与高级功能
Sharding-JDBC 系列专题 - 第八篇:数据治理与高级功能
本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第八篇文章,将重点探讨 数据治理(Data Governance) 和 高级功能,包括数据加密、影子表、SQL 审计以及 ShardingSphere 生态中的其他功能。这些功能增强了 Sharding-JDBC 在安全性、可观测性和测试场景中的能力。需要图形化展示的部分将使用 Mermaid 语法绘制图表。
1. 数据治理概述
数据治理是 Apache ShardingSphere 生态的重要组成部分,旨在提供数据安全、质量管理和可观测性等能力。Sharding-JDBC 作为客户端组件,支持多种数据治理功能,与分库分表、读写分离和分布式事务无缝集成。
1.1 数据治理功能
- 数据加密(Encrypt):对敏感数据进行加密存储和查询,保护数据隐私。
- 影子表(Shadow Table):支持生产和测试环境的流量隔离,适合压测和验证。
- SQL 审计(SQL Audit):记录和分析 SQL 执行情况,提升可观测性。
- 数据脱敏:对查询结果动态脱敏,防止敏感信息泄露。
- 分布式主键生成:提供雪花算法等分布式 ID 生成策略。
1.2 适用场景
- 数据安全:金融、医疗等行业需要加密存储敏感数据(如身份证号、银行卡号)。
- 压测隔离:生产环境中进行性能测试,隔离测试流量。
- SQL 监控:分析慢查询、优化数据库性能。
- 分布式系统:确保分布式环境下主键唯一性和一致性。
2. 数据加密(Encrypt)
数据加密功能用于保护数据库中的敏感数据,支持对指定字段加密存储,并在查询时自动解密。
2.1 工作原理
- 加密存储:写入数据库时,Sharding-JDBC 将明文加密为密文。
- 解密查询:查询时,Sharding-JDBC 将密文解密为明文返回。
- SQL 重写:自动重写 SQL,处理加密字段的加解密逻辑。
2.2 配置数据加密
以下是一个 YAML 配置示例,加密 t_user
表的 phone
字段:
dataSources:ds_0:url: jdbc:mysql://localhost:3306/db0?useSSL=falseusername: rootpassword: 123456maxPoolSize: 50encryptRule:tables:t_user:columns:phone:cipherColumn: phone_cipherencryptorName: aes_encryptorencryptors:aes_encryptor:type: AESprops:aes-key-value: 1234567890abcdefprops:sql-show: true
说明:
- encryptRule:
- tables:指定需要加密的表和字段(如
t_user.phone
)。 - cipherColumn:存储密文的列名(如
phone_cipher
)。 - encryptorName:指定加密算法。
- tables:指定需要加密的表和字段(如
- encryptors:
- type: AES:使用 AES 加密算法。
- aes-key-value:AES 密钥,长度需符合算法要求。
- 表结构:
CREATE TABLE t_user (user_id BIGINT PRIMARY KEY,username VARCHAR(50),phone_cipher VARCHAR(100) -- 存储加密后的电话号码
);
2.3 使用示例
插入和查询加密数据:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void createUser(Long userId, String username, String phone) {String sql = "INSERT INTO t_user (user_id, username, phone) VALUES (?, ?, ?)";jdbcTemplate.update(sql, userId, username, phone);}public String getUserPhone(Long userId) {String sql = "SELECT phone FROM t_user WHERE user_id = ?";return jdbcTemplate.queryForObject(sql, String.class, userId);}
}
执行结果:
- 插入:
phone
明文(如13812345678
)加密后存储为密文(如phone_cipher
)。 - 查询:从
phone_cipher
解密后返回明文。
2.4 注意事项
- 性能开销:加解密会增加 CPU 消耗,建议仅加密敏感字段。
- 密钥管理:安全存储 AES 密钥,避免泄露。
- 字段长度:密文长度通常大于明文,确保
cipherColumn
字段长度足够。
3. 影子表(Shadow Table)
影子表用于隔离生产和测试环境的数据库操作,适合压测、验证或 A/B 测试场景。测试流量路由到影子数据库,生产流量保持不变。
3.1 工作原理
- 影子数据库:为每个生产数据库配置一个影子数据库,表结构相同。
- 流量路由:根据影子规则(如 SQL Hint 或特定条件),将测试流量路由到影子数据库。
- 隔离执行:生产和测试数据完全隔离,避免干扰。
3.2 配置影子表
以下配置为 t_order
表启用影子表,测试流量路由到影子数据库:
dataSources:ds_0:url: jdbc:mysql://localhost:3306/db0?useSSL=falseusername: rootpassword: 123456ds_0_shadow:url: jdbc:mysql://localhost:3306/db0_shadow?useSSL=falseusername: rootpassword: 123456shadowRule:enable: truedataSources:shadowDataSource:sourceDataSourceName: ds_0shadowDataSourceName: ds_0_shadowtables:t_order:dataSourceNames