上云的正确姿势之自动化迁移

企业通用迁移上云过程

随着云计算平台的飞速发展,云上IT资源在弹性、成本、丰富度方面越来越显示出它的优势。企业将线下的IT基础设施资产迁移上云越来越变成了一种趋势和潮流。
在现代主流云厂商的迁移服务过程中,企业级客户一站式迁移上云的典型过程路径是:
上云的正确姿势之自动化迁移

  • 迁移前:资产发现、评估

对现有IT服务资产进行发现评估,以便制定合适的迁移计划。如服务器系统使用服务器备份迁移工具,数据库采用DTS等,大数据采用闪电立方,其他应用如容器考虑容器镜像迁移等。

  • 迁移中:进度把控

迁移过程中,会依次进行迁移测试演练、迁移实施,以及迁移过程进度把控。

  • 迁移后:业务验证跟踪

迁移完成后,在云上进行业务交割。最终的迁移记录还可以保留方便跟踪。
其中服务器系统数据作为现代企业IT资产中最重要的一环,也是本文所主要讨论的迁移上云对象。

服务器迁移上云痛点

然而服务器迁移上云从来都不是一个容易的工作。传统服务器迁移上云方式也需要大量手工操作完成,面临着诸多痛难点问题:

  • 操作麻烦、门槛高

在服务器应用环境老旧、复杂的情况下,重新部署的成本非常之高。同时平迁的话也担心还原度,成功率低。IT运维开发人员如果对老旧系统不熟悉,也不敢轻易迁移。

  • 周期长、成本高

一般情况下使用离线导入导出镜像的方式迁移,但这种方式如果迁移大量服务器耗时将会非常长,迁移过程中也容易因为网络原因中断,需要大量重复劳动。迁移消耗大量人力资源不说,数据导出导入耗时效率也低。

  • 效果差、影响业务

就算费尽千辛万苦,把数据导入到云平台,但对云Guest OS规范标准不够熟悉,制作的系统镜像容易无法启动,或者出现诸多异常,影响正常业务运行,叫苦不迭。

自动化迁移产品诞生

针对上述痛点问题,为了简化用户上云过程,各个云平台厂商也提供了很多自动化的服务器迁移方式。例如AWS的SMS服务,Azure的Size Recovery等。

阿里云也提供了一种自动化迁移产品:服务器迁移中心SMC。SMC支持全自动化迁移,可以让服务器迁移过程变得简单、快捷、有效,同时高性价比。作为一个合格的服务器迁移方式,它需要满足以下功能特点。

  • 高度成熟化

首先需要适用各种迁移场景。支持系统盘+数据盘整体迁移,无需重新部署。同时兼容各个服务器系统平台,包括物理机、虚拟机以及各大云平台。基本覆盖所有主流Windows、Linux、32位、64位操作系统版本。

  • 高度自动化

最好支持简单命令即可执行,迁移过程可以做到无人值守,降低使用门槛。从数据同步到数据处理,再到最后迁移结果的验证都可以自动化完成。同时为了大大减少迁移周期,需要支持自动定期增量同步的灵活方案。最好能按需按量迁移,节省成本。

  • 高度智能化

提供自动检测、自适应修复的只能功能。能实现自动对源服务器进行迁移条件检测并自动提供修复方案,迁移完成后自动完成虚拟化驱动配置,系统初始化服务如cloud-init安装配置等,保障整体迁移效果,同时无需过多人力干预,最大程度减少人员投入。

何为自动化迁移

基础迁移功能介绍

在谈自动化迁移之前,服务器迁移产品首先要满足一些基础迁移功能,这是自动化迁移能力之本。
SMC作为上线3年、迭代超过70多个版本的服务器迁移产品,已经累积了相当多的迁移经验,同时沉淀出了很多强大的基础迁移功能。

  • 系统平台兼容性高

    • 支持物理机、虚拟机、各大云平台服务器,Any Platform To Alibaba Cloud。
    • 支持所有主流Windows/Linux操作系统版本
    • 支持主流的文件系统格式:如NTFS、EXT2/3/4、XFS、BTRFS等
  • 功能方案丰富灵活

    • 支持一次性迁移,增量迁移,块复制、文件复制混合迁移,按需迁移高效灵活
    • 支持公网传输,专线、VPN私网传输,适应各类复杂客户端源环境
    • 支持迁移到ECS镜像,迁移到目标实例,甚至迁移到容器镜像,满足各种迁移场景



