【问题标题】:Proposal to Migrate OpenNebula Datastore from Local FS to NFS将 OpenNebula 数据存储从本地 FS 迁移到 NFS 的建议
【发布时间】:2018-07-21 02:54:43
【问题描述】:

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

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

我正在研究一种实现这一目标的方法,并希望得到一些反馈,说明为什么这是一个好主意或一个坏主意。

谢谢

【问题讨论】:

    标签: ssh nfs migrate opennebula


    【解决方案1】:

    OpenNebula 目前不支持将虚拟机从一种类型的数据存储迁移到另一种不同类型的数据存储。我一直在研究一种行之有效的方法,并希望在此处记录它以获得有关该方法的一些反馈和意见。

    数据存储类型主要由传输管理器驱动程序“TM_MAD”设置标识。无法通过 Sunstone 或 cli 更改此设置。所以我们需要一种方法来做到这一点。这就是我所做的。我开始在一个 VM 中全新安装 OpenNebula 5.4.13,并且 2 个 VM 节点都在 VMware 虚拟机中运行 Debian 9(不要忘记检查 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. 关闭所有正在运行的虚拟机并取消部署它们。这会保存机器状态并将图像复制回图像存储,
    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 数据存储有点不同。没有 SHARED 选项,但我们想使用 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,并显示正确的驱动程序,即 shared 或 qcow2。

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

    配置节点

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

    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 并检查日志以确保它成功。我发现我必须刷新显示,然后转到主机选项卡以检查 VM 是否已迁移。之后它显示正确,但我认为这是我浏览器中的缓存问题。在实时迁移之后,您应该仍然可以看到 ping 滚动,结果中可能有一个失败的 ping。

    结论

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

    好吧,玩得开心。我要去尝试将共享存储移动到某种共享集群,例如 Ceph 或 GlusterFS!

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 2019-11-26
      • 2019-11-21
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多