双版本数据加载的系统设计

概述

很多服务依赖数据版本迭代。如搜索系统,每天会产生一个全量索引版本。路网系统,每天会加载新版本的路网数据。一个简单的做法是每次更新数据版本时,都停止服务,重新加载最新的数据(通常在流量最低的时间点)。但这种做法显然不够优雅。更常用的方案是加载双版本数据,动态切换,而不需要停止服务。本文介绍这种方案的一种实现方式。

架构图

核心环节

  1. 数据推送服务将最新版本的数据推送到各个服务器上,并将数据同步状态同步到版本管理中心;
  2. 当版本管理中心接收到所有服务均收到最新版本数据时,会下发加载该数据版本的命令;
  3. 服务接收到新加载数据版本命令时,先对数据进行校验(md5),然后在加载进内存中;
  4. 版本管理中心同样会下发卸载命令,将某一版本中的数据从内存中卸载;
  5. 版本管理中心还会下发数据删除命令,将某一版本中的数据从磁盘上删除;
  6. 当版本管理中心接收到所有服务均完成最新版本数据加载后,可以切换稳定版本id;

问答

1、数据推送如何保障数据的完整性?

答:一般数据推送会由专门的团队负责,主要会考虑各机器的流量均衡,使用p2p的方式加速传输。

2、服务端如何保证数据的完整性?

答:通过md5校验能确保完整性。会消耗一定的性能。最简单的方式可以在推送完成后,添加一个标签文件,但这种方式的容错性较低。

3、数据加载与卸载的顺序

答:先加载的方式。好处:加载失败后容易回退到之前的状态;坏处:会消费很多的内存。先卸载的方式。好处:内存使用不会超过平时状态;坏处:一旦后续加载新版本失败,处理比较麻烦。

4、版本中心提供sdk与client的区别

答:使用client的方式部署比较麻烦。在大数据交互的场景,使用sdk的性能更高(直接加载到进程中)。Client的方式可以做到与服务的隔离,对于服务的稳定性有好处。

5、如果有数据分片,如何控制每台机器加载哪几个分片?

答:添加了分片维度,对系统的复杂度提升了一个量级,不过基本的流程还是一样的,都是由版本管理中心来进行中心控制。

6、数据拉取由各服务自己拉取,还是有单独的推送服务推送?

答:数据由服务自己拉取,这样的好处是架构简单,数据统一存储在数据中心。坏处是所有的机器可能同一时间都向数据中心要数据,会造成数据中心异常繁忙,网络传输的效率低下。使用单独的数据推送服务,整体系统的复杂度上升,推送服务需要和版本管理中心保持通信,实时同步推送状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值