1. 事情的起因
最近,随着业务的发展,我们的项目面临着日益增长的数据挑战。系统使用的数据库是mysql,每天的增量差不多在百万左右,由于没有进行分库分表,以前设置的单表保存已经越发不能满足需求,所以想维持表的性能,甲方考虑对这些大数据量的表进行分表操作,同时也采用读写分离,将业务上的读写操作分开,提高系统性能。
项目团队接到了这个任务后,迅速召开了需求分析会议,深入探讨了技术可行性、业务需求、潜在风险以及架构选型。我们的目标是找到一个既能满足当前需求,又能为未来扩展留出空间的解决方案。
技术方案探讨
分表策略的抉择
我们评估了垂直分表和水平分表两种方案。垂直分表虽然可以减少单表的数据量,但需要将表中不同的字段拆分到不同的表中的操作,对现有系统会造成一定的冲击和潜在的维护成本,所以我们选择了更为稳妥的水平分表策略,将表中的数据按规则拆分到多个表中,分散数据量。
当然,项目组也有人推荐使用分库操作。但由于甲方经费受限等原因,这个提案只经过短短数秒就被Pass了,没有激起水花。
读写分离的共识
对于读写分离,团队倒是没啥争议点。MySQL的主从复制机制就可以为我们提供了现成的解决方案,且简化了配置过程。
业务需求的细化
确定分表分库的对象
我们明确了业务需求,确定哪些表需要进行分表分库,哪些操作需要读写分离。并根据业务特点设计了分表规则,如按时间戳、地域或ID等维度进行数据拆分。
数据迁移的策略
对于现有数据的迁移,我们制定了详细的迁移计划和步骤,确保数据的平滑过渡和最小化业务中断。
风险评定
数据一致性的保障
分表分库后,确保数据一致性成为我们面临的首要挑战。我们讨论了多种策略,以确保数据的准确性和完整性。
分布式事务的处理
跨库事务处理复杂。我们评估了多种分布式事务解决方案,以应对可能出现的事务管理问题。
查询逻辑的优化
分表分库后,查询可能需要跨多个表或库进行。我们需要对查询逻辑进行优化,以提高查询效率和响应速度。
技术选型与实施
分表分库中间件的比较
在MyCat和ShardingSphere之间,我们进行了深入的比较。两者都能够实现分表分库、读写分离,满足这次的任务需求。MyCat以其成熟度和易用性获得了团队的认可,但ShardingSphere以其灵活性和对复杂事务的支持,最终赢得了我们的青睐。
ShardingSphere是一个分布式数据库中间件,提供了分库分表、读写分离、分布式事务等多种功能,可以与Spring、SpringBoot等主流框架无缝整合,灵活性更高,特别适合对灵活性和扩展性有较高需求,或需要处理复杂的分布式事务的项目。
2. 项目实践:ShardingSphere在分布式数据库中的应用
在项目使用ShardingSphere之前,根据ShardingSphere的官方文档,我们可以获得一些基本信息
ShardingSphere概览
Apache ShardingSphere 是一款分布式的数据库生态系统,可以将任意数据库转换为分布式数据库,它提供了一系列的分布式数据库解决方案,包括数据分片(Sharding)、读写分离(Read-Write Splitting)、数据加密(Data Encryption)、分布式事务 、数据迁移 等功能。ShardingSphere 的目标是帮助用户轻松地管理和扩展他们的数据库,同时保持高可用性和高性能。
核心组件
- Sharding-JDBC:一个轻量级的 Java 框架,提供 JDBC 接口的分布式数据库支持。
- Sharding-Proxy:一个透明的数据库代理,支持 MySQL 和 PostgreSQL 协议,可以将单机数据库转换为分布式数据库。
- Sharding-Sidecar:一个基于 Kubernetes 的云原生数据库代理。
主要特性
- 灵活性:支持多种分片策略和自定义分片算法。
- 透明性:对应用层透明,应用无需修改代码即可使用。
- 扩展性:支持水平扩展,能够处理大规模数据和高并发请求。
- 兼容性:支持多种数据库,包括 MySQL、PostgreSQL、Oracle 等。
ShardingSphere在项目各阶段的应用分析
本项目为分布式系统,ShardingSphere 的应用贯穿了从需求分析到系统上线的全过程,具体分为以下五个关键阶段:
需求分析阶段
- 虽然在一开始就已经简单分析,但还是需要单独有个阶段细化业务需求,以保证需求准确无误。
- 确定系统的数据量、访问量和业务需求。
- 明确数据分片的维度和策略。
开发阶段
- 根据需求分析的结果,配置ShardingSphere的分片规则和读写分离、数据加密等操作。
- 使用 Sharding-JDBC,将其集成到应用的 JDBC 层,通过配置数据源和分片规则来实现。
- 开发人员需要编写代码来集成ShardingSphere,并确保应用程序能够正确地与分片数据库进行交互。
- 开发自定义的分片算法,并将其集成到ShardingSphere中。
测试阶段
-
进行单元测试,确保每个分片逻辑和数据库读写操作都能正确执行。
-
进行集成测试,验证整个系统在分片环境下的性能和稳定性。
-
进行负载测试,模拟高并发情况,确保系统能够处理大量数据和请求。
部署阶段
- 将应用部署到生产环境,并监控 ShardingSphere 和数据库的性能。
- 配置生产环境的数据库和网络,确保所有分片节点能够正常通信。
- 监控系统的初始运行情况,确保没有配置错误或性能问题。
数据迁移阶段
- 如果项目需要从非