微服务软件混合版本的数据同步方案设计

2021-11-27 00:15:30宗国福张欢许雄
魅力中国 2021年20期

宗国福 张欢 许雄

(西北工业大学软件学院,陕西 西安 710129)

一、微服务介绍

微服务架构风格自2014 年开始推广后,六年期间出现了无数优秀成果。目前学术界对微服务的架构研究分为三类:一种是研究单体应用迁移到微服务架构应避免的陷阱以及相对应采取的策略[1]。第二种是微服务架构的通用研究。第三种是在微服务架构实际应用中遇到的问题及优化,如H.Song 等人利用侵入式微服务实现SaaS 的深度定制。

微服务的一个重要特点是通常各个微服务的数据存储都是独立的。每个服务都在单独的进程中运行并且可以独立部署,其配置、数量和服务地址都是不同的。作为一个分布式且松散的架构,微服务在整个团队中更改其中某个模块不会破坏整个应用程序。

二、数据同步相关概念

(一)异构数据库

异构数据库最简单的理解是多个数据库系统的集合,能实现不同数据库间数据的共享和透明访问。其异构性可分为多个方面,而本文所提出的异构数据库是指:多种数据库间所使用的数据模型、数据模式、数据表结构以及数据类型的差异。

(二)数据同步

业界对于数据同步没有严格的定义。文献中指出:“数据同步是一种允许在不同计算机上的多个数据库之间保持数据库一致性的技术手段”[4]。在SyncML 协议的白皮书上写道:“数据同步是一个使得两个集合中的数据看起来一致的处理过程”。而本文针对课题对数据同步下定义:数据同步是指在不同版本数据库间保持数据一致性的技术手段。

三、数据同步的设计

(一)数据同步方案选择

目前业界针对数据同步的研究现状,共有三种:1.使用数据库厂商提供的同步软件。2.基于数据库文件导入导出功能同步数据。3.获取数据库增量数据进行同步。相比全量同步,获取到的增量数据是源源不断的,这样既减少了网络带宽的消耗,也减轻了用户的处理负担,同时也是异构数据库间同步的最优方案。

(二)数据同步模型

数据同步是把数据从一个数据库传递到另外一个数据库中,中间的通道则是连接源端和目标端数据库的媒介。数据同步流程可以描述为:数据源作为数据同步的源端数据库,通过操作解析源数据库的日志文件,转换为便于数据交换的统一格式,并序列化为二进制格式数据发送到操作队列中。操作复现模块从操作队列中取出日志解析结果,按照其顺序在目标数据库中复现,实现最终的数据同步。

四、数据同步的实现

(一)变更数据的获取

数据库会记录下对数据的每一次操作,并存档下来形成日志文件,以便于对数据的维护和回档,并提供数据修改的可靠证明。Mysql 在主从复制时,利用的就是数据库日志文件。主数据库会按照一定的协议,将记录下来的日志文件推送到从数据库中,从数据库按照日志文件进行操作。

数据库日志文件解析采用行模式,不仅能监控每条记录的更改情况,还能让数据处理的连续性更好,从而降低平均时延。使用了行模式的日志文件由事务组成,在被记录下来的每一条具体操作语句前,带有###标识,合理利用这些标识,可以方便地解析出日志文件的每个操作动作。

Canal 是阿里巴巴公司为解决跨机房同步数据而衍生出的项目,可以用作解析Mysql数据库的Binlog 文件。Canal 内部可以划分为4 个子模块:Parser、Sink、Store、Meta。Parser 用于与源端数据库建立连接,获取日志文件进行解析。Sink 则负责对解析结果进行加工处理。Store 存储解析结果,Meta 是对解析出来的结果进行交付统筹。

(二)变更数据的分发与消费

异构数据库间的性能往往有所差异,日志解析速度和写入端数据库的速度不会完全匹配。因此,可以设置缓存区来兼容两端解析和写入的速度。当出现数据同步错误时,只需要回退程序,重新消费再次入库即可。

