闲鱼是这样高效稳定完成项目迁移的

简介: 逐个突破+周全设计+业务理解=稳

作者:闲鱼技术——桥泥

1. 项目背景

笔者收到通知,有一个中心化项目需要迁移为部门自建。项目为微服务发布平台,包括闲鱼、淘宝、支付宝、天猫等许多部门的业务,都统一部署在此平台。由于中心化的部署方式有相应的运维和使用的不便,出于规避安全风险考虑,避免双十一期间多业务互相影响产生故障,平台方通知各业务方,进行微服务平台自建。

本项目时间紧急,到deadline总计16个工作日,大概三周时间。
通过对项目背景的梳理,基本的代码阅读,迁移文档的了解,面临的挑战主要有:

  • 项目代码复杂,依赖的中间件多,项目流程长。
  • 数据迁移,项目同时存在mysql和nosql,需要保障数据一致,且不能影响旧业务。
  • 功能验证复杂,除去基本的业务逻辑,还需要检查中间件的功能,且有多应用交互行为。
  • 稳定性保障,新旧项目需要完全隔离,互相不能影响。

相信大家在迁移项目的过程中都或多或少遇到类似的问题,接下来我们来结合实际的处理案例一起看下,笔者是快速安全的克服这些困难。

2. 克服困难

为了方便读者阅读,这里先简单介绍下要迁移项目的功能。
appflow

下面,结合具体的困难,一起看下迁移细节。

2.1 复杂的项目代码

一个要迁移的项目,一定是一个经年累月的老项目,有着庞大的体积,复杂的逻辑,和糟糕的代码味道。面对这样一个项目时,我们又该怎样去快速完成新项目的启动,拿下万里长征的第一步呢?

首先,写代码最快的方法就是粘贴别人的代码(并没有),我们先直接clone一份旧的代码库,git remote set-url origin {new repo}指向新的代码仓库。

接下来,新老项目依赖的配置,部署的方式,乃至运行的服务器,必然是不同的。那么,需要做一些基本的替换:

  • 项目名替换,旧项目名称全局替换
  • 配置替换(代码/中间件),申请新的中间件,在配置文件里替换
  • 域名替换,控制台带有前端页面,需要调整相应的域名
  • 代码包名替换,为了和旧服务完全区分,新的服务需要提供新的jar/war包。
  • dockerfile替换,dockerfile启动项会存在和项目相关的信息,也需要做统一的替换。

最后,进行本阶段验收:

  • 本地可以启动服务
  • 本地打包版本正确

在一系列替换操作下,我们不需要彻底理解老项目,也可以成功运行。这个过程势必会遭遇很多启动失败,我们也可以从失败中吸取经验,了解项目启动的必要条件。
这个过程从9.23开始,到9.27截止,总计经过4个工作日。

2.2 数据迁移

项目迁移的过程中,数据迁移是不可避免,也至关重要的一环。服务的本质是数据的流入和流出,服务的迁移必然涉及数据流的迁移。
一般而言,服务会依赖mysql做复杂数据的持久化存储,nosql做缓存或其他简单结构存储。持久化存储必然需要进行迁移;过期时间短的缓存一般是不需要做迁移的,因为会自动过期;其他存储在nosql的简单结构也需要迁移。
经过以上分析,为了解决数据迁移保障数据一致的问题,笔者进行了以下处理:
datamove

迁移过程中有几个需要注意的点:

  • 新老项目数据库完全区分。避免写入脏数据
  • 库表结构一致性。避免上线后出现问题
  • 数据一致性定期校验,避免数据不同步带来的业务影响

通过简单的依赖梳理和迁移工具的运用,可以最小化工作成本和操作风险,迅速完成任务。笔者最终在2个工作日内处理完毕。

2.3 功能验证

本次要去中心化的项目为微服务平台,本身涉及的中间件众多,且涉及到和其他服务的交互,验证流程非常长。如果不做好回归测试的计划,很难保证功能的完整可用,也会为后续的使用带来安全隐患。
为顺利完成复杂的功能验证,在接手项目之初,我们就应该对项目的各种流程有一个清晰的认知,事先列举检查点,对可能的风险和问题有一个预估。
以本次迁移的项目为例,业务检查点主要有:

  1. 登录权限申请
    check_login
  2. 微服务列表展示
    check_list
  3. 微服务创建
    check_create
  4. 微服务发布
    check_publish

