创建linux系统服务器迁移任务

通过调用API 创建迁移任务,将Linux系统服务器迁移为新镜像或迁移到目标ECS实例。

操作步骤

在确保完成迁移前准备、已导入迁移源且已准备访问凭证的情况下,执行以下操作。

步骤一:查看磁盘及分区信息。

以包含2块数据盘的Linux实例为例。

迁移源导入成功后,可登录SMC控制台,单击迁移源id进入详情页面,在基本信息中查看磁盘及分区信息,创建任务时需要使用。

image

步骤二:安装Java依赖库

pom.xml文件中,添加以下依赖。

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>smc20190601</artifactId>
  <!-- 请选择最新版本 -->
  <version>1.1.4</version>
</dependency>

步骤三:执行任务

示例如下,请根据实际情况替换参数,详细的配置参数及解释请参考 CreateReplicationJob

创建迁移到镜像任务

import java.util.ArrayList;
import java.util.List;

import com.aliyun.smc20190601.models.CreateReplicationJobRequest;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisks;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksData;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksDataPart;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystem;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystemPart;
import com.aliyun.smc20190601.models.CreateReplicationJobResponse;
import com.aliyun.tea.TeaException;

public class SampleLinux {

    /**
     * <b>description</b> :
     * <p>使用凭据初始化账号 Client</p>
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.smc20190601.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Endpoint 请参考 https://api.aliyun.com/product/smc
        config.endpoint = "smc.aliyuncs.com";
        return new com.aliyun.smc20190601.Client(config);
    }

    /**
     * 创建迁移任务
     *  1. 生成新的ECS镜像
     *  2. 迁移包含数据盘
     *  3. 开启迁移演练
     *  4. 使用自动增量同步
     */
    public static void main(String[] args_) throws Exception {

        com.aliyun.smc20190601.Client client = SampleLinux.createClient();
        CreateReplicationJobRequest request = new CreateReplicationJobRequest();
        request.setRegionId("cn-beijing");
        request.setSourceId("s-b********");
        // 目标类型。 Image:迁移成功后,SMC 为迁移源生成阿里云镜像。 TargetInstance:迁移成功后,SMC 将迁移源直接迁移至目标实例。当设置该参数值时,需要同时指定InstanceId参数。
        request.setTargetType("Image");
        // 0:服务器迁移, 1:操作系统迁移, 2:跨可用区迁移, 3:VMware 无代理迁移。
        request.setJobType(0);
        // 0:表示公网传输模式, 此时要求源服务器能够访问公网,迁云数据从公网传输。 2:表示内网传输模式,选用此模式必须设置 VSwitchId 参数(VpcId 参数可以不设置,服务内部可以通过接口反查出来)。
        request.setNetMode(0);
        /**
         * 迁移复制相关参数, 参数为JSON字符串
         * image_check: 是否检查镜像,默认为true。
         * test_run: 是否进行迁移演练,默认为auto_running, 即演练通过后开始执行迁移。
         * bandwidth_limit: 带宽限制,默认为0, 单位为Mbps。
         */
        request.setReplicationParameters("{\"bandwidth_limit\":0,\"compress_level\":7,\"checksum\":false,\"image_check\":true,\"use_ssl_tunnel\":true,\"transport_mode\":\"\",\"upload_logs_enable\":true,\"test_run\":\"auto_running\"}");
        /**
         * 增量迁移相关参数。
         * true(默认值):一次性迁移任务。
         * false:增量迁移任务。任务创建后,按照设置的Frequency参数值周期性自动执行。
         */
        request.setRunOnce(false);
        // 增量迁移任务运行的时间间隔,单位:小时。取值范围:1~168。
        request.setFrequency(1);
        // 增量迁移任务默认保留的最大镜像数。取值范围:1~10。 为 1 表示只保留最近一次数据同步完成后生成的镜像
        request.setMaxNumberOfImageToKeep(1);


        // 设置待迁移的磁盘参数
        CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
        request.setDisks(disk);


        // 设置系统盘
        CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
        // 设置系统盘大小,单位:GiB。参数取值需要大于源服务器数据盘实际占用大小。
        systemDisk.setSize(40);
        List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
        CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
        // 系统盘分区是否开启块复制。windows 必须设置为 true
        systemPart.setBlock(true);
        // 系统盘分区路径。
        systemPart.setPath("/");
        // 系统盘分区大小。单位:Byte。 39 * 1024 * 1024 * 1024 = 41875931136
        systemPart.setSizeBytes(41875931136L);
        systemParts.add(systemPart);
        systemDisk.part = systemParts;
        disk.setSystem(systemDisk);


        List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
        disk.setData(dataDisks);
        // 设置第一块数据盘
        CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
        dataDisk1.setSize(40);
        List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
        CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
        disksData1Part.setBlock(true);
        disksData1Part.setPath("/data1");
        // 数据盘分区大小。单位:Byte。 39 * 1024 * 1024 * 1024 = 41875931136
        disksData1Part.setSizeBytes(41875931136L);
        dataDisk1Parts.add(disksData1Part);
        dataDisk1.setPart(dataDisk1Parts);
        dataDisks.add(dataDisk1);
        // 设置第二块数据盘
        CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
        dataDisk2.setSize(60);
        List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
        CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
        disksData2Part.setBlock(true);
        disksData2Part.setPath("/data2");
        // 数据盘分区大小。单位:Byte。 59 * 1024 * 1024 * 1024 = 63350767616
        disksData2Part.setSizeBytes(64406683648L);
        dataDisk2Parts.add(disksData2Part);
        dataDisk2.setPart(dataDisk2Parts);
        dataDisks.add(dataDisk2);
        try {
            // 复制代码运行请自行打印 API 的返回值
            CreateReplicationJobResponse response = client.createReplicationJob(request);
            System.out.println(response.getBody().getJobId());
            System.out.println(response.getBody().getRequestId());
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }
}

创建迁移到实例任务

import java.util.ArrayList;
import java.util.List;

import com.aliyun.smc20190601.models.CreateReplicationJobRequest;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisks;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksData;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksDataPart;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystem;
import com.aliyun.smc20190601.models.CreateReplicationJobRequest.CreateReplicationJobRequestDisksSystemPart;
import com.aliyun.smc20190601.models.CreateReplicationJobResponse;
import com.aliyun.tea.TeaException;

public class SampleLinuxTargetInstance {