考虑到源数据库操作有一定顺序,因此缓存区的选取队列这一数据结构来实现。另外,源数据库产生的数据有着较大的吞吐量,而单机版的队列吞吐量较小。因此选取分布式队列Kafka 来实现数据缓存的作用。

要实现数据的均衡分发,最优方案是消费者数量与队列分区数一致。考虑到数据同步过程中的数据丢失等异常情况,采用Hash 值分配选区的方法,可以保证同表数据在同一分区内,即对每条数据表名进行Hash 计算取模分配。该方案可以保证出现同步错误时受影响的数据会集中在特定分区,回滚操作范围也能保证在特定分区。但不同表之间的数据量仍有差异,依然会出现数据分配不均匀的问题。假设将m 张表的总数据均匀分配到N 分分区,若不考虑相同表在同一分区,只需均分即可。每个分区的数据量相等,均为:

由于需要保证同一张表数据在同一分区,此时最优方案与均值肯定存在偏差,偏差越小,数据分布越均匀。与最优方案的偏差可以定义为:

其中是分区j 的数据量,要保证最小,只需要保证最小即可,方法如下:

1.将m 张表的数据量从小到大排序,将最大的N 张表分配到N 个选取;

2.新表则分配到数据量最小的分区中,以此类推直到所有表分配完毕。

在分配过程中,每次新的分配都会优先选择数据量最小的分区,即可减少和的偏差,从而达到均衡分发的目的。

(三)变更数据的复现

增量数据从源端数据库的日志文件中被解析出来后,转换为统一格式的操作信息,均匀分发到分布式队列中进行缓存,等待消费者消费。当操作复现速度高于解析速度时,数据能够及时被处理,不容易挤压在队列中。

为尽可能提高操作复现速度,本文提出了操作合并优化方法。但首先需要数据库中的表都有主键,保证唯一性的拘束。因为数据同步只需要数据一段时间内的最终状态,所以可对相同主键值的先后操作进行合并,减少需要执行的操作,从而增加单位时间内执行的操作数。又因为通过日志解析有着该次操作的全部字段的数值,合并操作后不会造成某些字段值的丢失。

采用操作合并优化,若数据源在一段时间内对某一主键值的记录频繁操作,在目标端中会被简化为一次操作。该主键值的中间状态被丢弃掉,处理量大大减少,执行效率增加,同步效率得到大幅提升。

操作复现模块包括监听器、缓存区、操作执行。监听器负责从队列中拉取数据,一个进程的不同监听器都为同一个消费者组。缓存区操作复现模块中的缓存区,和分布式队列构成二级缓冲结构。操作执行负责从缓存区中取出缓存块,把缓存块中的数据转换为操作语句,在数据库中还原操作。

五、结语

随着业务需求的变化,初始的底层数据结构不一定满足现要求。得益于微服务技术的发展,可通过单一服务的升级提升工作效率。但为了满足用户对不同版本软件的使用情况,数据库版本间的同步问题就显得格外重要。

本文基于Mysql 数据库日志,提出混合版本下数据库的同步方案,此方案分为三步:操作解析、数据分发、操作复现。

数据库采用Mysql 的行模式来记录日志获取增量数据。操作解析后,增量数据会被分发到缓存区中。本文提出的数据均衡分发算法,保证同一个表数据在同一分区中,从而降低同步出错需要数据回滚而造成的影响。同时,也使得数据在不同分区中分布均匀。缓存区中对数据进行消费后,在目标端进行操作复现。操作复现采用操作合并优化,尽可能提高操作复现的速度。利用数据库主键唯一性约束,合并主键相同的操作,从而减少实际需要执行的操作,提升效率。

通过该设计实现了服务多版本间的数据同步问题,既满足了业务需求又能让不同版本的用户产品使用过程中无感知。吉的美好祈愿,将武门神形象以及故宫猫与创意贺卡进行结合,突显武门神威武的形象以及故宫猫的憨态可掬,也有利于故宫博物馆文化的传承与发展。