闲鱼社区如何快准稳的完成无缝数据迁移

简介: 用户无感知,数据无差异,方案可回滚,异常可监控

作者:闲鱼技术——长明

背景:

在内容社区中,内容标签用来辅助说明内容,内容标签对内容分发和理解具有重要作用,能够帮助内容社区将对的内容分发到对的人。目前闲鱼会玩社区的标签分为分类和属性标签两种,两种标签的用法不同,但是目前二者都是存在于同一个标签系统中,目前会有如下问题:

  • 易出错,靠人为去辨别分类标和属性标,难免会出错,出现漏打,错打
  • 难拓展,属性和分类属于不同的业务域,有各自独有的特性,现状无法让二者独立拓展

为了解决以上问题,现在要将原标签系统拆分为分类系统和属性系统,具体来说,会将属性标从原标签系统中拆分到属性系统,然后将原标签系统作为新分类系统。整个过程,不仅需要迁移底层数据,还需要将属性服务从原标签系统迁移到新属性系统。

image

现状:

如下图所示,闲鱼会玩社区对属性标签依赖非常之多,除了自身的业务系统之外,还有图中标蓝的算法、搜索、数据等也会依赖。迁移过程中需要保证这些上层依赖不受影响。另外,业务方希望能够尽早启用属性系统,尽快提高打标效率。总结起来,迁移过程中面临了如下的挑战。

  • 快,短时间内迁移完成,尽早使用新属性系统
  • 稳,依赖众多,在迁移时需要保证属性服务可用,不影响上层业务,用户无感知
  • 准,迁移最最最基本的要求就是要保证数据正确

image

迁移方案:

我们按照影响面从小到大的顺序,制定了 1.底层存储同步、2.建设隔离层、3.业务读写迁移、4.依赖迁移、5.启用新属性系统共五步。其中依赖是指搜索、算法和数据,这些依赖影响面较广,迁移需要更加慎重,需要有己方业务迁移正确这个前提作为保证。因此依赖迁移需要单独列为一部分,且放在己方业务迁移完成后进行。迁移中的每一步迁移需要保证上一步正确,且出现问题,每一步都可以回滚回上一个正确状态。为了保证数据的一致性,我们全程都有数据校对服务。

image

迁移过程

1. 存储迁移

整个迁移过程,我们首先先从底层存储开始同步,为了保证原标签系统和属性系统中的属性标签相同。实现这个目标需要从两方面做起,一方面是全量同步,就是将全部数据同步一遍。一方面是实时增量同步,一旦有新的属性标签被写入原标签系统中,那么属性系统中也要同步一份。这个套路比较固定。下面是我们全量同步的数据处理过程。

image

其中同步任务我们直接使用了 阿里云 提供的 scheduleX 分布式任务工具。全量同步过程中要注意,控制同步速率、配置告警、做好异常记录和完成进度记录。控制同步速率是需要避免把依赖服务系统打挂,影响其他正常业务。配置告警是为了及时发现异常,及时排查。其中异常记录是为了排查问题的,必然要记录的。完成进度记录也是非常重要的,一旦出现问题,修复完了要继续时,可以直接从上次记录的同步位点开始同步。

讲完了全量同步,下面讲一下实时增量拆分的过程,数据流过程如下图所示。即一旦触发了原标签系统变更,会实时将属性标的变化同步到属性系统。

image

2. 隔离层建设

屏蔽迁移细节

做了存储迁移,那么现在属性系统和原标签系统中的属性标相同了,下面可以做业务读迁移了。业务迁移,这是迁移过程中工作量最大最复杂的地方,需要梳理清楚依赖很多。经过梳理发现,多个应用多个业务场景都在使用原标签系统。假如逐个迁移改造,一方面重复性工作比较多,需要重复验证的功能点多,另一方面,迁移细节无法统一管理,一旦有问题,需要逐个应用修改。所以在做业务迁移之前,我们做了一件事情,就是将散落在多个应用的读写原标签系统的操作都收归到了一个 jar 包中,然后在该 jar 中统一控制读写切换。jar 包相当于一个隔离层,隔离了上层业务和属性标签的存储逻辑。这样上层业务系统不必关心属性标是从原标签系统读取的抑或是从属性系统中读取的,只管从隔离层提供的方法中读取即可。有了隔离层统一管理,可以同时统一迁移,减少不必要的重复工作。具体的变化从 a 图变换到 b 图。

image

接口适配

由于分类系统和属性系统两种标签的业务语义和功能不同,内容中台对这两个系统的领域建模也不同,对应的数据服务接口能力也不同,为了让上层业务对此无感知,我们保持原服务接口不变,在隔离层做了对于分类系统和属性系统两个系统的适配。

3. 业务读写迁移

读迁移

前置工作做完之后,我们开始具体的读迁移。读迁移是最好做的,可以先按照比例切流,逐步放量从属性系统中读取属性标,一旦发现有问题,那么直接将流量切回读原标签系统 ,没有问题,就直至全量。

image

写迁移

写迁移是很难一刀切的,一方面,即使是经过了梳理,还是可能会有遗漏的地方。另一方面,还有部分依赖方的写入(比如内容中台的标签写入)不在我们这边,暂时无法迁移。假如己方业务的写迁移了,那么己方业务只会写到属性系统 ,而没迁移的依赖方只会写到原标签系统。这会造成原标签系统和属性系统的属性标数据不一致。这导致两方面的问题,一方面,影响依赖方读,依赖方读的还是原标签系统,读取不到属性系统上的属性标。另一方面,两方不一致的话,如果属性系统出现问题,那么写无法即时回滚到原标签系统。

