OpenStack有两种在线迁移类型:live migration和block migration。Live migration需要实例保存在共享存储中,否则会报错,这种迁移主要是实例的内存状态的迁移,速度应该会很快。Block migration除了实例内存状态要迁移外,还得迁移磁盘文件,速度会慢些,但是它不要求实例存储在共享文件系统中。这里我所进行的是block migration。这两种迁移方式在nova client都通过命令nova live-migration实现。带参数--block_migrate表示后一种,不带表示前一种。要进行该操作需要用户在实例所在的tenant有admin角色。
修复BUG要实现block migration首先得修复这个bug,方法在这里,或者实例采用没有设置Root Disk和Ephemeral Disk大小的flavor。我查看了源文件在nova-2012.1.2中这个bug已经修复,但是我我进行的仍然是后一种。
修改配置主要是修改nova和libvirt的配置,让nova的vncserver监听0.0.0.0而不是计算节点的内部ip,让libvirt监听tcp,注意这里的关于修改libvirt配置的命令是针对CentOS的,Ubuntu等的修改请参照参考文档。命令如下:
sed -i 's/vncserver_listen.*/vncserver_listen=0.0.0.0/' /etc/nova/nova.conf sed -i -e 's/#listen_tls/listen_tls/' -e 's/#listen_tcp = 1/listen_tcp = 1\nauth_tcp = "none"/' /etc/libvirt/libvirtd.conf sed -i 's/#LIBVIRTD_ARGS/LIBVIRTD_ARGS/' /etc/sysconfig/libvirtd service libvirtd restart 注意事项 修改vncserver_listen后创建的实例才能迁移 在我的实验中,哪怕我手动修改实例的libvirt.xml文件,将vnc的监听ip改为0.0.0.0并重启nova-compute且让实例也重启仍然失败了。迁移过程中我看到在目的计算节点上已经创建了实例的相关文件,但是很快又被删除了,没有任何报错,实例仍然在源计算节点运行,状态从migrating恢复为active。 如果实例有挂载volume一定要先卸载再迁移 这点更重要,我对挂载有volume的实例进行迁移,结果一直处于mirating状态,所挂载的卷也处于migrating状态,通过Virual Machine Manager观察实例在源计算节点和目的计算节点的状态都为paused。我尝试重启两个节点的nova-compute服务,并配置让实例跟随重启。结果源节点报Domain not found错,且在Virual Machine Manager观察到实例被删除,但实例文件还在,服务也因报错启动失败。目的节点实例启动成功,且能识别挂载的卷,但是文件中缺少libvirt.xml文件,且不受OpenStack管理了,通过客户端查询实例信息,显示的信息为实例仍在源节点上,状态为正在迁移。尝试手动修改数据库使状态一致没有成功。 实例迁移过程会有短暂的无法联通情况 迁移过程我用ping命令测试,在迁移快完成的时候丢失了5个包,多次测试一样。 会在目的节点_base文件夹下创建额外的镜像文件 尽管我的目的节点_base下已经有了创建该实例所需要的镜像文件,但仍然会创建新的镜像文件,新文件文件名只是多加了个"_11",大小一样,如果直接使用已有的镜像不创建新就好了,当然如果已经有这个带后缀"_11"的文件存在就不会再创建了。