全网无感知迁移生产环境到VPC

背景

今年年初,我们将预发布环境迁移至VPC,测试了平滑迁移服务到VPC的可行性。当时的结论是:要达到用户无感知,迁移过程非常繁琐,除非阿里云在基础设施一层提供支持,否则很难应用到生产环境。详见《如何将服务从经典网络迁移到VPC》。

但在今年年中,阿里云推出了一系列有利于VPC迁移的功能,我们认为将整个生产环境迁移至VPC的条件已经成熟。

迁移

迁移难点

在《如何将服务从经典网络迁移到VPC》结尾提到,将服务迁移平滑迁移至VPC最大的障碍在于:

  • 迁移数据源到VPC

使用DTS可以很方便地同步数据源至VPC实例,但需要创建VPN使VPC服务能够访问到经典网络的数据源,且在最终切换时仍需要短暂停服。

  • 切换流量到VPC

由于SLB后端不能同时接入经典网络和VPC ECS,以至于只能移除经典网络节点再挂入VPC节点。这个过程中会造成分钟级的停服,且无法实现灰度引流。

今年6月,阿里云提供了三个新功能

  • 数据源混访

一键迁移经典网络数据源到VPC,且保留经典网络地址不变。数据源迁移到VPC后,依然可以被经典网络服务访问,业务配置不需要修改。相当于阿里云帮我们创建VPN且配置了地址映射,对已有服务完全透明,非常方便。

  • SLB混挂

VPC和经典网络的ECS可以添加到同一个SLB。这是最重要的一个改进,避免了分钟级的停服,又方便实现灰度测试。

  • ClassicLink

使经典网络的ECS可以和VPC中的云资源通过私网互通,避免自行搭建VPN网络来连通两个网络。

这三项功能,尤其是数据源混访和SLB混挂,能很好地解决以往迁移中遇到的两个难点。由于业务模型中不存在ECS之间的访问,实际迁移中我们几乎没有使用ClassicLink。

要说明的是,如果业务模型比较简单且没有平滑迁移的需求,则无需应用本文后面描述的高级策略,可直接使用阿里云的提供的“ECS迁移”功能,在控制台将ECS停机后一键迁移至VPC。

迁移方案

我们的业务模型如图1,nginx和service都是以docker容器的形式运行在ECS上。

在迁移顺序上有两种选择:

  • 自底向上迁移

先数据源切换至VPC,再迁移service,测试正常后最后迁移nginx到VPC。这种方式先迁移了底层服务,由于没有上层nginx引流,无法判断服务是否正常,所以需要做好测试。而且首先迁移数据源的风险也很高,数据源切换到VPC,所有服务通过经典网络地址访问数据源,需要先确认阿里云提供的这种跨网络访问的性能是否满足要求。

  • 自上而下迁移

先迁移ngix到VPC,该nginx访问经典网络service。确认正常后再迁移service到VPC,最后迁移数据源。这种方式的问题在于,nginx迁移到VPC后,是无法访问经典网络SLB的,必须创建一个VPC SLB,将经典网络service挂载到这个SLB上,然后再修改VPC nginx指向VPC SLB。

我们的业务调用比较复杂,上图是简化后模型,实际上service-1可能还调用了service-2,而service-2可能还调用了service-3甚至service-4,所以我们的迁移主要以第1种方式为主。

数据源跨区访问性能

对于上面第1种方式中提到风险,我们新开了RDS和Redis实例以测试数据源切换到VPC后的访问性能。

RDS

迁移RDS到VPC后,从VPC节点测试RDS性能:

  sysbench --test=oltp --oltp-table-size=1000000 --mysql-host=vpc-id.mysql.rds.aliyuncs.com --mysql-db=dbtest --mysql-user=service --mysql-password=password prepare
  sysbench --test=oltp --oltp-table-size=1000000 --oltp-test-mode=complex --oltp-read-only=off --num-threads=6 --max-time=60 --max-requests=0 --mysql-host=vpc-id.mysql.rds.aliyuncs.com --mysql-db=dbtest --mysql-user=service --mysql-password=password run

  OLTP test statistics:
      queries performed:
          read:                            112476
          write:                           40170
          other:                           16068
          total:                           168714
      transactions:                        8034   (133.80 per sec.)
      deadlocks:                           0      (0.00 per sec.)
      read/write requests:                 152646 (2542.13 per sec.)
      other operations:                    16068  (267.59 per sec.)

  Test execution summary:
      total time:                          60.0464s
      total number of events:              8034
      total time taken by event execution: 360.1141
      per-request statistics:
           min:                                 35.28ms
           avg:                                 44.82ms
           max:                                100.08ms
           approx.  95 percentile:              54.56ms

  Threads fairness:
      events (avg/stddev):           1339.0000/123.78
      execution time (avg/stddev):   60.0190/0.01

