何方化身千万亿,一树梅下一放翁——浅谈Azure的虚机复制

  在云原生的应用里,通常会谈到虚机要去持久化、松耦合、快速部署等理念。为了实现此目的,虚机的快速复制是一个必不可少的需求。
  而在Azure里,提供了多种虚机复制的方式;而如何选择合适的方案,则往往令初学者感到疑惑。

Azure虚机复制方法的分类

  总体来说,Azure中虚机复制分为两类:虚机硬盘复制和虚机通用化:
虚机复制方法分类

  下边具体分析一下这些方案的执行方法及区别。

虚机硬盘复制

  虚机的硬盘复制是在虚机复制时使用的最多的一种方案。但是在Azure启用托管磁盘后,由于续集硬盘vhd文件路径不能被直接看到,所以虚机的硬盘复制需要针对具体情况选择不同方案。

直接硬盘复制

  首先创建一台源虚机(使用托管磁盘):
Capto_Capture 2018-06-03_04-59-51_PM
  查看源虚机的状态:
Capto_Capture 2018-06-03_05-01-10_PM
  可以看到此虚机有一个名为hyvm01_Osdisk_***的硬盘。

  现充此硬盘创建一个新的硬盘hyvm02_OS给新的虚机使用:
Capto_Capture 2018-06-03_05-05-24_PM
  创建成功,默认是Premium_LRS的磁盘,建在hyrg的资源组下。
  参数简单说明:
   -g:指明新创建磁盘所放置的资源组,可以和源盘相同也可以不同
  
–name:新建磁盘的名字
   –source:源磁盘的名字
  
–sku:新建磁盘的类型(Standard_LRS或Premium_LRS,默认Premium,托管磁盘只支持LRS的容错类型)

  现在使用新复制的磁盘来创建虚机:
Capto_Capture 2018-06-03_05-17-38_PM
  可以看到,直接使用新复制磁盘可以生成虚机,相当于硬盘克隆,新硬盘里已经包含了操作系统、认证方式等信息,所以无需再使用–image
参数选择镜像,以及–admin-username等参数指定认证方式;但是需要使用–os-type指定操作系统类型(Linux or Windows);网络等可根据情况默认或指定。

快照复制

  快照是对虚机内容的一种短期保护机制,通常用来做变更回退,例如当软件更新但不知道是否会导致bug,可以在更新前做一次快照,如果更新后有重大bug,可以通过回退到快照时间点来解决,
  但在Azure里,快照并不能直接回退,而是通过快照生成新的虚机。如下,还是用hyvm01作为源,首先对磁盘做快照:
Capto_Capture 2018-06-03_05-35-00_PM
  快照是基于时间点的位图集合,并不真正生成数据,只有在磁盘发生变化时,才会记录变化的数据,所以快照具有时间属性,什么时候生成的快照,通过快照复制出的硬盘就会保持在改时间点的状态,而不会随源磁盘的变化而变化,所以时间点是快照的重要属性。同理,快照所占用的空间随源磁盘的变化而增长,但最大不会超过源磁盘的容量(源磁盘所有的数据都发生了变化)。
  通过快照复制磁盘并创建虚机的方式与直接通过磁盘复制基本相同,只是复制磁盘时,–source参数后边是快照而非源磁盘:
Capto_Capture 2018-06-03_05-48-09_PM

硬盘导出

  前边说过,虚机采用托管磁盘后,磁盘路径不对外公开,所以没法对vhd文件直接操作。为了解决下载vhd等操作的需求,Azure提供了一个export的操作,可以临时为磁盘生成一个url,用作下载等:
Capto_Capture 2018-06-03_06-03-20_PM
  执行此操作却报错,看报错提示,磁盘导出时不能处于attach状态。重新deallocate虚机再执行:
Capto_Capture 2018-06-03_06-08-40_PM
  可以看到,这次成功获得hyvm01这个虚机的os磁盘的临时链接的url,可以使用这个url去下载、拷贝(azcopy等工作)该磁盘,这个链接的存活时间通过参数–duration-in-seconds指定,单位为秒。
  下边通过此链接来复制磁盘:
Capto_Capture 2018-06-03_06-14-20_PM
  出现错误,因为–source参数虽然支持VHD的链接,但是export出的url是一个SAS加密后的链接,被–source认为无效,所以没法直接使用。所以需要将该url拷贝到一个vhd后使用。此方法虽然麻烦点,但是可以提供跨region的复制方式。
  现在chinaeast2创建一个存储账户,将导出的链接拷贝到该存储账户的vhd,并转化为托管磁盘,创建虚机:
Capto_Capture 2018-06-03_09-39-13_PM
  成功的跨region创建了虚机。


  可以看到,以上三种方式中,除了硬盘导出,其他两种都可以在线复制虚机(Global Azure也可以支持在线硬盘导出),单位了保证应用数据一致性,仍然建议关机后执行复制操作。
  如果用户需要跨region复制虚机,硬盘导出方式可以得到vhd文件,实现需求。
  通过备份回复方式复制虚机将另开一篇虚机保护的blog讨论。


虚机通用化

  虚机通用化也是Azure常用的一种虚机复制的方式。这种方式的基本原理是将虚机的用户信息等抹除,还原到虚拟化状态,制作成镜像,然后在通过镜像生成虚机。
  这种方式等同于azure里marketplace的虚机的部署方式,在某些特定场景如vmss等,需要通过镜像生成虚机,这就要用到虚机通用化的方式。
  此外,在硬盘复制的方式中,如果一台虚机有多块硬盘,我们必须单独对每块硬盘进行复制并attach到虚机,而虚机通用化则无需如此。
  现在给hyvm01附加一块数据盘:
Capto_Capture 2018-06-03_09-53-57_PM
  进入虚机,使用waagent对虚机进行取消预配置:
Capto_Capture 2018-06-03_09-57-20_PM
  如果是windows,通过windows自带的sysprep进行取消预配置。
  解除分配并创建镜像:
Capto_Capture 2018-06-03_10-02-41_PM
  可以看到,成功创建名为hyimage的镜像,位于hyrg资源组。
  现在利用此镜像创建虚机:
Capto_Capture 2018-06-03_10-09-14_PM
  可以看到,和用azure内置镜像创建虚机方法基本一样,虚机的各种属性也需要在创建过程中定义。
  复制出的虚机自动带上了数据盘:
Capto_Capture 2018-06-03_10-14-37_PM

总结

  Azure在虚机复制方面有多种方式,可根据具体情况选择。主要区别有如下几点:

  1. 基于硬盘复制的方式可以看做是从源磁盘的克隆,每个副本只能应用在一台虚机;如果虚机有多块硬盘,需要逐一复制。
  2. 虚机通用化的方式可以看做是做了一个虚机的安装盘,然后使用安装盘安装多台虚机;如果虚机有多块硬盘,将原样复制到新的虚机。
  3. 硬盘复制方式保留了虚机的用户信息等,生成新虚机时无需指定;而通用化可以看做是一个全新安装,所有相关信息都需要定义。
  4. 最关键一点,如果是windows虚机,硬盘复制方式将保留SID信息,类似于网络上有两个相同“身份证”的虚机,某些时候可能会出现冲突;而通用化则抹掉了VM的SID信息,创建虚机时会分配一个新的SID,避免冲突。
      Azure虚机的复制方式简单介绍如此,可供大家在实际工作中选择最合适的方式。