自动化迁移能力一览

拥有了基础迁移功能之后,我们再来看看现代自动化迁移具体有哪些能力。
当然这里还是以SMC产品为例,主要包含以下3个方面。

  • 迁移前:一键上传迁移源信息

自动收集迁移源信息,便于分析评估,拟定迁移计划
上云的正确姿势之自动化迁移

  • 迁移中:一键启动迁移任务

自动托管迁移全过程,无需人工干涉,迁移进度一目了然
上云的正确姿势之自动化迁移

  • 迁移后:一键验证迁移结果

自动拉起迁移目标结果进行验证,快速跟踪迁移效果
上云的正确姿势之自动化迁移
如果迁移产品满足了这些自动化迁移能力,我们就可以称之为一个合格的服务器迁移产品。
**

自动化迁移的正确姿势

那么怎么能快速开始进行自动化迁移呢?自动化迁移的正确姿势是还是要从学走路开始,常规路径是先选一个简单好用的迁移产品,比如SMC,从熟悉常规迁移操作开始。

常规迁移步骤

准备工作

要迁移到阿里云,首先要准备一个阿里云账户,确保一些条件

  • 已实名认证
  • 账户余额>=100元(用于创建临时迁移资源条件,实际花费可能是不到几毛钱)
  • 使用过或开通快照服务
  • 准备账号AK、SK,需要有AliyunSMCFullAccess权限


一般迁移产品都会有一个直观易用的控制台操作面板,主要操作步骤分为在源服务器中操作和在控制台面板中操作两部分:
上云的正确姿势之自动化迁移

源服务器操作

  • 登录到源服务器系统,部署对应版本的迁移客户端程序;而SMC客户端是绿色免安装的,而且非常轻量方便部署
  • 按提示运行迁移客户端程序即可;SMC提供console命令行版本和符合windows用户习惯的可视化界面版本

控制台操作

  • 登录到迁移控制台入口,就可以选择已导入的迁移源,开始创建迁移任务
  • 配置好必要的任务参数,如目标区域,磁盘分区列表,目标类型等
  • 成功创建并启动后,找到已创建的任务,等待迁移完成即可
  • 迁移完成后,还可以使用一些方式验证迁移结果,比如用结果镜像去创建实例进行验证,或者如果迁移结果是一个目标实例,直接去目标实例验证即可;当然SMC还提供一种自动验证迁移结果的便捷功能,可以进行快速验证

集成自动化迁移能力

在熟悉了基础迁移功能之后,下一步就可以进阶使用到更高级的迁移能力:将迁移功能集成到自己的工具产品服务里去,为自己所用。
成熟开放的迁移产品肯定会考虑到客户这个更高层次的需求,也就是二次开发能力,比如提供开放的OpenAPI接口,供客户*集成使用。而SMC当然也不例外。
使用SMC OpenAPI二次开发,配合云上云下各类运维工具,任何用户都可以轻易地集成SMC迁移功能实现自动化迁移能力。下面就是集成SMC自动化迁移能力的具体姿势。

自动化导入迁移源

使用运维工具如Ansible,下发自动化部署脚本到在迁移源服务器系统中运行,SMC客户端会在待迁移源服务器后台运行起来,同时获取迁移源Id等信息。
Ansible Shell脚本代码示例:

#!/bin/bash
echo "Prepare Alibaba Cloud Migration Tool..."
access_id=$1
secret_key=$2

# choose the right architure client tool
word_bit=$(getconf WORD_BIT)
long_bit=$(getconf LONG_BIT)
architure=""
if [ "$word_bit" == "32" ] && [ "$long_bit" == "64" ]; then
    architure=x86_64
else
    architure=i386
fi

dest_dir=/smc/
download_url="https://p2v-tools.oss-cn-hangzhou.aliyuncs.com/smc/Alibaba_Cloud_Migration_Tool.zip"
tools_path="$dest_dir"/Alibaba_Cloud_Migration_Tool_linux.zip