迁移RDS到VPC后,从经典网络节点测试RDS性能:

  sysbench --test=oltp --oltp-table-size=1000000 --mysql-host=classic-id.mysql.rds.aliyuncs.com --mysql-db=dbtest --mysql-user=service --mysql-password=password prepare
  sysbench --test=oltp --oltp-table-size=1000000 --oltp-test-mode=complex --oltp-read-only=off --num-threads=6 --max-time=60 --max-requests=0 --mysql-host=classic-id.mysql.rds.aliyuncs.com --mysql-db=dbtest --mysql-user=service --mysql-password=password run

  OLTP test statistics:
      queries performed:
          read:                            116620
          write:                           41650
          other:                           16660
          total:                           174930
      transactions:                        8330   (138.75 per sec.)
      deadlocks:                           0      (0.00 per sec.)
      read/write requests:                 158270 (2636.16 per sec.)
      other operations:                    16660  (277.49 per sec.)

  Test execution summary:
      total time:                          60.0381s
      total number of events:              8330
      total time taken by event execution: 360.0424
      per-request statistics:
           min:                                 34.20ms
           avg:                                 43.22ms
           max:                                193.89ms
           approx.  95 percentile:              52.10ms

  Threads fairness:
      events (avg/stddev):           1388.3333/97.04
      execution time (avg/stddev):   60.0071/0.01
Redis

迁移Redis到VPC后,从VPC节点测试Redis性能:

  redis-benchmark -n 10000 -q -h vpc-id.redis.rds.aliyuncs.com -a password

  SET: 43103.45 requests per second
  GET: 42735.04 requests per second
  INCR: 40000.00 requests per second
  LPUSH: 39215.69 requests per second
  RPUSH: 27654.01 requests per second

迁移Redis到VPC后,从经典网络节点测试Redis性能:

  redis-benchmark -n 10000 -q -h classic-id.redis.rds.aliyuncs.com -a password

  SET: 38610.04 requests per second
  GET: 40485.83 requests per second
  INCR: 41841.00 requests per second
  LPUSH: 37593.98 requests per second
  RPUSH: 25839.79 requests per second

测试数据显示,从经典网络访问VPC的数据源,其网络延迟几乎可以忽略不计。后来我们实际迁移的体验也证实了这一点。

自动化运维工具

一个服务迁移要到VPC,其对应的容器需要build两个镜像,经典网络镜像和VPC镜像,分别推送到经典网络和VPC各自的docker registry。两个镜像中配置不同,配置包括数据源地址和其他服务API接口地址,VPC镜像中使用VPC数据源地址和VPC私网SLB地址。我们很早就将代码与配置解耦,代码在git仓库,而配置则由运维平台统一管理。这种做法给迁移提供了很多便利,整个过程对开发是透明的。否则开发需要两个分支来维护不同的镜像,将大大增加开发成本。

绑定API地址

当在一个服务中调用其他API服务时,应避免将API服务的IP(私网SLB地址)直接写入配置文件,否则非常难以维护。例如要替换一个SLB,则需修改所有调用该SLB的服务配置,而且还很难知道这个SLB究竟被哪些服务调用。

我们的做法是,在配置文件中只填写API服务的域名(自定义“.lan”内网域名),由运维平台在服务部署时通过运维数据库为服务绑定所需IP(通过dokcer的add-host参数实现)。

数据源地址渲染

我们使用模板来渲染数据源地址,在service的配置文件中只需要填写抽象的键值。

  production:
    database: test
    host: #host#
    username: #username#
    password: #password#

在docker build之前,运维平台会使用运维数据库将这些键值渲染成实际的值。迁移VPC时只需要将配置文件渲染两次,分别推送到不同的docker registry。和绑定API地址一样,最终我们只需维护两套运维配置数据即可。

调用关系图

由于采用微服务架构,我们服务很多,调用关系也错综复杂。所前所述,服务所依赖的数据源和API服务都记录在运维数据库中,那么我们通过分析数据库就可以绘制出类似于图2的服务调用关系图。

有了服务调用关系图,在VPC迁移时我们才能知道应该先迁移哪些服务、迁移某个服务时需要先解决哪些依赖。例如我们采用自底向上迁移的顺序,那么就应该先迁移最靠近数据源且依赖其他API服务最少的服务。图2是service-1的调用关系图,service-1依赖两个redis实例和两个rds实例,同时也依赖服务service-2和service-3。如果要迁移service-1,除了准备好相应的数据源,还必须先迁移service-2和service3。

流量资费

最后,自建VPN打通经典网络和VPC的方案会产生额外的流量资费,而我们在迁移中采用的以下三种跨网访问方式:

  • SLB混挂
  • 数据源混访
  • 经典网络通过ClassicLink接入VPC网络

经工单确认,都不会产生流量资费。

时间: 2024-07-30 12:11:41

全网无感知迁移生产环境到VPC的相关文章

技术圈重磅!饿了么多活终于成功 实现首次多活生产环境全网切换

