在云系统的高可用性中,VM层的高可用性尤为关键,其中又涉及到了VM本身数据的备份和迁移的问题。在现有的平台上,每一个VM的数据放在一个单独的LV(逻辑卷)上,VM数据的备份可通过备份其所在的LV来完成,迁移则需要其他的物理服务器可以访问到该VM的数据,也即LV的内容。对于备份,可利用LVM(Logical Volume Manager)的快照功能来完成,远程访问则可通过NBD(Network Block Device)来实现。
LVM属于软件层,管理着底下的硬盘分区,其好处是可以动态调整LV的大小、动态增加PV(物理卷)到VG(卷组)以增大VG容量、创建LV快照等,使得用户在LV容量不够用的情况下能够直接调整LV大小来满足,而不需要重新对底下的物理硬盘进行分区。我们这里主要用到LVM的快照功能来备份VM数据,具体如下:
假设物理服务器名为Server1,其上某一虚拟机名为VM1,VM1数据存放在LV-VM1逻辑卷上,该逻辑卷隶属于名为VgVm的卷组。在某一时刻,VM1数据是完好的,我们需要将这一时刻的数据进行备份,以防VM1数据在将来某一时刻被破坏时能恢复到这一时刻的状态。首先创建一个逻辑卷快照,命令如下:
lvcreate –L 1G –s –n LV-VM1Snapshot /dev/VgVm/LV-VM1
其中“1G”为要创建的快照的大小,这个大小根据需要制定。需要注意的是,如果指定的值太小,快照在其生命周期内发生溢出的话,该快照将无效,因此创建时需要对将要写入快照的数据量有一个合理的预估。“LV-VM1Snapshot”为快照名称,其他参数可参看相应的帮助文档。
LVM快照使用的是Copy-on-write(写时复制)机制,在快照创建之后,当有数据要往LV-VM1卷上某一位置写入时,LVM会将这一位置的数据拷贝到LV-VM1Snapshot快照逻辑卷上,然后再将新数据写入LV-VM1,这样就起到了备份旧数据的作用。而在实际的实现中,LVM可能根本不会去拷贝数据,而是开辟新的位置写入新数据,然后调整指向数据块的指针值来达到目的,所以速度会很快。在这里,我们只需要了解写时复制就够了,不必深究实现细节。
以上快照创建之后,我们需要一种方法来远程访问这个快照,于是NBD派上用场了。NBD作为网络块设备,其内容来源为网络上的服务器,其组成为Server/Client模型。Client机器像访问本地磁盘一样访问数据,而真正的内容存储在Server上。Client机器上需要安装NBD内核模块,当Client要访问Server上的数据时,该内核模块将请求发往Server,Server端有一个守护进程叫nbd-server,负责解析接收到的请求并读取数据然后返回给Client。
这里需要两台物理服务器,其中一台为上面提到的Server1,我们把它当作NBD的Server端,另一台当作NBD的Client端,假设名为Server2。现在需要在Server1和Server2上安装NBD,分别在两台服务器上进行以下步骤进行安装:
下载最新的安装包:nbd-3.2.tar.bz2,进入到安装包所在目录,执行以下命令:
tar jxf nbd-3.2.tar.bz2
该命令会解压生成目录nbd-3.2。接着执行命令:
cd nbd-3.2
./configure //这一步若提示“missing glib”,需要先执行apt-get install libglib2.0-dev
make && make install
到此,Server1和Server2上都安装好了NBD服务。
在Server1上执行命令:
nbd-server 1234 /dev/VgVm/ LV-VM1Snapshot
其中1234为端口号,可灵活指定,后面是要通过NBD导出的逻辑卷名,这里为上面创建的快照卷。
Server2作为NBD的Client端,需要安装内核模块,执行以下命令安装:
insmod /lib/modules/xxx/kernel/drivers/block/nbd.ko
其中的xxx因系统而异。
安装完内核模块后,若执行命令“ls /dev”,则可看到/dev目录下多了nbd0、nbd1等设备。
在Server2上执行命令:
nbd-client Server1-IP 1234 /dev/nbd0
其中Server1-IP为NBD Server端的IP地址,1234为端口号,/dev/nbd0表示镜像设备,访问/dev/nbd0等同于访问Server1上的快照卷“/dev/VgVm/ LV-VM1Snapshot”。如果需要将快照内容拷贝到Server2上,只需要对/dev/nbd0进行dd即可,也可mount设备/dev/nbd0然后访问其中的文件。