# download client tools
wget "$download_url" -O "$tools_path"

# decompress client tools
unzip "$tools_path" -d "$dest_dir"
tool_tar_path=$(find ${dest_dir} -name "go2aliyun_client*${architure}.zip" | head -1)

# decompress the right architure client tool
unzip "$tool_tar_path" -d "$dest_dir"

tool_dir=$(find ${dest_dir} -name "go2aliyun_client*${architure}" | head -1)

echo "Run Alibaba Cloud Migration Tool..."
exec_path="$tool_dir"/go2aliyun_client
chmod +x "$exec_path"
nohup $exec_path --accessid=$access_id --secretkey=$secret_key --nocheckversion --noenterkey &
sleep 30s

# get source id
source_id=$(cat "$tool_dir"/Logs/go2aliyun_client*.log | grep Successfully | awk -F 'Successfully' {'print $1'} | awk -F '[' {'print $4'} | awk -F ']' {'print $1'})

自动化创建并启动迁移任务

使用SMC API调用脚本,指定迁移源Id等信息来创建并启动迁移任务,同时跟踪迁移任务进度直至完成,获取迁移结果镜像Id等信息。SMC支持多开发代码平台SDK:Python、Java、C#、Go等
Python API调用代码示例:

#!/usr/bin/env python
#coding=utf-8

import json
import time
import uuid
from aliyunsdkcore.client import AcsClient
from aliyunsdksmc.request.v20190601 import CreateReplicationJobRequest
from aliyunsdksmc.request.v20190601 import StartReplicationJobRequest
from aliyunsdksmc.request.v20190601 import DescribeReplicationJobsRequest

# 初始化AcsClient实例,设置地域ID及您的AccessKey信息
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')

# 创建迁移任务
def create_replication_job():
    #创建API请求,并设置参数, 如迁移源ID,磁盘分区大小,迁移任务名、任务描述
    request = CreateReplicationJobRequest.CreateReplicationJobRequest()
    request.set_SourceId('s-bp152mkfswvidyr3****')
    # 分区参数最好取迁移源的分区参数,如SizeBytes、Device
    # 同时同一个磁盘下的分区大小之和要小于磁盘大小,否则磁盘分区可能初始化异常
    request.set_SystemDiskSize(80)
    request.add_query_param('SystemDiskPart.1.SizeBytes', 79 * 1024 * 1024 * 1024)
    request.add_query_param('SystemDiskPart.1.Device', '0_0')
    # request.set_ClientToken(uuid.uuid4())
    request.set_Name('smcName')
    request.set_Description('setDescription')
    # (可选)设置已配置高速通道服务或者VPN网关的VPC的ID、VPC下的交换机ID
    request.set_VpcId('vpc-bp1vwnn14rqpyiczj****')
    request.set_VSwitchId('vsw-bp1ddbrxdlrcbim46****')

    # 发送请求获取返回值
    response = client.do_action_with_exception(request)
    # python2:  print(response)
    print(str(response, encoding='utf-8'))
    print('**********成功创建迁移任务**********')
    return json.loads(response)['JobId']

# 启动迁移任务
def start_replication_job(job_id):
    # 创建API请求,并设置参数,如迁移任务ID
    request = StartReplicationJobRequest.StartReplicationJobRequest()
    request.set_JobId(job_id)

    # 发送请求获取返回值
    response = client.do_action_with_exception(request)
    # python2:  print(response)
    print(str(response, encoding='utf-8'))
    print('**********启动迁移任务**********')

# 查询迁移任务状态、迁移结果镜像
def describe_replication_jobs(job_ids):
    # 创建API请求,并设置参数
    request = DescribeReplicationJobsRequest.DescribeReplicationJobsRequest()
    # 设置迁移任务ID列表
    jobIds = [job_ids]
    request.set_JobIds(jobIds)
    # 设置迁移任务的名称
    request.set_Name('smcName')
    # 设置迁移任务的页码
    request.set_PageNumber(1)
    # 设置每页行数
    request.set_PageSize(10)
    # 设置迁移源ID列表
    sourceIds = ['s-bp152mkfswvidyr3****']
    request.set_SourceIds(sourceIds)

    # 发送请求获取返回值
    response = client.do_action_with_exception(request)
    # python2:  print(response)
    print(str(response, encoding='utf-8'))
    print('**********查看迁移任务状态**********')
    jobslist = json.loads(response)['ReplicationJobs']['ReplicationJob']
    for i in jobslist:
        return (i['Status'], i['ImageId'])

