案例小故事
某公司的技术架构体系目前还是以集群扩展体系为主,集群扩展体系架构如图9-1所示。在这种体系结构中,可以看到应用都是单块结构,但是单块结构的应用具有扩展性,通过部署在多个Tomcat上实现应用的集群,所有的应用都访问同一个数据库(这个库可以假设为Oracle数据库),数据库间采用DataGuard来实现主从同步,读库只具有读取功能,为后台数据统计功能提供数据查询和统计服务。目前业务请求的并发量每分钟有几十笔交易,看起来这套架构还是能够支撑目前的业务发展的。
突然有一天客户在做活动的时候,监控中心出现各种告警,在每分钟500TPS的时候很多请求超时,监控显示目前的服务器不能支撑这么大的并发量,于是快速增加服务器部署应用上线,发现根本没用,加了和没加一样,加几台都一样,运维和DBA发现此时的数据库压力非常大,好不容易熬过这段时间后,团队成员痛定思痛,一致认为目前的架构体系已经不能支持业务的发展,微服务开始快速推进。
其中微服务的数据去中心化核心要点是:每个微服务有自己私有的数据库持久化业务数据。每个微服务只能访问自己的数据库,而不能访问其他服务的数据库。某些业务场景下,需要在一个事务中更新多个数据库。这种情况也不能直接访问其他微服务的数据库,而是对微服务进行操作。数据的去中心化进一步降低了微服务之间的耦合度。
问题随后就来了:
(1)以前团队一共就10个人,只负责一二个项目,现在突然增加到平均每人维护二三个项目,上线还是采用由运维手工打war包,如果有修改的配置文件,则运维人员需要一台一台地进行修改,不仅容易上线出错,而且每次上线都会搞到半夜。
(2)根据上面提到的数据去中心化原则,数据库拆分出来了,一个服务一个数据库实例,但是对后台统计系统来说就是“噩梦”,数据库拆分出来了,统计工作、报表工作该怎么办呢?这部分工作还做不做呢?有人说可以分开统计,一个库一个库进行统计,可是这样的工作量将是巨大的。
(3)机房的双活问题,对于金融公司来说双活还是很关键的一项技术指标。应用双活其实比较容易实现,但对于数据库来说却是一个技术问题了,对于Oracle数据库来说,用Oracle官方提供的OGG(Oracle GoldenGate)进行数据同步,根据论坛上面的资料可以看出,OGG的“坑”非常多,而且也容易丢数据,更重要的是贵。采用Oracle的logminer进行同步,同步的数据不是实时的,会有一定延时。而且在定时读取方面还需要自己进行开发,采用Oracle的DataGuard也只能做主从同步,不能做主主双活。调研过后,最终还是决定自己独立开发。
从单块系统到微服务是逐步演进的过程,如果前期没有调研,没有一个整体规划,后期在实现微服务的时候会发现需要做的事情只会越来越多,尤其是对于快速发展的创业型公司来说。针对以上问题,我们如何解决?上面说的第一个问题可以通过合理实施DevOps来解决,而第三个双活问题在本书相应章节中也有详细介绍,本章将给出合理方案深入讨论如何解决第二个问题,即如何在微服务场景下进行数据统计和抽取。
在企业中,需要将不同服务所属的数据库数据抽取到数据仓库,以便能够对平台进行查询和统计,而优秀的数据仓库离不开良好的数据体系的支撑与维护,数据体系建设是一系列长期的、迭代的过程。
什么是数据仓库
第一次接触数据仓库的读者对这个概念会比较陌生,可能会有这样的疑问,什么是数据仓库?为什么要建立数据仓库呢?下面从数据仓库的定义、特点及数仓(数据仓库简称)与操作型数据库的区别三个方面了解数据仓库。
1.数据仓库的定义
最早数据仓库这个概念是由被称为“数据仓库之父”的Bill Inmon提出的,并且在其出版的Building the Data Warehouse一书中给出了数据仓库的详细定义。Inmon在Building the Data Warehouse中定义数据仓库是一个面向主题的、集成的、非易失的且随时间变化的数据集合,用来支持管理人员的决策。
2.数据仓库的特点
1)面向主题
数据仓库采用面向主题的方式组织数据。数据仓库主要是为公司决策者提供数据依据,决策者更关注整体数据反映的情况。以面向主题的方式组织数据可以将各分散子应用或子系统的数据按照主题组织在一起,让决策者可以从更高层面分析数据,挖掘数据背后蕴藏的商业价值,指导决策者做出正确的判断。
2)集成性
数据仓库中集成了各分散数据源的数据。对多个来源、多种类型的数据进行统一加工、汇总、整理,去除数据中的“杂质”,规范字段格式,保证数据仓库中的数据具有全局一致性。
3)相对稳定
操作型数据库中的数据是实时更新的,数据仓库中的数据相对稳定,不会频繁地执行修改、删除操作。在数据仓库中以查询操作为主,数据经过加工进入数据仓库之后一般不会发生改变,会被长期保存或根据业务需求保存很长一段时间后被删除。
4)反映历史变化
数据仓库的主要任务是对大量历史数据进行统计分析,决策者根据历史数据分析结果预测未来发展趋势。