分布式微服务改造,到底怎么做数据迁移?(下)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 分布式微服务改造,到底怎么做数据迁移?

回滚方案

可先将读流量切换到备库,再暂停应用的写入,将写流量切换到备库,这样所有流量都切到了备库,即又回到自建机房环境,就可认为已回滚了。

级联迁移方案可应用在将MySQL、Redis从自建机房迁移到云上的场景。

缺点

在切写的时候需要短暂的停止写入,对于业务来说是有损的,不过如果在业务低峰期来执行切写,可以将对业务的影响降至最低。

数据迁移时如何预热缓存

从自建机房向云上迁移数据时,也要考虑缓存的迁移方案。

缓存本来就是作为一个中间的存储而存在的,我只需在云上部署一个空的缓存节点,云上请求也会穿透到云上数据库,然后回种缓存,对于业务没有影响。

但还要考虑缓存命中率。


如部署空缓存,那所有请求都穿透到DB,DB可能宕机,这样你的服务不可用了。所以,缓存迁移重点是保持缓存热度。


Redis数据迁移可使用双写或级联同步方案,所以这里就不考虑Redis缓存的同步了,而以Memcached为例说明。

使用副本组预热缓存

为保证缓存可用性,可部署多个副本组尽量将请求阻挡在DB层之上。

数据的:

  • 写入流程,写入Master、Slave和所有的副本组
  • 读取数据时,先读副本组数据,若读取不到,再到Master和Slave加载数据,再写入到副本组


那么,我们就能在云上部署一个副本组,这样,云上应用服务器读取云上副本组,若副本组未查到数据,即可从自建机房部署的主从缓存上加载数据,回种到云上的副本组上。

  • 副本组迁移方案示意图

image.png

当云上部署的副本组足够热后,即缓存命中率达到至少90%,就能将云机房上的缓存服务器的主从都指向该副本组,迁移完成。


这种方式够简单,但致命问题:若云上请求穿透云上副本组,到达自建机房的主从缓存时,这个过程需要跨越专线。


这不仅会占用大量专线带宽,同时专线延迟相比于缓存的读取时间是比较大的,即使是本地不同机房之间的延迟,也会达到2~3ms,则一次前端请求可能会访问十几次甚至几十次缓存,一次请求就会平白增加几十ms甚至过百ms延迟,极大影响接口响应时间,因此在实际项目中很少用这种方案。


但是这种方案给了思路,可以通过方案的设计在系统运行中自动完成缓存预热,所以改造副本组方案,尽量减少专线带宽占用。

改造副本组方案预热缓存

改造对读写缓存的方式:

  1. 在云上部署多组mc的副本组,自建机房在接收到写入请求时,会优先写入自建机房的缓存节点,异步写入云上部署的mc节点
  2. 在处理自建机房的读请求时,会指定一定的流量(比如10%)优先走云上的缓存节点,这样虽然也会走专线穿透回自建机房的缓存节点,但是流量是可控的
  3. 当云上缓存节点的命中率达到90%以上时,就可以在云上部署应用服务器,让云上的应用服务器完全走云上的缓存节点即可

image.png

  1. 这就能实现缓存数据的迁移,又可尽量控制专线的带宽和请求的延迟情况,可直接在项目使用。

总结

双写是DB、Redis迁移的通用方案,可直接使用。双写方案中最重要的,是通过数据校验保证数据一致性,这就能在迁移过程中随时回滚。

数据库的迁移,则数据校验应该是最需花时间解决的。


若需要将自建机房的数据迁移到云,也可考虑级联复制,会造成数据短暂停写,需在业务低峰期执行。


缓存迁移重点是保证云上缓存的命中率,你可以使用改进版的副本组方式来迁移,在缓存写入的时候异步写入云上的副本组,在读取时放少量流量到云上副本组,从而又可以迁移部分数据到云上副本组,又能尽量减少穿透给自建机房造成专线延迟。


若是自建机房迁移到云上,那么专线的带宽一定是你迁移过程中的一个瓶颈点,你需要在迁移之前梳理清楚有哪些调用需要经过专线,占用带宽的情况是怎样的,带宽的延时是否能够满足要求。你的方案中也需要尽量做到在迁移过程中同机房的服务调用同机房的缓存和数据库,尽量减少对于专线带宽资源的占用。

FAQ

这里的迁移是指的旧库迁移到新库,新旧库的表结构基本一样。但如果系统重构后的迁移就很难做了。我以前遇到一个大的系统,整个db里面有几千张表。重构后采用微服务的方式,原来的一个db分成了10多个db,还做了分表。有些原来旧库的表也做了拆分,合并,字段的增加、减少等。旧库表中的有些字段名字都重新命名了。这样的数据迁移都是狗血的数据迁移。整个公司组建一个数据迁移团队,包括开发,架构师,技术总监,dba,运维等几百人,数据校验也基本都是人工校验。耗几个月才完成了数据迁移。而且问题一大推。面对如何奇葩的数据迁移,有什么好方案?


数据的同步可以考虑解析binlog来同步。校验就真的没辙了,我之前经历的大的数据迁移都是已月为单位的。


业务不做改造的话,无论哪种方案,要想新老环境数据一致,都需要短暂的禁写。即使是业务层做改造,按不同的模块双写数据库,同时MySQL新老环境相互同步,但在具体切换的时候,也要考虑主从延迟,从这点来看,其实还是会有一段时间的禁写。

系统升级案例分享

老系统为.Net+SqlServer,新系统是Java+Mysql。


业务由于是直接基于标品二次开发,所以存在新老系统的业务兼容和数据兼容,并不能简单的通过双写就解决问题。


引入kafka和两个数据同步服务,两个服务之间商定共同认可的统一业务消息体,互相实时发送增量消息,并解析对方发送来的消息结合自己的业务入库。


流量在网关层依据某个hander标识字段去分流,用apollo开关可以随时掌控切换的比例。做到随时能进能退。


数据校验:


  • 对全量我们采用了业务抽检+总数校验
  • 对增量我们才用了T+1后的增长量校验


为了验证新系统的业务准确性,还在网关层做了流量拷贝,响应对比等。

目录
相关文章
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
13天前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
35 2
|
14天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
3月前
|
数据库 C++ Ruby
为什么你应该选择分布式平台与微服务?
为什么你应该选择分布式平台与微服务?
|
3月前
|
监控 Go API
带你十天轻松搞定 Go 微服务之大结局(分布式事务)
带你十天轻松搞定 Go 微服务之大结局(分布式事务)
|
3月前
|
监控 Java 开发者
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流。本文探讨Java微服务架构的设计原则与实践。核心思想是将应用拆分为独立服务单元,增强模块化与扩展性。Java开发者可利用Spring Boot等框架简化开发流程。设计时需遵循单一职责、自治性和面向接口编程的原则。以电商系统为例,将订单处理、商品管理和用户认证等拆分为独立服务,提高可维护性和容错能力。还需考虑服务间通信、数据一致性及监控等高级话题。掌握这些原则和工具,开发者能构建高效、可维护的微服务应用,更好地应对未来挑战。
82 1
|
3月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
3月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
60 0
|
3月前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)