北京时间5月9日消息,饿了么CTO张雪峰,在朋友圈透露,饿了么多活(Multi-Active IDCs/Regions)终于取得成功,实现首次多活生产环境全网切换(灰度). 这家外卖巨头的CTO回顾到:"自去年八月决定做多活,历经半年规划.调研.设计.协调,又经过三个月所有技术团队连续冲刺开发.改造及业务/产品/运营等兄弟团队的鼓励.支持甚至容忍,今晚,我们终于做到了!" 张雪峰称:"据我所知(如不准确,请指出并见谅),国内日均(非峰值或大促期间)订单100万以上的交易平台,

python项目在无外网的生产环境解决沙盒依赖问题

python项目在无外网的生产环境解决沙盒依赖问题 在我们实际的生产项目部署过程中,比如银行,政务内网,无法访问某些依赖源.结合实际情况,我们看下如何解决这个问题. 开发环境 建立项目开发路径 mkdir -p /data/python/project/ 我们先查看是否有pip命令工具pip的命令行安装看官网链接:https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py root@-dev:/data/python/

生产环境数据迁移问题汇总

在测试环境中做了3轮数据迁移的演练,最终到了生产环境中,还是出现了不少问题,经过大半夜的奋战,终于是数据都迁移成功了.1)共享存储的配置问题 共享存储使用NFS来共享存储,但是在实际操作中发现配置出了问题,原因是因为两台服务器上的用户不同在,目标机器上没有任何写权限. -rw-r--r-- 1 3160 dba      6608 Jun 26 23:35 tmp_gunzip.sh         -rw-r--r-- 1 3160 dba       624 Jun 26 23:30 tmp

如何在生产环境运行容器

本文讲的是如何在生产环境运行容器[编者的话]Vivek Juneja是一名工作首尔的云服务工程师.他从2008年就开始接触云服务,是最早的AWS和Eucalyptus的使用者.本文中总结了在生产环境中使用容器的几个方面,特别是对虚拟机与容器的混合部署的观点很值得推荐给大家. 如果只是把容器限制在开发测试环境中,那么您并没有享受到面向容器研发和发布工作的全部红利.对在生产环境中使用容器的抵触情绪来源于对安全与隔离性的担忧,同时也包括对管理容器的运维经验的缺乏. 在不同程度上使用容器的组织中,迁移这

生产环境中使用Docker Swarm的一些建议

本文讲的是生产环境中使用Docker Swarm的一些建议[编者的话]实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes,Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它们之中,Swarm是Docker原生的,同时也是最简单,最易学,最节省资源的,至少值得我们多了解一下.本文将介绍一些非常实用的建议. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部

生产环境中Docker的持久化存储模式

本文讲的是生产环境中Docker的持久化存储模式[编者的话]在生产环境中使用Docker实现持久化存储一直是业界的热点问题,本文从到配置文件.机密材料.数据库.共享数据等方面做了些探讨,文中也谈到了一些需要避免的问题以及尽量将应用设计为无状态服务的原则. 一般看法认为容器对于无状态的应用程序是很好的,但是不适合有持久化数据的有状态应用.如果这是真的,这并不是因为技术不到位,而是因为管理持久化数据和有状态应用程序的模式并不总是为人们所熟知.你面临的挑战很多不是关于持久化状态的,而是如此操作不会影响

Q盘项目小结:体验细节追求无感知 轻打扰

项目背景 在互联网云时代的背景下,各类"云产品"层出不穷,云技术的完善发展让网络存储.实时同步存储畅通无阻.国外以Dropbox代表下网络同步存储市场已然成熟, 市值40亿的成绩意味着同步市场的强大潜力. 在这样的趋势下, 国内也陆续出现了金山快盘.115同步盘.T盘等同步产品,但并不完善.也就是说,国内同步市场仍然存在着极大的缺失,实时同步市场谁来称雄? 需求要点 Q盘应运而生.Q盘是QQ电脑管家提供的免费文件同步服务.登录同一个QQ帐号,就可以在不同电脑上查看并使用Q盘中的文件.当

生产环境使用 pt-table-checksum 检查MySQL数据一致性

公司数据中心从托管机房迁移到阿里云,需要对mysql迁移(Replication)后的数据一致性进行校验,但又不能对生产环境使用造成影响,pt-table-checksum 成为了绝佳也是唯一的检查工具. pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测MySQL主.从库的数据是否一致.其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最

阿里移动安全陈树华:安全的最高境界是无感知

导语:这是篇近万字的采访,探寻了阿里移动安全负责人陈树华如何从从零开始,打造阿里生态中最具重要一环--安全产品的文章. 在采访中,陈树华解释了自己为什么要从腾讯来到阿里,他认为,阿里有做真正安全产品的好土壤,能够把安全和业务深度融合,捍卫用户的价值.更为具体地来讲,那就是360手机卫士.腾讯手机管家等只是泛安全,只能解决一部分问题,解决不了深层次的问题. 对于如何成功打造阿里钱盾和聚安全这两款产品,陈树华称,这个归功于三方面:一个是,团队吃苦,有创造力:其次是阿里高管非常智慧,有足够的耐心,并且