    /**
     * <b>description</b> :
     * <p>使用凭据初始化账号 Client</p>
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.smc20190601.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Endpoint 请参考 https://api.aliyun.com/product/smc
        config.endpoint = "smc.aliyuncs.com";
        return new com.aliyun.smc20190601.Client(config);
    }

    /**
     * 创建迁移任务
     *  1. 生成新的ECS镜像
     *  2. 迁移包含数据盘
     *  3. 开启迁移演练
     *  4. 使用自动增量同步
     */
    public static void main(String[] args_) throws Exception {

        com.aliyun.smc20190601.Client client = SampleLinuxTargetInstance.createClient();
        CreateReplicationJobRequest request = new CreateReplicationJobRequest();
        request.setRegionId("cn-beijing");
        request.setSourceId("s-bp******");
        // 目标类型。 Image:迁移成功后,SMC 为迁移源生成阿里云镜像。 TargetInstance:迁移成功后,SMC 将迁移源直接迁移至目标实例。当设置该参数值时,需要同时指定InstanceId参数。
        request.setTargetType("TargetInstance");
        request.setInstanceId("i-2******");
        // 0:服务器迁移, 1:操作系统迁移, 2:跨可用区迁移, 3:VMware 无代理迁移。
        request.setJobType(0);
        // 0:表示公网传输模式, 此时要求源服务器能够访问公网,迁云数据从公网传输。 2:表示内网传输模式,选用此模式必须设置 VSwitchId 参数(VpcId 参数可以不设置,服务内部可以通过接口反查出来)。
        request.setNetMode(0);
        /**
         * 迁移复制相关参数, 参数为JSON字符串
         * image_check: 是否检查镜像,默认为true。
         * test_run: 是否进行迁移演练,默认为auto_running, 即演练通过后开始执行迁移。
         * bandwidth_limit: 带宽限制,默认为0, 单位为Mbps。
         */
        request.setReplicationParameters("{\"bandwidth_limit\":0,\"compress_level\":7,\"checksum\":false,\"image_check\":true,\"use_ssl_tunnel\":true,\"transport_mode\":\"\",\"upload_logs_enable\":true,\"test_run\":\"auto_running\"}");
        /**
         * 增量迁移相关参数。
         * true(默认值):一次性迁移任务。
         * false:增量迁移任务。任务创建后,按照设置的Frequency参数值周期性自动执行。
         */
        request.setRunOnce(false);
        // 增量迁移任务运行的时间间隔,单位:小时。取值范围:1~168。
        request.setFrequency(1);
        // 增量迁移任务默认保留的最大镜像数。取值范围:1~10。 为 1 表示只保留最近一次数据同步完成后生成的镜像
        request.setMaxNumberOfImageToKeep(1);


        // 设置待迁移的磁盘参数
        CreateReplicationJobRequestDisks disk = new CreateReplicationJobRequestDisks();
        request.setDisks(disk);


        // 设置系统盘
        CreateReplicationJobRequestDisksSystem systemDisk = new CreateReplicationJobRequestDisksSystem();
        // 设置系统盘大小,单位:GiB。参数取值需要大于源服务器数据盘实际占用大小。
        systemDisk.setSize(40);
        List<CreateReplicationJobRequestDisksSystemPart> systemParts = new ArrayList<>();
        CreateReplicationJobRequestDisksSystemPart systemPart = new CreateReplicationJobRequestDisksSystemPart();
        // 系统盘分区是否开启块复制。windows 必须设置为 true
        systemPart.setBlock(true);
        // 系统盘分区路径。
        systemPart.setPath("/");
        // 系统盘分区大小。单位:Byte。 39 * 1024 * 1024 * 1024 = 41875931136
        systemPart.setSizeBytes(41875931136L);
        systemParts.add(systemPart);
        systemDisk.part = systemParts;
        disk.setSystem(systemDisk);


        List<CreateReplicationJobRequestDisksData> dataDisks = new ArrayList<>();
        disk.setData(dataDisks);
        // 设置第一块数据盘
        CreateReplicationJobRequestDisksData dataDisk1 = new CreateReplicationJobRequestDisksData();
        dataDisk1.setSize(40);
        // 设置源服务器数据盘对应的目标实例数据盘的磁盘ID
        dataDisk1.setDiskId("d-2z*********");
        List<CreateReplicationJobRequestDisksDataPart> dataDisk1Parts = new ArrayList<>();
        CreateReplicationJobRequestDisksDataPart disksData1Part = new CreateReplicationJobRequestDisksDataPart();
        disksData1Part.setBlock(true);
        disksData1Part.setPath("/data1");
        // 数据盘分区大小。单位:Byte。 39 * 1024 * 1024 * 1024 = 41875931136
        disksData1Part.setSizeBytes(41875931136L);
        dataDisk1Parts.add(disksData1Part);
        dataDisk1.setPart(dataDisk1Parts);
        dataDisks.add(dataDisk1);
        // 设置第二块数据盘
        CreateReplicationJobRequestDisksData dataDisk2 = new CreateReplicationJobRequestDisksData();
        dataDisk2.setSize(60);
        // 设置源服务器数据盘对应的目标实例数据盘的磁盘ID
        dataDisk2.setDiskId("d-2*********");
        List<CreateReplicationJobRequestDisksDataPart> dataDisk2Parts = new ArrayList<>();
        CreateReplicationJobRequestDisksDataPart disksData2Part = new CreateReplicationJobRequestDisksDataPart();
        disksData2Part.setBlock(true);
        disksData2Part.setPath("/data2");
        // 数据盘分区大小。单位:Byte。 59 * 1024 * 1024 * 1024 = 63350767616
        disksData2Part.setSizeBytes(64406683648L);
        dataDisk2Parts.add(disksData2Part);
        dataDisk2.setPart(dataDisk2Parts);
        dataDisks.add(dataDisk2);
        try {
            // 复制代码运行请自行打印 API 的返回值
            CreateReplicationJobResponse response = client.createReplicationJob(request);
            System.out.println(response.getBody().getJobId());
            System.out.println(response.getBody().getRequestId());
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }
}

若使用Java SDK 创建的任务运行失败,请参见常见问题