ShardingSphere分库分表在计费系统中的实践与优化
1. 项目背景与挑战国际计费系统作为企业核心业务支撑平台随着全球业务扩张面临着数据量激增的典型挑战。我们遇到的场景是单库数据量已突破3TB日均增量超过200万条记录传统垂直扩展方式如升级服务器配置已无法满足性能需求。特别是在月末计费高峰期复杂报表查询响应时间从最初的2秒延长至47秒严重影响了业务运营效率。这个系统的特殊性在于涉及跨国交易数据需要满足不同地区的合规要求计费逻辑复杂包含费率计算、税务处理、货币转换等多维度数据关联业务连续性要求高迁移过程必须保证7×24小时服务可用2. 技术选型与方案设计2.1 分库分表方案对比我们评估了三种主流方案应用层分片在业务代码中实现路由逻辑优点灵活可控缺点侵入性强需要改造所有DAO层代码MySQL Fabric官方提供的分片方案优点原生支持缺点功能简单社区支持弱ShardingSphere生态Sharding-JDBC轻量级Java驱动Sharding-Proxy独立代理服务最终选择Sharding-Proxy的核心考量对现有系统零侵入无需修改应用代码完整支持MySQL协议兼容现有运维工具链提供完善的数据分片、读写分离、分布式事务能力2.2 分片策略设计针对计费业务特征设计了复合分片策略shardingRule: tables: t_order: actualDataNodes: ds_${0..31}.t_order_${0..7} tableStrategy: inline: shardingColumn: user_id algorithmExpression: t_order_${user_id % 8} databaseStrategy: standard: shardingColumn: region_code preciseAlgorithmClassName: com.xxx.RegionHashAlgorithm关键设计点双重分片维度按地区分库32个物理库按用户ID分表每个库8张表自定义地区哈希算法考虑数据分布均衡性满足GDPR等合规要求特定地区数据物理隔离热点数据处理对大客户采用单独分片策略设置非对称分片区间如北美地区分配更多分片3. 迁移实施细节3.1 环境准备Sharding-Proxy部署架构[Application] - [HAProxy] - [Sharding-Proxy Cluster] - [MySQL Cluster] ↑ Keepalived具体配置Proxy节点8核16G × 3部署在K8s集群连接池配置props: max.connections.size.per.query: 5 acceptor.size: 16 executor.size: 163.2 数据同步方案采用双写增量同步的混合模式全量迁移阶段/* 通过Proxy执行 */ INSERT INTO new_table SELECT * FROM old_table WHERE create_time 2023-01-01;增量同步阶段基于Canal监听binlog自定义转换器处理分片逻辑public class ShardingTransformer implements EntryTransformer { Override public String transform(String originSQL) { // 解析原SQL并添加分片条件 return ShardingSQLRewriter.rewrite(originSQL); } }数据校验机制行级CRC校验抽样比对每日凌晨执行def verify_data(shard, primary): diff spark.sql(f SELECT count(*) FROM {shard} s FULL OUTER JOIN {primary} p ON s.idp.id WHERE s.checksum!p.checksum OR s.id IS NULL OR p.id IS NULL ) return diff.collect()[0][0]4. 关键问题与解决方案4.1 分布式事务处理计费业务涉及多表事务操作我们采用Seata的AT模式与Sharding-Proxy集成配置调整props: proxy.transaction.type: XA proxy.opentracing.enabled: true异常处理流程超时事务自动回滚死锁检测每5分钟扫描补偿任务队列4.2 跨分片查询优化针对报表类复杂查询实现方案并行查询内存归并// 使用HintManager强制全库路由 try (HintManager hintManager HintManager.getInstance()) { hintManager.setMasterRouteOnly(); ListOrder orders orderRepository.findAll(); }建立全局索引表Elasticsearch同步关键字段预计算常用统计指标4.3 在线扩容方案当需要新增分片时滚动扩容流程新节点加入 - 数据rebalance - 流量切换 - 旧节点下线数据迁移工具./bin/start.sh -m -c config-sharding.yaml \ -Dsharding.scaling.job.offsetlatest \ -Dsharding.scaling.worker.thread205. 性能优化实践5.1 连接池调优测试发现默认配置在高并发下存在问题连接等待超时线程竞争激烈优化后配置props: max.connections.size.per.query: 10 acceptor.size: 32 # CPU核心数×2 executor.size: 64 # IO密集型任务 query.with.cipher.column: false5.2 SQL改写规则针对典型慢查询进行优化禁止全表扫描/* 原SQL */ SELECT * FROM orders WHERE status1; /* 改写后 */ SELECT * FROM orders WHERE status1 AND user_id IN (...,...) /* 自动注入分片条件 */分页查询优化// 使用流式查询替代内存分页 try (StreamOrder stream orderRepository.streamAll()) { stream.limit(1000).forEach(...); }5.3 监控体系建设基于Prometheus的监控指标关键指标查询延迟P99连接池利用率分布式事务成功率告警规则示例- alert: HighQueryLatency expr: rate(shardingsphere_proxy_requests_latency_sum[1m]) 0.5 for: 5m6. 实施效果与经验总结迁移后性能指标对比指标迁移前迁移后写入TPS1,2008,500查询延迟(P99)2.3s320ms存储成本3TB(SSD)1.2TB×3踩坑经验拆分键选择初期使用订单ID导致热点问题最终采用用户ID地区码复合键批量插入优化// 错误方式产生大量小事务 orders.forEach(repository::save); // 正确方式 repository.saveAll(orders);数据类型陷阱BIGINT自增ID在分片后可能冲突改用Snowflake分布式ID对于计划实施类似迁移的团队建议先在小规模数据上验证分片策略建立完善的数据校验机制准备详细的回滚方案进行充分的性能压测

相关新闻

终极指南:如何使用Wand-Enhancer免费解锁Wand专业版功能

终极指南:如何使用Wand-Enhancer免费解锁Wand专业版功能

终极指南:如何使用Wand-Enhancer免费解锁Wand专业版功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款强大的开源…

2026/10/15 2:47:32 阅读更多 →
AI编程助手取消限制后的实战应用与最佳实践指南

AI编程助手取消限制后的实战应用与最佳实践指南

最近在AI编程助手领域,一个重大变化正在悄然发生:Codex和ChatGPT Work系列产品取消了备受争议的5小时使用限制。这个看似简单的政策调整,实际上反映了AI工具从"尝鲜玩具"向"生产力工具"的深刻转变。对于每天与代码打交道…

2026/10/6 11:00:50 阅读更多 →
Linux包管理利器yum:从基础命令到企业级应用

Linux包管理利器yum:从基础命令到企业级应用

1. yum命令概述与核心价值 yum(Yellowdog Updater Modified)作为RPM系Linux发行版的核心包管理工具,其设计哲学在于解决早期RPM包管理中最令人头疼的依赖地狱问题。我在运维CentOS服务器的五年间,深刻体会到yum相比直接使用rpm命令…

2026/10/12 19:49:51 阅读更多 →

最新新闻

Apereo CAS 服务注册表自动初始化(Service Registry Initialization)实战指南

Apereo CAS 服务注册表自动初始化(Service Registry Initialization)实战指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 导读 Apereo CAS 在启动时会根据配置自动将 classpath 上的默认 JS…

2026/10/15 3:10:36 阅读更多 →
Start Bootstrap 模板库站点解析:Jekyll 驱动的模板目录、详情页与在线预览架构

Start Bootstrap 模板库站点解析:Jekyll 驱动的模板目录、详情页与在线预览架构

前端文档 【免费下载链接】startbootstrap A library of free and open source Bootstrap themes and templates 项目地址: https://gitcode.com/gh_mirrors/st/startbootstrap 点击查看 免费下载 本文以 Start Bootstrap 站点博客中的《Structural Updates》一文为…

2026/10/15 3:10:36 阅读更多 →
PathOfBuilding完整使用攻略

PathOfBuilding完整使用攻略

PathOfBuilding完整使用攻略 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding PathOfBuilding 是流放之路(Path of Exile)的离线 Build 规划工具&am…

2026/10/15 3:10:36 阅读更多 →
英伟达开源SoL-Pi:AI自己研究出优化方案,为Agent Harness省下64% Token

英伟达开源SoL-Pi:AI自己研究出优化方案,为Agent Harness省下64% Token

摘要:2026年9月11日,英伟达NVLabs开源SoL-Pi——不是新框架,不是新模型,而是一层“效率增强层”。装在开源Agent Harness Pi之上,Token消耗降低45%-64%,API成本降低50%-54%。最引人注目的不是性能数据&…

2026/10/15 3:10:36 阅读更多 →
网络安全工程师成长路线图,从小白到大神分阶段规划

网络安全工程师成长路线图,从小白到大神分阶段规划

夯实基石:初级工程师的入门必修课对于刚踏入网络安全领域的新人而言,首要任务不是盲目追求高深的攻防技巧,而是构建稳固的地基。这一阶段的核心目标是成为一名合格的初级安全工程师,重点在于对网络原理的深刻理解与 Linux 系统的熟…

2026/10/15 3:10:36 阅读更多 →
杂交瘤HAT筛选后集落稀疏怎么办?从融合效率、HGPRT到铺板密度的7项排查

杂交瘤HAT筛选后集落稀疏怎么办?从融合效率、HGPRT到铺板密度的7项排查

摘要: 杂交瘤细胞融合后进入HAT选择培养,是单克隆抗体制备流程中非常关键的一步,但实验中经常出现集落稀疏、孔内细胞逐渐消失甚至整块板无细胞存活等问题。不同失败表现背后的原因并不相同:融合后24-48小时即出现大量细胞碎片&am…

2026/10/15 3:09:36 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →