为了把自己的理解和学习的东西记录下来,决定用这篇博客好好总结下, 环境是kvm上使用libvirt管理系统环境上的迁移
就是动态迁移, vm几乎不停机而实现迁移,但是也是有停顿的, 是在目标主机上vm的资源环境准备好后, 从源vm转换到目标主机上vm继续运行是有短暂的切换时间的, 只是我们使用的时候很难感受到, 这个功能在现实使用场景中非常重要,它的侧重点在于减少vm的暂停时间, 实现也更复杂
Live Migration又有两种
1) 就是共享存储情况下,这种情况下, 只需要考虑内存状态的迁移
2) block migration, 块迁移,当各主机上vm使用的是本地存储, 而不是共享存储时, 要实现迁移, 需要实现镜像文件和内存状态同时迁移, 会更复杂。
[具体实现待续]
静态迁移,这种迁移注重的是减少迁移所花费的时间,适用于对象系统可用性要求不是很高的时候,迁移过程中会关机, 拷贝instance的镜像文件和重建libvirt.xml(这个配置文件中会涉及网络环境, 存储设备等配置), 并重新在目标主机上启动。
OpenStack中cold Migration的处理流程其实就是flavor保持不变的resize, 所以处理过程同接下来所说的Resize
关于静态迁移到本地机器, 其实可以什么都不用做, 这个需要确认一下, 看是不是也走了resize流程
为什么把resize也放到这说, 其实OpenStack中的Resize不仅仅是修改flavor大小,还需要根据新的flavor大小,在云环境中找到合适的宿主机,进行迁移,核心是在于迁移,如同在Cold Migration中说的, 他们流程是一致的,在OpenStack中也可以说Cold Migration是一种特殊的resize。下面内容中的迁移特指这种可修改flavor大小的迁移。
迁移前先看下要做迁移的instance目录结构
[root@aa 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]ls -al
drwxr-sr-x 2 root nova 4096 Mar 24 09:54 .
drwxr-sr-x 5 nova nova 4096 Mar 24 09:53 ..
-rw-rw---- 1 root root 0 Mar 24 09:53 console.log
-rw-r--r-- 1 root root 10420224Mar 24 09:53 disk
-rw-r--r-- 1 root nova 1770 Mar 24 09:53 libvirt.xml
我们做迁移的结果也是要在目标主机上重建同这个目录相同的结构, 然后就能重建迁移后的instance。
静态迁移首先需要通过nova scheduler 选出一个目标主机,这时要在目标主机上先计算计算资源是否足够, 方法为resize_claim. 一切准备就绪, 接下来主要分两端走,
先在源主机端上nova-compute进程执行, 然后在目的主机端nova-compute上执行, 当然源主机有时和目的主机一致, 但是不影响迁移过程
1. 关闭被迁移的instance,使用的是方式与virsh destroy一致。
2. 把instance的目录(example: 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b)拷贝为9dd5d463-f9a9-4173-a3fb-91ce95ccac7b_resize, 我们将以这个目录文件为基础进行镜像的迁移,同时在迁移完镜像后能够保留下来作为备份, 比如可以做不成功时的回滚。接下来, 在连接至目标主机建立新的目录9dd5d463-f9a9-4173-a3fb-91ce95ccac7b,如果共享存储, 可直接mkdir, 如果是非共享存储, 那么需要ssh到目标主机上建立这个目录。
附: 判断是否为共享存储的方法:
a.目标host是否就是本地host 若不是-->接着第b步,能不能ssh到目标host建立临时文件。 如果都不可以,为非共享存储
3. 开始做实质工作,转换格式(转为raw格式)和拷贝image(raw disk file)到新建的9dd5d463-f9a9-4173-a3fb-91ce95ccac7b目录
首先是转换格式, 如果现在镜像 格式为qcow2 同时有cache文件, 那么需要使用qemu-img convert为raw格式,这时我们可以看到9dd5d463-f9a9-4173-a3fb-91ce95ccac7b_resize目录下多了一个disk_rbase, 这个就是转换后的文件, 我们需要copy到目标主机的就是这个。
[root@aa 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b_resize]ls -al
drwxr-sr-x 2 root nova 4096 Mar 24 09:53 .
drwxr-sr-x 5 nova nova 4096 Mar 24 09:53 ..
-rw-rw---- 1 root root 0 Mar 24 09:53 console.log
-rw-r--r-- 1 root root 10420224 Mar 24 09:53 disk
-rw-r--r-- 1 root nova 1439761408 Mar 24 09:54 disk_rbase
-rw-r--r-- 1 root nova 1770 Mar 24 09:53 libvirt.xml
接下来就是copy 镜像到目标主机。同时清理disk_rbase文件
拷贝镜像到目标机器的过程中, 可以看到目标主机上instance目录, 先是中间文件.disk.ph4Fkv, 大小慢慢增大,当copy完成, 就变成disk文件。
[root@kvm-10-11-1-157 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]# ls -al
drwxr-sr-x 2 root nova 4096 Mar 24 09:53 .
drwxr-sr-x 7 nova nova 4096 Mar 24 09:53 ..
-rw------- 1 root nova 1242435922 Mar 24 09:54 .disk.ph4Fkv
当copy完成
目标主机instance目录结构为
[root@kvm-10-11-1-157 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]# ls -al
drwxr-sr-x 2 root nova 4096 Mar 24 09:55 .
drwxr-sr-x 7 nova nova 4096 Mar 24 09:55 ..
-rw-r--r-- 1 root nova 1439761408 Mar 24 09:55 disk
镜像被送过来了,现在需要做的就是配置好instance网络,磁盘设备及其他libvirt.xml中配置, 把instance启动起来.主要是通过 finish_resize函数来完成的。
flavor若有变化,也会在instance的属性中做修改,从而体现在最终的libvirt.xml上,disk的size也会通过qemu-img resize进行resize,配置好网络及其相关设备,可以启动instance。可以通过virsh list查看。
以下是disk “qemu-img resize"前后的对比, 本例中是resize 从2 到3
[root@kvm-10-11-1-157 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]# qemu-img info disk
image: disk
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.3G
cluster_size: 65536
[root@kvm-10-11-1-157 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]# qemu-img info disk
image: disk
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 1.3G
cluster_size: 65536
最后的instance目录目录结构:
[root@kvm-10-11-1-157 9dd5d463-f9a9-4173-a3fb-91ce95ccac7b]ls -al
drwxr-sr-x 2 root nova 4096 Mar 24 09:55 .