ShardingSphere实战:用JMeter压测Sharding-JDBC和Proxy,结果有点意外

发布时间:2026/6/14 5:19:08

ShardingSphere实战:用JMeter压测Sharding-JDBC和Proxy,结果有点意外 ShardingSphere性能压测实战JMeter深度对比Sharding-JDBC与Proxy的隐藏成本当数据库分片方案成为应对海量数据的标配选择时ShardingSphere作为国内最成熟的分布式数据库中间件其两种核心模式——嵌入式SDKSharding-JDBC与独立服务Sharding-Proxy的性能差异却鲜有系统性的实测分析。本文将带您用JMeter构建真实业务场景下的压力测试揭示在分库分表、读写分离、数据脱敏等复杂策略叠加时两种架构的性能曲线与隐藏成本。1. 压测环境搭建的艺术性能测试的第一道门槛往往不是工具使用而是如何构建贴近真实的生产环境模拟。我们选择四台16核32G云服务器组成集群每台部署MySQL 8.0.26实例避免资源争抢导致的测试偏差。网络配置上特别启用10Gbps内网带宽确保网络IO不成为瓶颈。测试表结构采用sysbench标准模板扩展但增加了脱敏字段需求CREATE TABLE pressure_test ( id bigint(20) NOT NULL AUTO_INCREMENT, user_code varchar(64) NOT NULL COMMENT 加密存储的用户标识, amount decimal(20,4) NOT NULL DEFAULT 0.0000, mobile_cipher char(64) NOT NULL DEFAULT COMMENT AES加密手机号, id_card_md5 char(32) NOT NULL DEFAULT COMMENT 身份证MD5, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user (user_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4关键配置细节在ShardingSphere的加密规则中我们采用AES-256-GCM算法处理手机号字段MD5处理身份证字段。这种混合加密策略在实际金融级应用中非常典型。2. JMeter测试计划设计精要区别于简单的HTTP压测数据库中间件测试需要特别关注连接池管理和SQL模板化。我们设计了三层测试结构线程组配置20并发线程持续30分钟100ms随机延迟模拟真实用户操作间隔使用CSV Data Set Config循环读取10万条测试数据JDBC连接管理// Sharding-JDBC连接配置示例 String jdbcUrl jdbc:shardingsphere://classpath:sharding-config.yaml; HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbcUrl); config.setMaximumPoolSize(50); config.setIdleTimeout(60000);混合事务设计单路由事务精确分片键查询更新跨库事务分布式主键生成后的关联操作全表扫描分页查询配合聚合计算3. 分场景压测数据揭秘3.1 单路由场景下的王者之争在10万数据量基础上我们配置4库×1024表的分片规则。测试结果显示指标Sharding-JDBCSharding-Proxy原生MySQLTPS(写入)12568921543平均延迟(ms)15.221.89.799%线(ms)386725意外发现Proxy在简单查询中额外消耗约30%性能主要来自协议转换开销。但当启用prepareStatement缓存后Proxy性能提升40%与JDBC差距缩小到15%以内。3.2 主从读写分离的隐藏陷阱搭建一主三从架构后我们观察到JDBC模式的读写分离存在粘滞读现象同一线程内写后立即读可能访问主库Proxy的负载均衡算法在高峰时段出现从库热点需要调整权重策略加密字段检索时两者性能均下降约25%因需内存解密结果集重要提示在sharding-config.yaml中启用spring.shardingsphere.props.max.connections.size.per.query5可显著改善全路由查询性能。3.3 全路由查询的灾难现场当执行SELECT COUNT(*) FROM pressure_test WHERE amount1000这类无法分片的查询时JDBC模式采用串行归并CPU利用率飙升至90%Proxy启动多线程归并但网络传输量暴增3倍两者响应时间均超过原生MySQL 8倍以上优化方案# 在Proxy配置中增加 props: executor-size: 16 max-connections-size-per-query: 8 sql-show: false4. 性能异常点深度剖析4.1 连接池管理的魔鬼细节测试过程中发现当并发连接超过300时JDBC的HikariCP出现明显的锁竞争Proxy的Netty事件循环线程可能成为瓶颈最佳实践是分级连接池配置// 分片级别连接池 dataSources: ds_0: maxPoolSize: 50 minIdle: 104.2 分布式事务的性能悬崖在XA事务测试中Sharding-JDBC的提交耗时随分片数线性增长而Proxy表现出更好的稳定性分片数JDBC提交耗时(ms)Proxy提交耗时(ms)2120145428019085102304.3 加密字段的索引失效由于加密字段无法利用数据库索引当执行WHERE mobile_cipher?时JDBC需将所有分片数据拉取到内存解密Proxy在服务端解密但传输全部数据建议采用脱敏索引方案ALTER TABLE pressure_test ADD COLUMN mobile_prefix CHAR(8) GENERATED ALWAYS AS (SUBSTRING(mobile_cipher,1,8)) STORED; CREATE INDEX idx_mobile_prefix ON pressure_test(mobile_prefix);5. 架构选型决策树根据压测结果我们总结出技术选型的关键维度延迟敏感型应用优先选择Sharding-JDBC其平均延迟降低30-40%多语言技术栈必须采用Proxy的统一接入层复杂查询场景Proxy的归并优化更胜一筹云原生环境Proxy更适合Service Mesh集成在最后的稳定性测试中我们意外发现当网络抖动发生时Proxy的自动重试机制反而导致雪崩效应而JDBC更快速失败的特性更适合分布式环境。这个反直觉的结论让我们重新审视了服务化一定更稳定的固有认知。

相关新闻