技术检查点包括:

  • 数据库读写
  • 消息队列,发布/消费
  • 其他中间件使用
  • 网络配置

以上,笔者整理了项目业务/技术上的检查点。在项目启动成功后,一般需要经过测试 - 预发布 - 生产,三个环境的验证,在每个环境部署成功后,都需要对以上的检查点进行检查。

以消息队列迁移的验证为例:
check_msg

这个过程中,笔者也遭遇过一些问题,比如因为消息未广播发送,发生消费成功但微服务无法全部更新的情况等。消息队列无法正常打通可能有多种多样的原因,生产、消息通路、消费都需要进行仔细的验证。

总结下,业务上,我们观察业务流程是否正常;技术上,我们通过技术手段检查:

  • 观察服务日志,中间件日志
  • debug工具观察代码执行,对于java开发,可以使用arthas工具,idea的远程调试等
  • 数据库读写数据验证,消息队列接发消息验证等。

在功能验证过程中,我们不可避免的会遭遇各种各样的问题,有心理预期,对症下药,迅速针对问题作出处理,可以有效的提升工作效率,加快迁移进程。
以上流程从9月29日开始,到10月13日截止,经历4个工作日。

2.4 稳定性保障

新项目迁移上线完毕后,还有非常重要的一个环节:稳定性保障。怎么保障新项目的服务稳定?怎么保障新项目的功能使用不会影响到老项目?怎么完成新老项目的交接替换?这些都是我们接下来要讨论的问题。

首先,我们先要保证新项目的稳定性,一般而言,需要对应用本身配置监控,包括但不限于:

  • 服务器基准监控
  • jvm监控
  • 服务接口监控
  • 服务中间件监控

然后,确认新老项目的隔离,一般而言,完全隔离开新老项目的数据库、消息队列等中间依赖,完全隔离部署服务器即可。
接下来,需要确定新老项目的交接替换方案,通常来说流程如下:
checkout
几个需要注意的点:

  • 业务上交割时点确认后,需要保证新老项目的同时可用。
  • 发生问题时,可以用老项目做备用来完成业务功能。处理完新项目的问题,继续进行切流。
  • 整个项目上线后,需要一段时间的持续观察,确保观察期间没有意外的问题发生,才能正式结束迁移。

3. 总结

笔者迁移的微服务平台,上线后对其进行了两周的观察,进行了数次微服务发布等。确认应用完全去中心化,业务功能正常,且服务运行稳定。
完整的迁移工作流如下:
moveflow
整个流程复盘下来,从项目部署,到项目启动,再到功能验证,最后的稳定观察,笔者都遭遇了各种各样的问题,但是,借助于完善的迁移计划,充足的准备工作,和多位同学的协助,迁移仍然在十个工作日内完成。复盘下来,要点有三:

  1. 拆分复杂问题,逐个突破
  2. 方案考虑周全,减少风险
  3. 充分理解项目,保障业务

迁移充满了安全风险,我们要勇敢的面对风险,包容风险,给出完整的解决方案,希望本文介绍的迁移经验能为读者带来些许的帮助,让迁移更加安全,更加高效。

