我有两台 KVM 服务器和一些虚拟机。
服务器(A)带有 qcow2 镜像的 KVM
服务器(B)KVM 为分区挂载 NFS(服务器 A 上存在 qcow2 映像)。
我的问题很简单,在服务器 B 上创建虚拟磁盘副本的最佳解决方案是什么(显然虚拟机正在运行)。DRBD 是一种解决方案吗?
答案1
如果您只想在服务器 B 上复制服务器 A 的 qcow2 映像,但不必在 A 和 B 上同时访问它们,那么您可以在其上使用带有任何文件系统(如 ext4)的 DRBD,在 A 上作为主服务器运行,在 B 上作为辅助服务器运行。当 A 出现故障时,您将能够将 B 上的 DRBD 切换为主服务器并在那里使用映像。
如果您希望这些图像同时在 A 和 B 上可用和使用,那么这将更加棘手。集群文件系统可能会有所帮助,但我认为性能不会好。
如果您只想一次性复制映像,则只需停止 A 上的虚拟机,然后使用 scp/rsync/over-NFS/whatever 复制映像。如果虚拟机必须在 A 上运行,那么为了获得一致的映像,您将需要制作某种快照。我不知道 KVM 和 QCOW2,但也许它们提供了一些快照功能。如果没有,那么如果您将映像存储在 LVM 卷上,LVM 快照可能会有。
答案2
看一眼https://alteeve.ca/w/2-Node_Red_Hat_KVM_Cluster_Tutorial它将引导您完成所有步骤。
答案3
为了实现虚拟机的高可用性,您可以尝试 Ganeti 和 DRBD 作为您的资源,虽然设置 Ganeti 几乎不需要做任何额外工作,但这种痛苦是值得的,因为它将使您的 VM 管理真正顺畅。
我能想到的另一个选择是使用 gluster 卷。它的设置和安装非常简单,如果你有好的硬件,那么性能应该会很好。
到目前为止,我按照 Jacek 解释的方式使用简单的 DRBD 风格,我也在探索其他方式。
答案4
我一直在研究这个问题。我用两种不同的方法解决了这个问题。
设置
我选择使用原始格式在 LV 之上构建我的 kvm 客户系统。我不知道这是否比将它们放在 LV 上的映像文件上更好,但这就是我要做的。使用 drbd 同步 LVM 物理分区会简单得多,但我想运行多个 LV,并让一个运行(hostA
需要drbd
主要角色),另一个运行hostB
(也需要drbd
主要角色)。所以除非我去 gluster,否则我会陷入困境,但目前我不愿意采用另一种技术。我的存储堆栈已经是:
KVM guest
drbd (drbd1)
lvm2 logical volume (guestlv)
lvm2 volume group (vg)
lvm2 physical volume (crypt)
dm-crypt (crypt)
gpt partitions (md_d0p1=root, md_d0p2=swap, md_d0p3=crypt)
mirror-RAID (md_d0)
gpt partition (single)
hard drive (2)
我必须解决的最大问题是virt-manager
无法识别或让您使用drbd
卷(对我来说virt-install
不起作用vmbuilder
)。 因此,这就是我所做的:
hostA
和hastB
正在运行 Ubunut 14.04LTS,安装了 OpenSSH 服务器和虚拟化主机包,lvm2
还drbd8-utils
安装了 和 。每个都有 4 个 NICS,成对绑定。bond0
桥接到br0
客户机并由其使用,bond1
未桥接并使用为 保留的子网drbd
。
KVM + DRBD 方法 1
A 部分 - 创建 KVM 客户机
- 在 上创建 LV
hostA
。 - 复制
ubuntu-14.04.1-server-amd64.iso
到/var/lib/libvirt/images
- 在运行 Ubuntu Desktop 的客户端上,运行
virt-manager
。 - 连接到
hostA
。 - 打开
Details
窗口并使用存储选项卡添加 LVM 卷组。 - 配置一台新机器,使用安装ISO,LV用于存储,
br0
用于网络。 - 重新启动等,确保您的 LV 运行良好。
B 部分 - 配置复制
- 关闭 KVM 客户系统。
- 用于
lvresize
将 LV 大小增加 1 个 lun。lvresize -l +1 vg/guestlv
- 初始化
drbd
元数据。drbdadm create-md /dev/vg/guestlv
- 创建
drbd
资源文件。file:/etc/drbd.d/guest.res resource guest { device /dev/drbd1; meta-disk internal; startup { become-primary-on hostA; wfc-timeout 30; outdated-wfc-timeout 20; degr-wfc-timeout 30; } net { cram-hmac-alg sha1; shared-secret sync_disk; } syncer { rate 100M; verify-alg sha1; } on hostA { address 192.168.2.1:7789; disk /dev/vg/guestlv; } on hostB { address 192.168.2.2:7789; disk /dev/vg/guestlv; } }
- 在
hostB
- 使用资源文件中的卷组和 LV 名称,创建一个大小相同(新的 +1 大小!)的 LV。
- 跑步
drbdadm create-md /dev/vg/guestlv
- 跑步
drbdadm connect --discard-my-data guest
- 跑步
drbdadm up guest
- 在
hostA
- 跑步
drbdadm up guest
- 跑步
drbdadm primary guest
- 跑步
C 部分 - 将 drbd 设备切换到 KVM 配置
- 开启
hostA
,运行virsh edit guestlv
- 找到该行
<source dev='/dev/vg/guestlv'/>
并将其更改为<source dev='/dev/drbd1'/>
- 保存并退出,启动虚拟机,验证其是否正常工作。关闭它。
- 等待
drbd
同步完成。 - 跑步
drbdadm secondary guest
。 - 继续
hostB
,跑drbdadm primary guest
。 - 在您的工作站上,使用
virt-manager
一些垃圾卷创建一个新的客户机用于存储。安装开始后立即关闭它。 - 在 上
hostB
,使用virsh edit guestlv
并将存储设置为/dev/drbd1
。启动虚拟机,验证其是否正常工作等。
KVM + DRBD 方法 2 与上面的非常相似,但是
- 设置
/dev/drbd1
并同步。 - 使用垃圾卷作为存储创建 KVM 客户机,中止安装。
- 用于
virsh-edit
交换存储/dev/drbd1
。 - 启动它并运行安装程序。有时这个方法有效,但有时我在安装 grub 时会遇到一个显示停止的错误
/dev/vda
。 - 如果确实使其工作,请关闭虚拟机,交换
drbd
主主机和辅助主机,配置其他主机,进行测试等。