将OpenNebula数据存储区从本地FS迁移到NFS的提案

时间:2018-07-21 02:54:43

标签: ssh nfs migrate opennebula

我有一个带有2个运行KVM和本地文件存储的节点的OpenNebula实例。这意味着没有实时迁移,因为vm映像被scp'到每个节点,因此也没有故障转移或实时迁移的选项。

我想实现NFS共享存储,并将VM从本地FS数据存储移动到NFS共享存储数据存储。 OpenNebula支持在数据存储区之间迁移VM,但仅迁移相同类型的数据存储区,即将'ssh'转换为'ssh',而不将'ssh'转换为'shared'。

我正在研究一种实现此目标的方法,并且希望获得一些反馈,以了解为什么这是一个好主意。

谢谢

1 个答案:

答案 0 :(得分:0)

OpenNebula当前不支持将VM从一种类型的数据存储迁移到另一种不同类型的数据存储。我一直在研究一种有效的方法,并希望在此处进行记录,以获取对该方法的一些反馈和意见。

数据存储类型主要由传输管理器驱动程序“ TM_MAD”设置标识。不能通过Sunstone或cli更改此设置。因此,我们需要一种方法来做到这一点。这就是我所做的。我首先在一个VM中全新安装了OpenNebula 5.4.13,然后在VMware虚拟机中安装了两个均运行Debian 9的VM节点(不要忘记检查VM CPU选项的虚拟化)。

注意:这是一个实验过程,因此请确保先备份所有内容!

步骤

要迁移到其他商店,我们需要执行几个步骤。它们如下:

  1. 设置NFS共享导出,
  2. 将VM映像移至NFS共享并安装数据存储,
  3. 更改数据存储类型,
  4. 为NFS共享配置节点。

设置NFS服务器

我们要做的第一件事是设置我们要使用的NFS共享。我为基本数据存储文件夹使用了一个共享,但是您可以为来自不同NFS服务器的每个数据存储ID使用单独的共享。

  1. 在NFS服务器上,创建数据存储文件夹,即mkdir /share/one_datastore
  2. 添加要导出的数据存储路径并导出新共享exportfs -rav
  3. 确认共享可用showmount -e localhost

准备迁移

在修改数据存储区之前,首先需要做一些事情:

  1. 关闭所有正在运行的VM并取消部署它们。这样可以保存机器状态并将图像复制回图像存储,
  2. 停止Sunstone和OpenNebula服务systemctl stop opennebula && systemctl stop opennebula-sunstone

迁移数据

共享存储共享VM磁盘映像,因此所有节点都可以访问相同的数据。因此,将VM数据复制到NFS共享以准备安装。

  1. 从Sunstone前端服务器确认NFS共享showmount -e [nfs-server]
  2. 创建一个临时文件夹以将共享装入mkdir /mnt/datastore
  3. 临时挂载NFS文件夹mount [nfs-server]:/share/one_datastore /mnt/datastore
  4. 将数据存储文件夹移动到共享mv /var/lib/one/datastores/* /mnt/datastore/
  5. OpenNebula数据存储文件夹现在位于NFS服务器上:ls /mnt/datastore应列出文件夹0、1和2,
  6. 安装NFS共享以替换OpenNebula数据存储文件夹mount [nfs-server]:/share/one_datastore /var/lib/one/datastores
  7. 确认文件夹可用ls /var/lib/one/datastores应列出我们的3个文件夹0、1和2,
  8. 将挂载添加到/ etc / fstab中,以在启动时持久保留挂载。

OpenNebula前端现已配置为从NFS共享访问数据存储文件夹。接下来,我们要将数据存储类型从ssh更改为shared。

更改数据存储类型

用于数据存储配置的数据存储在OpenNebula数据库/var/lib/one/one.db中。我们可以通过编辑数据存储配置数据来更改驱动程序类型,该数据然后告诉OpenNebula使用哪个驱动程序以及如何处理数据存储数据。默认情况下,OpenNebula使用带MySql选项的sqlite数据库。我正在使用sqlite,但对MySql相同。

  1. 打开OpenNebula数据库sqlite3 /var/lib/one/one.db
  2. 使用.tables查看所有表。 datastore_pool是我们要修改的表,
  3. 列出表select * from datastore_pool;中的所有记录将导致屏幕上充满了配置数据。每个记录都有一个标识符oid,该标识符与数据存储区ID相匹配,如下所示(前0是默认SYSTEM数据库的数据存储区ID):

0|system|<DATASTORE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>oneadmin</UNAME><GNAME>oneadmin</GNAME><NAME>system</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>1</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><DS_MAD><![CDATA[-]]></DS_MAD><TM_MAD><![CDATA[ssh]]></TM_MAD><BASE_PATH><![CDATA[/var/lib/one//datastores/0]]></BASE_PATH><TYPE>1</TYPE><DISK_TYPE>0</DISK_TYPE><STATE>0</STATE><CLUSTERS><ID>0</ID></CLUSTERS><TOTAL_MB>0</TOTAL_MB><FREE_MB>0</FREE_MB><USED_MB>0</USED_MB><IMAGES></IMAGES><TEMPLATE><ALLOW_ORPHANS><![CDATA[NO]]></ALLOW_ORPHANS><DISK_TYPE><![CDATA[FILE]]></DISK_TYPE><DS_MIGRATE><![CDATA[YES]]></DS_MIGRATE><RESTRICTED_DIRS><![CDATA[/]]></RESTRICTED_DIRS><SAFE_DIRS><![CDATA[/var/tmp]]></SAFE_DIRS><SHARED><![CDATA[NO]]></SHARED><TM_MAD><![CDATA[ssh]]></TM_MAD><TYPE><![CDATA[SYSTEM_DS]]></TYPE></TEMPLATE></DATASTORE>|0|0|1|1|0

  1. 现在更改数据存储类型。从第三列body中获取数据 (您可以运行select body from datastore_pool where oid=0;)并复制到您喜欢的文本编辑器(该块以开头,以结尾)。查找并替换:

查找:<TM_MAD><![CDATA[ssh]]></TM_MAD> 替换为:<TM_MAD><![CDATA[shared]]></TM_MAD>

查找:<SHARED><![CDATA[NO]]></SHARED> 替换为:<SHARED><![CDATA[YES]]></SHARED>

  1. 现在要更新SYSTEM数据存储记录。在数据库上运行以下命令,将[datastore-config]替换为刚修改的文本块update datastore_pool set body='[datastore-config]' where oid=0
  2. 更新IMAGE数据存储区有点不同。没有共享选项,但是我们想使用sharedqcow2驱动程序。我用了qcow2。因此:select body from datastore_pool where oid=1;

查找:<TM_MAD><![CDATA[ssh]]></TM_MAD> 替换:<TM_MAD><![CDATA[qcow2]]></TM_MAD>

  1. 更新记录:update datastore_pool set body='[datastore-config]' where oid=1;
  2. 通过将<TM_MAD><![CDATA[ssh]]></TM_MAD>替换为<TM_MAD><![CDATA[shared]]></TM_MAD>来更新FILES数据存储区(oid = 3),并使用上述方法进行更新。

现在,数据存储已更新为使用共享驱动程序,让我们启动Sunstone并检查数据存储是否显示。

systemctl start opennebula && systemctl start opennebula-sunstone

跳到Sunstone网站并转到数据存储。打开每个数据存储区,以检查是否已启用SHARED,并且正确的驱动程序显示为共享或qcow2。

〜不要做任何事情〜仍然需要配置节点!

配置节点

因此,由于我们停止并取消部署了VM,因此节点数据存储区中不应有任何数据。因此,我们可以将NFS共享设置到datastores文件夹。首先确认文件夹为空,并确保进行备份!请注意,这是一个实验过程!是的,让我们开始吧:

  1. 检查/var/lib/one/datastores的内容。如果要将每个基于数据存储ID的文件夹装入其自己的NFS共享,则可以执行此操作,而不是整个数据存储文件夹。清空任何包含0、1和2文件夹的文件夹。否则,请从数据存储文件夹中删除所有文件夹,
  2. 如果尚未安装:apt-get install nfs-common
  3. 检查NFS共享:showmount -e [nfs-server]
  4. 将nfs共享安装到数据存储文件夹:mount [nfs-server]:/share/one_datastore /var/lib/one/datastores
  5. 确认安装,即df
  6. 编辑/etc/fstab,添加安装,以便将其安装在下次启动时。
  7. 重新启动节点以确认数据存储nfs仍然存在,并重新启动它们!

与所有主机节点重复。

测试一下

在Sunstone中,转到“主机”选项卡,并检查它们是否已启动并正在运行。接下来,获取虚拟机并进行部署。它应该没有任何问题地部署并开始启动。

一旦启动并运行,我想在测试实时迁移时不断对虚拟机执行ping操作。因此,开始ping(在Windows中{ping [vm-ip] -t),然后在Sunstone中打开VM并“实时迁移”到另一个节点。观察ping并检查日志以确保成功。我发现我必须刷新显示,然后转到主机TAB来检查VM是否已迁移。之后,它显示正确,但我认为它是浏览器中的缓存问题。实时迁移后,您仍然应该可以看到ping滚动,结果可能是一次ping失败。

结论

这就是我用来从ssh本地存储迁移到共享存储的过程。我已经对其进行了测试,并且可以正常使用。但是,如果您对此过程有任何疑问或意见,请告诉我。如果有任何我忽略的陷阱,也请告诉我。

好吧,玩得开心。我打算尝试将共享存储移至某种共享群集,例如Ceph或GlusterFS!