ShardingProxy作为Apache ShardingSphere生态中的数据库中间件,其核心设计理念是通过透明化代理模式解决数据库扩展性问题。与传统的JDBC驱动层分片方案不同,Proxy采用独立进程部署,对应用程序完全透明。这种架构带来几个显著优势:
关键设计细节:Proxy内部采用Netty实现高性能网络通信,单个实例可处理数千并发连接。通过解析改写引擎将标准SQL转换为底层数据库可执行的物理SQL,执行结果再经过归并引擎合并返回
硬件要求:
软件依赖:
获取发行包:
bash复制wget https://archive.apache.org/dist/shardingsphere/5.1.1/apache-shardingsphere-5.1.1-shardingsphere-proxy-bin.tar.gz
目录结构解析:
code复制├── bin/ # 启停脚本
├── conf/ # 配置文件目录
│ ├── server.yaml # 全局配置
│ └── config-*.yaml # 分片规则
├── lib/ # 核心依赖
└── ext-lib/ # 扩展依赖(需手动创建)
关键配置示例(server.yaml):
yaml复制rules:
- !AUTHORITY
users:
- root@%:root123 # 生产环境务必修改密码
props:
sql-show: true # 开启SQL日志
max-connections-size-per-query: 5 # 查询并发控制
内存配置(bin/start.sh追加):
bash复制JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC"
指定配置文件目录:
bash复制./bin/start.sh 3308 /path/to/custom_conf/
典型配置示例(config-readwrite-splitting.yaml):
yaml复制dataSources:
write_ds:
url: jdbc:mysql://master:3306/db?useSSL=false
pool-config:
minIdle: 5
maxPoolSize: 20
read_ds_0:
url: jdbc:mysql://slave1:3306/db?useSSL=false
read_ds_1:
url: jdbc:mysql://slave2:3306/db?useSSL=false
rules:
- !READWRITE_SPLITTING
dataSources:
rw_ds:
type: Dynamic
props:
auto-aware-data-source-name: readwrite_ds
注意事项:读写分离延迟问题可通过以下方式缓解:
- 强制走主库:
/* FORCE_MASTER */ SELECT...- 设置事务内强制读主:
spring.shardingsphere.datasource.master-slave.allow.force.route.master=true
yaml复制databaseStrategy:
standard:
shardingColumn: user_id
preciseAlgorithmClassName: com.example.PreciseShardingAlgorithm
rangeAlgorithmClassName: com.example.RangeShardingAlgorithm
StandardShardingAlgorithm接口doSharding()方法广播表配置:
yaml复制broadcastTables:
- t_config
- t_region
绑定表配置:
yaml复制bindingTables:
- t_order,t_order_item
- t_product,t_product_detail
性能对比测试:在10万级数据量下,绑定表关联查询比普通关联快3-5倍
yaml复制props:
metrics:
enabled: true
prometheus:
host: 0.0.0.0
port: 9090
关键监控指标:
shardingsphere_proxy_requests_total 请求总量shardingsphere_proxy_active_connections 活跃连接数连接池耗尽:
Could not get connection from poolmaxPoolSize并检查连接泄漏SQL兼容问题:
SQLParsingExceptionsql-comment-parse-enabled: true开启注释解析元数据加载失败:
分页优化:
sql复制/* 低效写法 */
SELECT * FROM t_order LIMIT 10000,20
/* 优化写法 */
SELECT * FROM t_order WHERE id > 10000 LIMIT 20
批量操作:
java复制// 单条插入(不推荐)
for(Order order : orders) {
orderMapper.insert(order);
}
// 批量插入(推荐)
orderMapper.batchInsert(orders);
关键参数(conf/server.yaml):
yaml复制props:
executor-size: 20 # 执行线程数
max-connections-size-per-query: 5 # 每查询最大连接数
kernel-executor-size: 10 # 内核线程数
| 特性 | ShardingProxy | Sharding-JDBC |
|---|---|---|
| 连接方式 | 网络代理 | JDBC驱动 |
| 多语言支持 | 支持 | 仅Java |
| 性能损耗 | 约15-20% | 约5-10% |
| 运维复杂度 | 需独立部署 | 应用内集成 |
| 适合场景 | 多语言/遗留系统 | 纯Java新项目 |
实际项目中的混合部署方案:
实现接口:
java复制public class MyHintAlgorithm implements HintShardingAlgorithm<String> {
@Override
public Collection<String> doSharding(...) {
// 根据Hint值路由
}
}
配置启用:
yaml复制props:
proxy.hint.enabled: true
配置示例:
yaml复制rules:
- !ENCRYPT
tables:
t_user:
columns:
phone:
cipherColumn: phone_cipher
encryptorName: aes_encryptor
encryptors:
aes_encryptor:
type: AES
props:
aes-key-value: 123456abc
从5.1.x升级到5.2.x注意事项:
sharding-algorithm配置结构调整code复制1. 新版本Proxy与旧版并行部署
2. 流量灰度切换
3. 验证无误后下线旧版
经过多个生产项目验证,ShardingProxy在千万级数据量场景下表现稳定。某电商平台实测数据:QPS从1500提升至8500,平均延迟从120ms降至35ms。关键在于合理设计分片键和定期进行数据归档。