# 执行创建迁移任务方法
job_id = create_replication_job()
# 执行启动迁移任务方法
start_replication_job(job_id)
# 每隔10分钟执行一次查询迁移任务状态,判断是否迁移完成。
while True:
    print('迁移任务正在执行……')
    time.sleep(600)
    status, image_id = describe_replication_jobs(job_id)
    if status == 'Finished':
        print('迁移完成, 迁移结果镜像为 %s' % image_id)
        break

自动化验证迁移结果

使用OOS API调用脚本,指定迁移结果源镜像Id,迁移源主机名、私网IP、实例规格等信息来执行迁移结果自动化验证模板,同时获取验证结果信息。该ACS-SMC-CreateAndVerifyInstance模板过程会自动用指定镜像Id创建临时实例来自动验证。同时还可以按需自定义符合自己业务逻辑的OOS验证模板。
Python API调用代码示例:

#!/usr/bin/env python
#coding=utf-8

import json
import time
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkoos.request.v20190601.StartExecutionRequest import StartExecutionRequest
from aliyunsdkoos.request.v20190601.ListExecutionsRequest import ListExecutionsRequest

client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')

def start_execution(template_name, parameters=None):
    request = StartExecutionRequest()
    request.set_accept_format('json')
    request.set_TemplateName(template_name)
    if parameters:
        parameters = json.dumps(parameters)
        request.set_Parameters(parameters)
    resp = client.do_action_with_exception(request)
    return resp

def list_exexutions(execution_id=None):
    request = ListExecutionsRequest()
    if execution_id:
        request.set_ExecutionId(execution_id)
    resp = client.do_action_with_exception(request)
    executions = resp['Executions']
    if executions:
      execution = executions[0]
      return execution['Status'], execution['Outputs']

start_resp = start_execution(template_name='ACS-SMC-CreateAndVerifyInstance', parameters={
        "regionId": "cn-beijing",
        "zoneId": "cn-beijing-h",
        "hostName": "testhostname",
        "imageId": "m-xxxxxxxxxxxxxx",
        "instanceType": "ecs.c5.2xlarge",
        "privateIp": "172.17.30.48",
        "systemDiskSize": 40,
        "instancesCount": 1,
        "isDeleteInstance": True,
        "commandType": "",
        "commandContent": "",
        "timeout": 600,
        "workingDir": "/root",
        "rateControl": {
            "mode": "Concurrency",
            "maxErrors": 0,
            "concurrency": 10
        },
        "OOSAssumeRole": ""
    })

execution_id = start_resp['Execution']['ExecutionId']

# 每隔1分钟执行一次查询执行状态,判断是否验证完成。
while True:
    print('验证正在执行……')
    time.sleep(60)
    status, outputs = list_exexutions(execution_id)
    if status == 'Success':
        print('迁移结果验证通过, 输出参数为 %s' % outputs)
        break

总结

服务器迁移工作是企业IT基础资源数据上云过程中必不可少的过程。而如何选用合适的迁云方案也是非常值得探讨的话题。服务器迁移本质上也是一种转型改变,转型和改变往往伴随着阵痛,本来不是简单的过程。但如果选对了合适的云产品和迁云产品工具,企业上云之路也会走得更加顺畅。
阿里云服务器迁移中心SMC,是为了解决客户迁移服务器系统应用环境上云过程中的种种痛点而生的。SMC目标是能将任意平台的服务器系统搬迁到阿里云,同时致力于让迁云过程变得更加方便简捷。
建议用户可以先从熟悉常规迁移操作步骤开始,然后利用自动化迁移可集成能力,进一步加强迁移效能,更好地满足各类迁移场景需求,这就是自动化迁移上云的正确姿势。

更多参考

SMC控制台入口
SMC操作指南
SMC API简介
OOS创建并验证目标实例模板

上一篇:Linux基本bash命令(持续更新)


下一篇:NLP 语料分类不均衡的解决办法