相关文章
|
12天前
|
运维 负载均衡 监控
运维之光:打造高效、稳定的IT环境
在数字化浪潮中,企业对IT系统的依赖日益加深。本文将深入探讨如何通过高效的运维管理,构建一个稳定可靠的IT环境,确保业务连续性和数据安全。我们将从基础架构的优化、自动化工具的应用、团队协作与沟通的重要性,到持续学习与创新的必要性等方面进行详细阐述。无论你是初入运维领域的新手,还是希望提升现有系统性能的资深专家,这篇文章都将为你提供宝贵的见解和实用的策略。
24 1
|
22天前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
|
1月前
|
运维 监控 安全
运维之道:构建高效、稳定和安全的系统
在数字化时代的浪潮中,运维(运营与维护)的重要性日益凸显。本文深入浅出地探讨了如何构建一个高效、稳定且安全的系统,从基础设施的搭建到日常的监控管理,再到安全防护的策略实施,每一个环节都是确保业务连续性和数据安全的关键。通过实例分析和最佳实践的分享,旨在为读者提供一套完整的运维解决方案,帮助团队提升运维效率,降低风险,保障业务的稳健发展。
|
2月前
|
运维 监控 关系型数据库
阿里云Serverless高可用架构深度评测:构建稳定高效应用的全面指南
随着云计算技术的迅猛发展,Serverless计算作为一种新兴的、以事件驱动的无服务器架构,正在逐渐改变企业构建、部署和管理应用程序的方式。阿里云,作为全球领先的云服务提供商之一,提供了全面的Serverless解决方案,包括PolarDB MySQL Serverless集群和Serverless应用引擎等产品,致力于帮助用户构建高可用、高弹性、低成本的应用系统。本文将深度评测阿里云的Serverless服务,从产品功能、使用体验、部署常见问题、文档与支持的全面性等维度出发,为开发者和企业提供实用的参考。
83 0
|
3月前
|
消息中间件 Kubernetes Kafka
AutoMQ 自动化持续测试平台技术内幕
Marathon 是一个针对流系统 AutoMQ 的自动化持续测试平台,旨在在模拟生产环境和各种故障场景中验证 SLA 的可靠性。设计原则包括易拓展、可观测和低成本。平台采用分布式架构,Controller 负责资源管理和任务编排,动态调整 Worker 数量和配置,而 Worker 是无状态的,用于生成负载和上报数据。系统基于 K8S,利用服务发现、事件总线和 Spot 实例降低成本并提高弹性。测试场景以代码形式描述,支持不同流量模型和断言,提供丰富的可观测性和告警功能。未来,Marathon 有望泛化为适用于各种分布式系统的测试平台。
41 0
AutoMQ 自动化持续测试平台技术内幕
|
4月前
|
存储 监控 Kubernetes
构建高效稳定的云原生日志监控系统
【5月更文挑战第26天】 随着微服务架构和容器化技术的普及,传统的日志监控方法面临重大挑战。本文将探讨如何构建一个既高效又稳定的云原生日志监控系统,该系统旨在提供实时的日志分析能力,同时保证系统的高可用性和可扩展性。我们将讨论利用现代技术栈如Fluentd、Elasticsearch和Kibana(EFK栈)来搭建日志收集、存储和可视化的解决方案,并深入探讨如何通过容器编排工具如Kubernetes来实现日志服务的自动伸缩和故障恢复。此外,我们还将介绍一些最佳实践,帮助运维团队在保持系统性能的同时,降低资源消耗和运营成本。
|
4月前
|
运维 监控 持续交付
构建高效稳定的云基础设施:最佳实践与案例分析
【5月更文挑战第31天】本文旨在探讨如何通过采纳现代云基础设施的最佳实践,构建一个高效且稳定的运维环境。文章将详细讨论云计算资源管理、自动化工具的应用、持续集成/持续部署(CI/CD)流程的优化以及监控和日志分析的重要性。通过对具体案例的分析,我们展示了这些策略如何在实际环境中提升系统的可靠性和性能,同时减少潜在的风险和成本。
|
4月前
|
DataWorks 监控 安全
|
11月前
|
缓存 负载均衡 监控
聊聊深入挖掘业务需求,可0-1设计高可用、高并发、高伸缩的分布式项目架构,环境搭建、自动化部署、服务器环境线上排查、性能评估
聊聊深入挖掘业务需求,可0-1设计高可用、高并发、高伸缩的分布式项目架构,环境搭建、自动化部署、服务器环境线上排查、性能评估
|
SQL 运维 Oracle
云上“升舱”,升级到速度更快,功能更全面,性价比更高的数仓平台
阿里云AnalyticDB“升舱”活动致力于帮助您将线下或自建的数仓全面迁移至云原生架构之上,享受全托管的使用体验;为企业构建数据平台带来速度更快,功能更全面,性价比更高的数据平台
云上“升舱”,升级到速度更快,功能更全面,性价比更高的数仓平台