深入理解ShardingProxy:服务端分库分表完全指南
一、ShardingProxy vs ShardingJDBC:如何选择?
架构对比
客户端方案:应用 → ShardingJDBC → 多数据库 服务端方案:应用 → ShardingProxy → 多数据库
ShardingProxy的核心优势
| 优势 | 说明 | 适用场景 |
|---|---|---|
| ORM框架友好 | 透明代理,ORM无需感知分库分表 | 使用MyBatis、Hibernate等ORM框架的项目 |
| DBA友好 | DBA直接操作真实数据库,无学习成本 | 需要DBA独立管理数据库的场景 |
| 无侵入性 | 业务代码零修改,配置外置管理 | 已有系统改造,避免代码侵入 |
| 统一治理 | 多数据源集中管理、监控、审计 | 微服务架构,需要统一数据治理 |
| 分布式事务 | 内置XA事务支持,简化分布式事务处理 | 需要强一致性的金融、交易场景 |
关键洞察:ShardingProxy不是替代ShardingJDBC,而是互补。两者可结合使用,构建混合架构。
二、ShardingProxy快速入门
1. 下载与部署
# 下载发布包(以5.2.1为例) wget https://archive.apache.org/dist/shardingsphere/5.2.1/apache-shardingsphere-5.2.1-shardingsphere-proxy-bin.tar.gz # 解压 tar -zxvf apache-shardingsphere-5.2.1-shardingsphere-proxy-bin.tar.gz cd apache-shardingsphere-5.2.1-shardingsphere-proxy-bin
目录结构:
├── bin/ # 启动脚本 ├── conf/ # 配置文件 ├── lib/ # 依赖库 ├── licenses/ # 许可证 └── README.txt
2. 添加MySQL驱动
ShardingProxy默认只包含PostgreSQL驱动,连接MySQL需要手动添加:
# 将mysql-connector-java-8.0.20.jar复制到lib目录 cp mysql-connector-java-8.0.20.jar lib/
3. 基础配置
server.yaml(服务配置)
rules:
- !AUTHORITY
users:
- root@:root # 用户名@主机:密码
- sharding@:sharding # 支持多用户
provider:
type: ALL_PERMITTED # 权限控制类型
- !TRANSACTION
defaultType: XA # 默认事务类型
providerType: Atomikos # 事务管理器
- !SQL_PARSER # SQL解析配置
sqlCommentParseEnabled: true
sqlStatementCache:
initialCapacity: 2000
maximumSize: 65535
props:
sql-show: true # 显示SQL日志
proxy-default-port: 3307 # 代理服务端口
proxy-mysql-default-version: 8.0.20 # 模拟的MySQL版本
config-sharding.yaml(分片配置)
databaseName: sharding_db # 逻辑数据库名
dataSources:
m0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/shardingdb1
username: root
password: root
maxPoolSize: 50
m1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/shardingdb2
username: root
password: root
maxPoolSize: 50
rules:
- !SHARDING
tables:
course:
actualDataNodes: m$->{0..1}.course_$->{1..2}
databaseStrategy:
standard:
shardingColumn: cid
shardingAlgorithmName: course_db_alg
tableStrategy:
standard:
shardingColumn: cid
shardingAlgorithmName: course_tbl_alg
keyGenerateStrategy:
column: cid
keyGeneratorName: alg_snowflake
shardingAlgorithms:
course_db_alg:
type: MOD
props:
sharding-count: 2
course_tbl_alg:
type: INLINE
props:
algorithm-expression: course_$->{cid % 2 + 1}
keyGenerators:
alg_snowflake:
type: SNOWFLAKE
4. 启动与连接
# 启动ShardingProxy cd bin ./start.sh # 使用MySQL客户端连接 mysql -h127.0.0.1 -P3307 -uroot -proot # 查看逻辑库 mysql> show databases; +--------------------+ | Database | +--------------------+ | sharding_db | # 配置的逻辑库 +--------------------+
三、分布式事务:XA机制详解
1. XA事务基础
XA(eXtended Architecture)是X/Open组织定义的分布式事务标准。ShardingProxy集成了三种实现:
-
Atomikos(默认)
-
Narayana
-
Bitronix
XA事务流程:
-- 1. 开启事务 XA START 'transaction_id'; -- 2. 执行SQL INSERT INTO table VALUES (...); -- 3. 结束事务 XA END 'transaction_id'; -- 4. 准备提交 XA PREPARE 'transaction_id'; -- 5. 提交事务 XA COMMIT 'transaction_id';
2. 配置事务管理器
切换事务管理器示例:
# server.yaml
rules:
- !TRANSACTION
defaultType: XA
providerType: Narayana # 切换为Narayana
所需步骤:
-
下载对应JAR包到lib目录
-
修改配置文件
-
重启ShardingProxy
3. XA事务的局限性
| 问题 | 说明 | 解决方案 |
|---|---|---|
| 性能问题 | 比本地事务慢10倍以上 | 异步提交、批量提交 |
| 故障恢复复杂 | 故障后状态恢复困难 | 定期清理、监控工具 |
| 不支持自动提交 | 必须显式管理事务 | 框架封装、AOP切面 |
建议:非强一致性场景,考虑柔性事务(如Seata的AT模式)。
四、集群化部署与配置中心
1. 两种运行模式
| 模式 | 特点 | 适用场景 |
|---|---|---|
| Standalone | 独立运行,内存管理配置 | 开发测试、单节点部署 |
| Cluster | 集群运行,配置中心同步 | 生产环境、高可用部署 |
2. Zookeeper集群配置
server.yaml配置:
mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: 192.168.65.212:2181
retryIntervalMilliseconds: 500
timeToLiveSeconds: 60
maxRetries: 3
Zookeeper节点结构:
/governance_ds/ ├── metadata/ # 元数据 ├── props/ # 属性配置 ├── rules/ # 规则配置 ├── nodes/ # 节点信息 └── active_version # 激活版本
3. 配置中心同步流程
1. Proxy启动 → 2. 读取本地配置 → 3. 同步到Zookeeper → 4. 其他节点从Zookeeper读取 → 5. 配置变更自动同步
优势:
-
配置一致性:所有节点配置自动同步
-
动态更新:修改配置无需重启
-
版本管理:支持配置版本回滚
五、ShardingJDBC与ShardingProxy混合架构
1. 统一配置管理
应用通过注册中心获取配置:
# application.properties spring.shardingsphere.mode.type=Cluster spring.shardingsphere.mode.repository.type=ZooKeeper spring.shardingsphere.mode.repository.props.namespace=governance_ds spring.shardingsphere.mode.repository.props.server-lists=localhost:2181 spring.shardingsphere.database.name=sharding_db # 指定逻辑库
优势:
-
ShardingJDBC与ShardingProxy共享同一份配置
-
配置变更一处修改,处处生效
-
便于灰度发布和版本管理
2. 使用ShardingSphereDriver
直接通过JDBC连接:
public class ShardingSphereDriverDemo {
@Test
public void test() throws Exception {
// 使用ShardingSphere专用驱动
String driver = "org.apache.shardingsphere.driver.ShardingSphereDriver";
String url = "jdbc:shardingsphere:classpath:config.yaml";
Class.forName(driver);
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery("SELECT * FROM course");
// 处理结果
}
}
}
config.yaml文件与ShardingProxy配置文件完全兼容,可直接复用。
六、自定义扩展机制
1. 扩展包制作
自定义主键生成器示例:
public class MyKeyGeneratorAlgorithm implements KeyGenerateAlgorithm {
private AtomicLong atom = new AtomicLong(0);
@Override
public Comparable<?> generateKey() {
LocalDateTime now = LocalDateTime.now();
String timestamp = DateTimeFormatter.ofPattern("HHmmssSSS").format(now);
return Long.parseLong(timestamp + atom.incrementAndGet());
}
@Override
public String getType() {
return "MYKEY"; // 关键:类型标识
}
}
Maven打包配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>ShardingSPIDemo</id>
<phase>package</phase>
<goals><goal>jar</goal></goals>
<configuration>
<classifier>spiextention</classifier>
<includes>
<include>com/roy/shardingDemo/algorithm/*</include>
<include>META-INF/services/*</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2. 部署到ShardingProxy
1. 将生成的JAR包复制到ShardingProxy的lib目录 2. 在配置文件中使用自定义类型 3. 重启ShardingProxy服务
配置文件使用:
keyGenerators:
my_keygen:
type: MYKEY # 与getType()返回值一致
七、数据迁移实战方案
1. 迁移挑战
-
海量数据:TB/PB级数据迁移
-
业务连续性:迁移期间业务不能中断
-
数据一致性:新旧数据必须一致
2. 混合架构迁移方案
┌─────────────────────────────────────────────────┐
│ 旧业务系统 │
│ ┌─────────────┐ │
│ │ DataSource│ │
│ └──────┬──────┘ │
└───────────┼─────────────────────────────────────┘
│
┌───────▼────────┐ 热数据双写
│ ShardingJDBC ├──────────────┐
│ 数据双写库 │ │
└───────┬────────┘ │
│ │
┌───────▼────────┐ ┌───────▼────────┐
│ 旧数据库集群 │ │ ShardingJDBC │
│ │ │ 数据写入库 │
└───────┬────────┘ └───────┬────────┘
│ │
┌───────▼────────┐ ┌───────▼────────┐
│ 定时任务 │ │ ShardingProxy│
│ (冷数据) │ │ │
└───────┬────────┘ └───────┬────────┘
│ │
└───────────┬───────────┘
│
┌───────▼────────┐
│ 新数据库集群 │
│ │
└────────────────┘
3. 迁移步骤
阶段一:热数据双写
-
配置ShardingJDBC双写数据源
-
核心业务表同时写入新旧集群
-
验证数据一致性
阶段二:冷数据迁移
-
搭建ShardingProxy服务
-
定时任务增量迁移历史数据
-
监控迁移进度和数据质量
阶段三:切换与验证
-
逐步将读流量切换到新集群
-
验证业务功能完整性
-
最终切换写流量
阶段四:清理与优化
-
停用旧数据源
-
移除双写配置
-
优化新集群性能
4. 注意事项
-
SQL兼容性:确保业务SQL符合ShardingSphere规范
-
事务一致性:双写期间注意事务边界
-
性能监控:迁移期间密切监控系统性能
-
回滚预案:准备完善的回滚方案
八、生产环境最佳实践
1. 版本选择策略
| 版本类型 | 推荐 | 说明 |
|---|---|---|
| 生产环境 | 5.2.x稳定版 | 经过验证,兼容性好 |
| 测试环境 | 与生产一致 | 保证环境一致性 |
| 开发环境 | 最新快照版 | 体验新功能,发现潜在问题 |
2. 监控指标
关键监控项:
-
连接数:
proxy-frontend-max-connections -
查询性能:平均响应时间、QPS
-
资源使用:CPU、内存、网络IO
-
错误率:SQL执行错误、连接错误
推荐工具:
-
Prometheus + Grafana
-
SkyWalking
-
ShardingSphere自带的监控接口
3. 高可用架构
┌─────────────┐
│ 负载均衡器 │
│ (HAProxy/Nginx)│
└──────┬──────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌───────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
│ ShardingProxy │ │ ShardingProxy │ │ ShardingProxy │
│ 节点1 │ │ 节点2 │ │ 节点3 │
└───────┬────────┘ └───────┬────────┘ └───────┬────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌────────▼────────┐
│ 配置中心 │
│ (Zookeeper) │
└─────────────────┘
九、常见问题与解决方案
1. 连接问题
问题: MySQL客户端无法连接ShardingProxy
解决:
-
检查MySQL驱动是否放入lib目录
-
验证server.yaml中的用户权限配置
-
确认端口是否被占用
2. 配置同步问题
问题: 集群节点配置不一致
解决:
-
检查Zookeeper连接状态
-
验证namespace配置一致性
-
查看日志中的配置同步错误
3. 性能问题
问题: 查询性能下降明显
解决:
-
调整
max-connections-size-per-query -
优化分片算法,避免全路由
-
增加数据库连接池大小
十、总结与展望
核心收获
-
理解ShardingProxy定位:不是替代ShardingJDBC,而是互补的服务端解决方案
-
掌握混合架构:ShardingJDBC + ShardingProxy + 配置中心的完美组合
-
实战迁移方案:基于ShardingSphere构建可落地的数据迁移方案
-
掌握扩展机制:通过SPI机制自定义算法,满足个性化需求
未来趋势
-
云原生支持:更好的Kubernetes集成
-
智能优化:基于AI的SQL优化和分片建议
-
多模数据支持:支持更多数据库类型和数据格式
-
生态整合:与更多开源工具(如Flink、Spark)深度集成
更多推荐
所有评论(0)