1.前言
将线下服务器系统整体搬迁上云是上云客户的一个常见需求。对于1-10台少量级服务器的迁移需求有很多上云方案可以应对,然而上百台量级服务器的迁移上云就是一个没那么简单的工程问题。本文记录了某平台客户使用迁云工具将500台服务器系统批量迁移上阿里云公有云平台的案例,希望能给有类似需求的客户提供一些批量迁云方案作参考。
2.案例背景
2018年6月,迁云需求群里有业务同学来咨询,上来就开门见山:某客户线下云平台需要整体迁移到阿里云公有云平台,有将近500台服务器系统需要迁移,因为数量大、应用多,重新部署的方式太麻烦基本不考虑,看有没有其他的思路。继续从业务同学那儿了解得知,包含这些需求:
1.这些系统80%以上是虚拟机,其余是物理机,所以需要同时支持P2V和V2V场景;
2.这些系统版本绝大部分是Linux,还有少量的Windows Server,都需要能迁移;
3.希望能以制作镜像的方式迁移,等需要用的时候再创建实例即可。
而这些需求,刚好都在迁云工具的功能支持之列。于是我们还是向业务同学推荐了使用迁云工具的方案。
3.初次迁云演练
无论使用什么迁移工具或方案进行系统迁移工作,提前进行基本的迁移演练是必不可少的过程。
于是业务同学马上联系了客户,参照迁云工具帮助文档快速熟悉了一下基本的使用方法之后,找了台测试系统就开始上手做迁云测试:
1.先下载迁云工具到待迁移系统;
2.再简单配置一下迁移源和目标镜像信息;
3.然后运行迁云工具等待即可。
结果10分钟左右就将一个带数据盘的CentOS系统迁移到ECS公有云平台生成了镜像。接着使用该镜像创建了一个按量实例,启动后验证了一下整体系统应用服务,结果基本正常,测试流程初步通过。
对这个测试结果客户表示基本满足需求,同时希望尽快展开迁移任务。
4.批量迁云实战
1台系统的迁移还好说,然而对于500台这么大批量的系统,如何更加方便的迁移上云呢?来看看客户实际上是怎么做的。
4.1.自动化批量运维工具
一般来说,对于大批量的服务器系统,都会配备自动化运维工具来统一管理。客户的批量系统管理场景里面,用的自动化运维工具是比较常用的Ansible。先简单介绍一下:
Ansible是一种很强大的自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能。使用Ansible可以很方便的完成一些需要重复操作的工作,比如:向100台服务器拷贝同一个文件,或者同时在100台服务器上安装Apache服务并启动。
对于这次批量迁移任务,也可以使用类似Ansible这样自动化批量运维工具来做。
4.2.迁云工具命令行调用
自动化运维工具的一个常用功能就是可以批量下发并执行脚本,所以只要被执行的工具能够支持在命令行中调用,理论上都能被批量的执行。
而迁云工具本身就是一个轻量绿色的客户端工具程序,无需安装或复杂配置即可使用。同时迁云工具提供一系列的命令行参数,专为命令行调用场景做了很多支持。
比如:--noenterkey 禁用交互,--nocheckversion 禁用提示版本更新,--progressfile 设置进度日志文件可以方便跟踪等。
4.3.批量迁移任务脚本
了解了Ansible的功能之后,我们就知道用它来批量下发迁云工具和执行迁移任务是很合适的。
客户根据实际迁移任务需要编写了自动化批量迁移任务脚本,主要做了以下几个工作:
1.批量下发迁云工具到待迁移服务器;
2.批量配置迁云工具,如目标镜像名等信息;
3.批量执行迁云工具,同时获取迁移任务结果。
以下是相关脚本示例:
#首先向所有服务器发送迁云工具程序
ansible -f 6 -i host.file all -m copy -a "src=go2aliyun_client1.2.9.1_linux_x86_64.zip dest=/temp"
#然后解压缩程序
ansible -f 6 -i host.file all -m shell -a "cd /temp && unzip go2aliyun_client1.2.9.1_linux_x86_64.zip"
#再执行修改配置文件脚本
ansible -f 6 -i host.file all -m shell -a "cd /temp/go2aliyun_client1.2.9.1_linux_x86_64 && ./config.sh"
sleep 120
# 配置文件脚本./config.sh工作是配置目标镜像名,主要根据子网IP来配置。(其他配置如AK,区域、磁盘信息等都是一致已配置好的)
#!/bin/bash
image_name=`ip a | grep inet | grep eth0 | grep brd | awk '{print $2}' | awk -F '/' '{print $1}'| awk -F '.' '{print "move_"$1"_"$2"_"$3"_"$4}'`
sed -i "s/IMAGE_NANE/${image_name}/" user_config.json
#最后执行迁移脚,同时运行并发量是6个
ansible -f 6 -i host.file all -m shell -a "cd /temp/go2aliyun_client1.2.9.1_linux_x86_64 && chmod +x go2aliyun_client &&./go2aliyun_client --nocheckversion --noenterkey"
#获取迁云结果,从client_data中获取生成的镜像Id以及完成状态
#判断client_data里的status自带,如果是Finished则表示迁云完成,同时image_id字段就是最终生成的镜像Id。
4.4.ECS资源额度申请
批量迁移过程中需要创建对应数量的ECS资源,可能会超过用户默认的ECS资源存量额度(Quota)上限,因此可以提前向阿里云提出提高以下资源额度上限申请:
- 按量收费的ECS实例vCPU额度;
- 自定义镜像额度。
4.5.初步迁云实战效果
准备就绪之后,客户就开始进行首批批量迁移任务。结果也比较顺利,白天几个小时陆陆续续迁移了近100台系统。客户侧专门提供了200M的宽带来做迁移,一台数据量4GB左右的系统从数据传输到打快照制作镜像平均15分钟以内就能完成:
初战告捷,客户有了更多的信心,准备加大迁移队列,开始进行后续批次的迁移任务。
5.批量迁移过快引发的“血案”
正所谓车技再厉害,也怕出意外。大批量迁云肯定不会那么的一帆风顺,一些特殊情况可能会干扰正常迁云的进行。这次批量迁移过程中也遇到了一个突然的问题考验。
5.1.发现问题
客户第二批次迁移开始没多久,迁云移数据后台开始报了大片迁移异常通知。看错误原因,发现都是一样的访问迁云服务网络异常中断导致迁云失败。排查迁云服务端服务一切正常,但是客户侧telnet测试服务还是反复报Connection closed by foreign host的错误。通过在阿里云侧和客户侧抓包发现两侧都收到了reset信号,看不出来是哪边的问题。因为客户侧IP和服务端口可以说是固定的,就有两个怀疑:
A.客户侧IP或服务端口被客户侧网络运营商出口限制了;
B.或者被阿里云侧网络入口限制了;
5.2.排查问题
在确认了迁云服务端服务本身是正常的情况下,先让客户确认本地网络防火墙有无出口限制,反馈没有;查看阿里云控制台云盾也没有异常拦截记录;同时也向阿里云侧网络同学咨询有无网络入口方面的限制,反馈也没有。接着也向客户数据中心运营商确认了各层网络链路没有IP或端口记录或防火墙之类的限制。
最后找到阿里云侧网络安全的同学咨询,给出初步判断可能是DDoS之类的拦截。安全同学跟进排查不久,就发现了跟客户IP相关的拦截记录,不过不是DDoS拦截。原因是客户这次大批量迁移的过程中,批量迁移动态的创建和释放了一定数量的中转实例,又因为迁移速度很快,一般只有10多分钟,中转实例的生命周期很短,凑巧触发了耿直的网络安全策略。这其实是一种“误判”,批量迁移操作和迁云工具都是没有问题的。
5.3.解决问题
这个问题可以说是因迁移速度过快而差点引发的“血案”,这是在众多迁云案例里面第一次遇到的,结果也在掌控之中。虽然不是迁云工具本身的原因,但却是一次有意义的经验教训。
安全同学在解除了对该客户的相关拦截限制之后,客户侧网络异常问题就得到了彻底的解决,迁移任务又可以进行下去了,无论速度多快、弯道再多也不用担心会翻车了。
后来的迁移就一直顺风顺水没出过问题了,在客户侧200M宽带的加持下,迁云工具跑得十分卖力而平稳。从问题当天中午得到解决到后面两天时间就把剩下的200台系统迁移完成,客户的500台服务器系统已经如期全部迁移完成。
6.批量创建实例
500台服务器批量迁移上云之后,首先得到的是对应数量的自定义镜像。客户后续还要将这些镜像创建成实例,同时有以下需求:
1.创建按量收费的实例来做验证,验证完成后再升为包年包月的;
2.保留跟原来系统相同的子网IP,因为涉及原业务相关;
3.创建实例去购买页面一个个操作是不可能的,需要有工具调用来做。
这里提供一个方案,就是可以使用阿里云命令行工具调用OpenAPI配合脚本来批量创建。
阿里云命令行工具是专为阿里云OpenAPI打造的、用于管理阿里云资源的工具。它可以调用OpenAPI来创建实例。主要步骤如下:
1.下载阿里云命令行工具并配置Access Id和Secret Key;
2.调用创建实例的OpenAPI参数请参考CreateInstance文档说明。假设创建实例的目标区域是cn-qingdao,镜像Id是m-xxxxxxxxx, VSwitch是vsw-xxxxxxx,子网IP是10.0.0.10,实例规格是ecs.n1.samll,调用如下即可:
aliyun ecs CreateInstance --RegionId 'cn-qingdao' --ImageId 'm-xxxxxxxxx' --VSWitchId 'vsw-xxxxxxx' --PrivateIP '10.0.0.10' --InstanceType 'ecs.n1.samll'
3.将迁云工具所生成的镜像Id信息和对应的子网IP等信息做成配置,然后编写脚本调用命令行工具来自动读取进行批量执行创建实例。
另外,批量实例创建并启动之后,如果需要进行批量管理和配置,可以使用阿里云自动化批量运维工具“云助手”来做。
7.后记
近期客户开始进行批量创建实例并进行业务联调,目前结果是:近500个服务器镜像已经全部创建实例并正常启动,业务联调良好。目前来看,客户使用迁云工具进行批量迁云已经基本达到了当初的需求预期。因为使用了迁云工具,也让本次迁云过程节省了很多人力物力时间成本。期间虽然也遇到一些问题,但跟总体迁云结果对比看也是很值得的。
随着越来越多客户的使用,迁云工具一直在积累各种迁云案例经验。我们有迁云数据表明,使用迁云工具再配合我们迁云服务支持,让服务器迁移上云的成功率可以达到95%以上。如果有迁移上云需求,欢迎联系咨询我们,我们是专注致力于让客户更方便快捷地上云的阿里云ECS镜像系统团队。
上云就上阿里云!
迁云实践系列:
阿里云迁云工具迁移方案总结