因此在迁移过程中,还需要保证原标签系统和属性系统上的属性标时刻是相同的,在存储拆分中,已经有了 原标签系统-> 属性系统的同步链路,现在还需要将只写入属性系统的属性标同步回原标签系统。

那么现在有 原标签系统->属性系统 和 属性系统 -> 原标签系统 两条同步链路。如果不做任何控制的话,明显会出现同步死循环原标签系统->属性系统->原标签系统。解决这种双向同步死循环的一般办法是加标志,用标志标识这次数据变更是源自哪一方,当发现自己的更新消息回流到了自己这里,那么就不再更新,这样就切断了更新的死循环。

image

4. 依赖方迁移

当己方业务能够保证无误的时候,那么可以做依赖迁移了。依赖方一般为算法、搜索和数据等。链路分为实时链路和离线链路。对于实时链路,这部分工作因为有了前面的业务读迁移,可以复用;对于离线链路,提供好离线数据表给到相关依赖方,让他们按时迁移完成即可。

5. 启用新属性系统

依赖方也迁移完成后,经过一段时间的观察,没有问题,便可以使用新的属性标签系统来打标了。启用新系统打标的之后,便不再需要 原标签系统->属性系统 的同步链路了,可以停止。后续再观察一段时间后,确认使用属性系统无问题后,便不再有将读写切回原标签系统的必要了,可以再切断 属性系统 -> 原标签系统 的同步链路,至此迁移完成。

6. 数据校对任务

在整个同步过程中,还要有对账任务来实时查看同步的数据是否正确。如果发现数据不正确,要及时找到原因,修正,然后做好数据矫正。

image

总结

本次迁移排除依赖方迁移所用时间外,共计两周。

  • 迁移过程中属性服务正常。零客诉舆情。
  • 迁移后,数据零差异。

最后捋一下本次迁移中的经验点

  • 迁移过程中,如果服务依赖众多,可以用隔离层来隔离依赖对迁移的感知。
  • 双写,过程中避免出现同步死循环,可以通过给更新消息加标志避免。
相关文章
Altium Designer导出Gerber文件的步骤
在设计好PCB之后就需要发出去制作,一般我们都会选择发送Gerber文件。当然也可以发送PCB原文件,只不过这样没有保密性,这个根据自己的实际情况来选择。如果PCB对于保密性没有要求,自己对工艺又不是很了解的话,为了方便可以直接发送PCB原文件。这里还是建议大家导出Gerber文件做比较好,下面我们就来看一下Altium Designer如何导出Gerber文件。
5800 0
|
1月前
|
人工智能 自然语言处理 数据可视化
2026年阿里云万小智 AI 建站系统介绍及测评
阿里云万小智 AI 建站系统基于通义大模型开发,以 “低门槛、高效率、全集成” 为核心优势,无需专业开发能力即可快速搭建网站,分为基础版、标准版、企业版三个层级,覆盖从个人博客到中大型企业官网的需求,且购买即赠.CN 域名,降低建站成本。以下从核心特性、版本差异、价格规则及场景适配展开解析,提供客观选型参考。
了解一下,Java8 Stream的中间操作顺序
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 垂直执行:map和filter先看下面一个例子,找出流中"b"的字符串,并将其转化为大写,包含两个中间操作 map 和 filter 以及结束操作forEach。
了解一下,Java8 Stream的中间操作顺序
|
关系型数据库 MySQL 测试技术
不停机更换数据库解决方案
随系统规模逐渐增长,总会遇到更换数据库问题。 对MySQL分库分表后,需要从原来的单实例数据库迁移到新的数据库集群 系统从传统部署方式向云上迁移的时候,也需要从自建的数据库迁移到云数据库
467 0
|
存储 SQL 缓存
LSMT存储引擎浅析
LSMT存储引擎浅析
805 1
LSMT存储引擎浅析
|
前端开发 API Android开发
BFF 架构简介
BFF 架构简介
1365 0
BFF 架构简介
|
存储 消息中间件 监控
主流开源APM:Zipkin/Pinpoint/SkyWalking全面对比
这里重点从探针的性能、Collector的可扩展性、调用链路分析、完整的应用拓扑、对于科技人员使用友好程度(部署安装、埋点接入、使用管理)几个方面来进行对比。
|
容器 监控 Docker
容器监控工具(1)Docker自带命令 & Weave Scope & cAdvisor
本篇会介绍几个目前比较常用且流行的容器监控工具,首先我们来看看Docker自带的几个监控子命令:ps、top以及stats,然后是一个功能更强的开源监控工具Weave Scope,最后我们来了解一下Google开发的容器监控工具cAdvisor。下一篇我们会结合本篇学习的内容介绍生产级监控方案:Prometheus + cAdvisor + Grafana。
2645 0
容器监控工具(1)Docker自带命令 & Weave Scope & cAdvisor
|
编解码 监控 Linux
嵌入式Linux下LCD应用编程: 读取摄像头画面完成本地视频监控画面显示
嵌入式Linux下LCD应用编程: 读取摄像头画面完成本地视频监控画面显示
622 0
嵌入式Linux下LCD应用编程: 读取摄像头画面完成本地视频监控画面显示