分库分表项目方案总结

环境信息

基于Java语言、Mysql数据库、Quartz任务调度。

 

本次分库分表的目的

问题现状

    随着业务的发展,ERP系统需求越来越广,系统界面、表结构、业务逻辑越来越复杂,报表查询的逻辑也越发的复杂,随着时间的推移数据量也逐渐飙升。随之引发了2个重要问题:

    性能差:通常一个报表所需的数据源,来自各种业务场景所定义的数据表,过滤条件也越发的复杂,数据量也巨大。这使得报表的性能骤降。一个报表查询通常要耗费几分钟,甚至几十分钟。

维护难:随着数据量逐年增加,数据库文件越来越大;对于日常的维护工作:备份、迁移、修复索引、分表等等;这些维护操作会越来越耗时;运维人员常常要夜里避开系统正常使用时间,才能维护此数据库。

 

解决方案

将经营业务数据分离至分析数据库(动态数据库),用于存储日常经营数据。通过调度任务将动态的经营数据调出业务库,经过一定的数据组织,传入专用的动态数据库(经营业务数据库)。

 

其他方案

分区表(与本方案不冲突,可选择一种进行实施,也可以结合使用)

总体流程

 

 

采用调度任务将日常经营的业务数据迁移至独立的数据库中。

具体数据流程

 

 

大致步骤

  1. 根据系统配置参数,将数据按“年度、季度、月、周、日”建立分表;
  2. 拆分建立相应的数据索引表;
  3. 将业务库中的数据迁移至新库中,保存为一套基础表;
  4. 将基础表内的数据根据业务需求进行数据逻辑处理,保存至结果表中;
  5. 报表、分析视图、数据分析等业务,直接从分析库中的结果表拿数据。

 

重点

  • 从根本上杜绝业务系统繁琐的join操作,已提高数据查询性能;
  • 分表任务交于调度框架执行,必须选择一种可以高可用的框架,已保证方案的正常运行。(本项目目前采用Quartz);
  • 拆分后,可能存在部分业务需要跨库查询,可采用一些开源的框架进行此操作(比如MyCat、Cobar 等,本项目采用自研的框架)。

 

业务库中的数据保存期限

 

 

只保留3天的数据在原库中(业务库),保证业务系统正常的使用。

方案的优点

对于业务系统和业务数据库:

  • 数据量可控,存储空间不会随时间的推移无限制增长;
  • 业务系统性能因为时间的推移而下降;
  • 对于业务数据库的维护,不会因为时间的推移而变得困难。

对于新的分析数据库(动态数据库)

  • 动态数据库数据按需存储,避免了大量的连接查询,大幅度提高了查询效率,提升了系统的性能;
  • 对“动态数据库” 的操作维护,不会影响正常的“业务数据库” 和业务系统;

后期此数据库可以作为数据分析的数据来源,对此库的数据做大数据的分析,也可以很好的避免对“业务数据库”的影响,避免影响业务系统的正常使用。

猜你喜欢

转载自blog.csdn.net/dzh284616172/article/details/106730042