如何控制pacemaker集群中libvirtd和virtlockd的启动和停止?

如何控制pacemaker集群中libvirtd和virtlockd的启动和停止?

使用间接锁virtlockd(由 使用的)libvirtd需要使用集群范围的共享文件系统,如 OCFS2。反过来,这意味着virtlockd必须在共享文件系统挂载后启动(否则创建的锁最多只能是本地的)。当然libvirtd必须在 之后启动virtlockd,并且 之后的任何 VM 都必须启动virtlockd

所以我想要启动:起搏器、DLM、OCFS 安装、、、virtlockdVM libvirtd......

为了停止,我想要相反的方向。

我已经正确配置了所有这些原语(特别是systemd:libvirtd.servicesystemd:virtlockd)、克隆和约束(我希望),但我仍然遇到问题virtlockd

在像 SLES15 这样的系统中systemd控制这些服务,并且systemd即使它们都是,它似乎也有自己的生命控制(启动)服务disabled

所以问题是:有人通过这样的设置成功吗?

更新 (2021-02-04)

我在状态输出中发现了这个“Drop-In” virtlockd.service/run/systemd/system/virtlockd.service.d/50-pacemaker.conf

它包含了:

[Unit]
Description=Cluster Controlled virtlockd
Before=pacemaker.service pacemaker_remote.service

[Service]
Restart=no

存在相应文件/run/systemd/system/libvirtd.service.service.d/50-pacemaker.conf

[Unit]
Description=Cluster Controlled libvirtd.service
Before=pacemaker.service pacemaker_remote.service

[Service]
Restart=no

这些是否会导致我看到的问题(systemd启动libvirtd-ro.socketlibvirts-admin.socket然后libvirtd.service启动virtlockd)?

更新 (2021-02-05)

看起来,节点启动时(例如隔离后)资源以正确的顺序启动,但重新启动 Pacemaker 时(例如通过crm cluster restart),systemd资源会干扰并在virtlockdPacemaker 想要启动它之前启动。也许区别在于/run目录。

更新 (2021-02-08)

我发现的另一个问题是,即使/etc/libvirt/libvirtd.conf包含listen_tls = 1,按照指示通过 Pacemaker 启动libvirtd也会导致libvirtd未打开 TLS 套接字,从而阻止 VM 实时迁移。

答案1

实时迁移期间仍然存在一些锁定问题,这可能是 libvirtd 中的一个错误,但我想我找到了解决方案:

该解决方案的部分内容位于https://bugzilla.redhat.com/show_bug.cgi?id=1750340

第一件事是不要使用 systemd 的“套接字激活”disable对于 libvirtd。对于所有套接字单元(libvirtd.socketlibvirtd-ro.socketlibvirtd-admin.socketlibvirtd-tcp.socket、 )来说,这还不够libvirtd-tls.socket,但你必须对mask它们进行配置。

然后libvirtd不会打开 TLS 套接字,即使listen_tls=1已设置。要激活它,您必须(在 SLES 15 SP2 中)编辑/etc/sysconfig/libvirtd以激活LIBVIRTD_ARGS="--listen"。同时您必须停用LIBVIRTD_ARGS="--timeout 120"以防止 libvirtd 自动终止。

最后,您必须在正确的时间点启动(配置后)并停止 virtlockd 和 libvirtd。我使用多路径 SAN 设备来托管我的 VM 映像,同时使用集群 RAID1(/dev/md10)来保存锁。OCFS2 用作两者之上的文件系统。Clustered-MD 和 OCFS2 都需要 DLM。集群范围的资源使用克隆来分发它们。libvirt 和映像路径/cfs/VMI准备就绪后,我会运行三个测试 VM。我不会在这里解释使用 lockd 和间接锁定进行配置的步骤,就像我不会解释如何设置集群 MD RAID 或 OCFS2 文件系统一样。

以下是 crm 语法中的三节点集群配置(省略了隔离资源):

node 1: node1 \
    attributes standby=off
node 2: node2 \
    attributes standby=off
node 3: node3 \
    attributes standby=off
primitive prm_CFS_VMI Filesystem \
    params device="/dev/disk/by-id/dm-name-VMI-PM" directory="/cfs/VMI" fstype=ocfs2 options="acl,user_xattr" \
    op start timeout=90 interval=0 \
    op stop timeout=90 interval=0 \
    op monitor interval=120 timeout=90
primitive prm_DLM ocf:pacemaker:controld \
    op start timeout=90 interval=0 \
    op stop timeout=120 interval=0 \
    op monitor interval=60 timeout=60
primitive prm_libvirtd systemd:libvirtd.service \
    op start timeout=100 interval=0 \
    op stop timeout=100 interval=0 \
    op monitor interval=60 timeout=100
primitive prm_lockspace_ocfs2 Filesystem \
    params device="/dev/md10" directory="/var/lib/libvirt/lockd" fstype=ocfs2 options="acl,user_xattr" \
    op start timeout=90 interval=0 \
    op stop timeout=90 interval=0 \
    op monitor interval=120 timeout=90
primitive prm_lockspace_raid_md10 Raid1 \
    params raidconf="/etc/mdadm/mdadm.conf" raiddev="/dev/md10" force_clones=true \
    op start timeout=90s interval=0 \
    op stop timeout=90s interval=0 \
    op monitor interval=300 timeout=90s \
    op_params OCF_CHECK_LEVEL=10
primitive prm_virtlockd systemd:virtlockd \
    op start timeout=100 interval=0 \
    op stop timeout=100 interval=0 \
    op monitor interval=60 timeout=100
primitive prm_xen_test-jeos1 VirtualDomain \
    params param config="/etc/libvirt/libxl/test-jeos1.xml" hypervisor="xen:///system" remoteuri="xen+tls://%n.domain.org" \
    op start timeout=120 interval=0 \
    op stop timeout=180 interval=0 \
    op monitor interval=600 timeout=90 \
    op migrate_to timeout=300 interval=0 \
    op migrate_from timeout=300 interval=0 \
    meta allow-migrate=true resource-stickiness=1000
primitive prm_xen_test-jeos2 VirtualDomain \
    params param config="/etc/libvirt/libxl/test-jeos2.xml" hypervisor="xen:///system" remoteuri="xen+tls://%n.domain.org" \
    op start timeout=120 interval=0 \
    op stop timeout=180 interval=0 \
    op monitor interval=600 timeout=90 \
    op migrate_to timeout=300 interval=0 \
    op migrate_from timeout=300 interval=0 \
    meta allow-migrate=true resource-stickiness=1000
primitive prm_xen_test-jeos3 VirtualDomain \
    params param config="/etc/libvirt/libxl/test-jeos3.xml" hypervisor="xen:///system" remoteuri="xen+tls://%n.domain.org" \
    op start timeout=120 interval=0 \
    op stop timeout=180 interval=0 \
    op monitor interval=600 timeout=90 \
    op migrate_to timeout=300 interval=0 \
    op migrate_from timeout=300 interval=0 \
    meta allow-migrate=true resource-stickiness=1000
clone cln_CFS_VMI prm_CFS_VMI \
    meta interleave=true
clone cln_DLM prm_DLM \
    meta interleave=true
clone cln_libvirtd prm_libvirtd \
    meta interleave=true
clone cln_lockspace_ocfs2 prm_lockspace_ocfs2 \
    meta interleave=true
clone cln_lockspace_raid_md10 prm_lockspace_raid_md10 \
    meta interleave=true
clone cln_virtlockd prm_virtlockd \
    meta interleave=true
colocation col_CFS_VMI__DLM inf: cln_CFS_VMI cln_DLM
colocation col_clustered-MD__DLM inf: cln_lockspace_raid_md10 cln_DLM
colocation col_libvirtd__cln_virtlockd inf: cln_libvirtd cln_virtlockd
colocation col_libvirtd__virtlockd inf: cln_libvirtd cln_virtlockd
colocation col_lockspace_ocfs2__DLM inf: cln_lockspace_ocfs2 cln_DLM
colocation col_lockspace_ocfs2__raid_md10 inf: cln_lockspace_ocfs2 cln_lockspace_raid_md10
colocation col_test-jeos1__CFS_VMI inf: prm_xen_test-jeos1 cln_CFS_VMI
colocation col_test-jeos2__CFS_VMI inf: prm_xen_test-jeos2 cln_CFS_VMI
colocation col_test-jeos3__CFS_VMI inf: prm_xen_test-jeos3 cln_CFS_VMI
colocation col_virtlockd__lockspace_fs inf: cln_virtlockd cln_lockspace_ocfs2
colocation col_vm__libvirtd inf: ( prm_xen_test-jeos1 prm_xen_test-jeos2 prm_xen_test-jeos3 ) cln_libvirtd
order ord_CFS_VMI_xen_test-jeos1 Mandatory: cln_CFS_VMI prm_xen_test-jeos1
order ord_CFS_VMI_xen_test-jeos2 Mandatory: cln_CFS_VMI prm_xen_test-jeos2
order ord_CFS_VMI_xen_test-jeos3 Mandatory: cln_CFS_VMI prm_xen_test-jeos3
order ord_DLM__CFS_VMI Mandatory: cln_DLM cln_CFS_VMI
order ord_DLM__clustered-MD Mandatory: cln_DLM cln_lockspace_raid_md10
order ord_DLM__lockspace_ocfs2 Mandatory: cln_DLM cln_lockspace_ocfs2
order ord_libvirtd__vm Mandatory: cln_libvirtd ( prm_xen_test-jeos1 prm_xen_test-jeos2 prm_xen_test-jeos3  )
order ord_lockspace_fs__virtlockd Mandatory: cln_lockspace_ocfs2 cln_virtlockd
order ord_raid_md10__lockspace_ocfs2 Mandatory: cln_lockspace_raid_md10 cln_lockspace_ocfs2
order ord_virtlockd__libvirtd Mandatory: cln_virtlockd cln_libvirtd

因此基本顺序是:

order ord_lockspace_fs__virtlockd Mandatory: cln_lockspace_ocfs2 cln_virtlockd
order ord_virtlockd__libvirtd Mandatory: cln_virtlockd cln_libvirtd
order ord_libvirtd__vm Mandatory: cln_libvirtd ( prm_xen_test-jeos1 prm_xen_test-jeos2 prm_xen_test-jeos3 )
order ord_CFS_VMI_xen_test-jeos1 Mandatory: cln_CFS_VMI prm_xen_test-jeos1
order ord_CFS_VMI_xen_test-jeos2 Mandatory: cln_CFS_VMI prm_xen_test-jeos2
order ord_CFS_VMI_xen_test-jeos3 Mandatory: cln_CFS_VMI prm_xen_test-jeos3

剩下的问题是,libvird 声称在迁移成功前不久的实时迁移过程中虚拟机没有在原始节点上锁定。

答案2

温德尔,

为了消除虚拟化和HA产品文档之间的差距,我搭建了一个高可用的虚拟化环境,详细步骤如下,

SLE HA 硬件环境详情:

集群节点大小 戴尔 Precision Tower 5810 
共享磁盘 高速缓存 (50G) 
SLE HA 版本 SLE15 HA SP2
集群节点数 2
SBD 分区 独立系统接口 (50MB)
文件系统分区 独立系统接口 (20GB)
虚拟机镜像分区 独立系统接口 (30GB)

安装和设置过程:

1. 将 iscsi 磁盘连接到两个集群节点,将 iscsi 磁盘分成 3 个分区(例如 50MB 用于 sbd,20GB 用于 ocfs2,其余用于 VM 映像)。 
    在每个集群节点上添加网桥 br0(将在安装/运行虚拟机时使用)。
    为集群节点之间的 root 用户设置无密码 ssh 登录。

2. 在每个集群节点上安装 HA 和虚拟化相关软件包。
    # zypper in -t pattern ha_sles
    # zypper in -t pattern kvm_server kvm_tools

3. 设置 HA 集群并添加 SBD 设备。
    请参阅 HA 指南 http://docserv.suse.de/documents/en-us/sle-ha/15-SP2/single-html/SLE-HA-guide/#book-sleha-guide 

4. 在 crm 中设置 DLM 和 OCFS2 资源。

    例如

    primitive dlm ocf:pacemaker:controld \
    op monitor interval=60 timeout=60
    primitive ocfs2-2 Filesystem \
    params device="/dev/disk/by-id/scsi-149455400000000004100c3befec3dc9a81f9ce28f7a8b8de-part1" directory="/mnt/shared" fstype=ocfs2 \
    op monitor interval=20 timeout=40
    group base-group dlm ocfs2-2
    clone base-clone base-group \
    meta interleave=true
 
5. 在每个集群节点上设置 virtlockd 和 libvirtd 服务。

    编辑 /etc/libvirt/qemu.conf,设置 lock_manager = “lockd”

    编辑 /etc/libvirt/qemu-lockd.conf,设置 file_lockspace_dir = "/mnt/shared/lockd" (注意:/mnt/shared 是 ocfs2 文件系统挂载点)

    重启/启用 libvirtd 服务(注意:virtlockd 服务将根据配置由 libvirtd 服务启动)

6. 在一个集群节点的共享分区上安装虚拟机(例如 sle15-nd),将域配置转储到 XML 文件。
    将虚拟机配置文件移动到 ocfs2 文件系统(例如 /mnt/shared)。
    注意:请确保 XML 配置文件不包含对非共享本地路径的任何引用。

7. 在 crm 中设置 VirtualDomain 资源和顺序。

    例如

    原始 vm_nd1 虚拟域 \
    params config="/mnt/shared/sle15-nd.xml" remoteuri="qemu+ssh://%n/system" \
    meta allow-migrate=true \
    op monitor timeout=30s interval=10s \
    利用率 cpu=2 hv_memory=1024

    order ord_fs_virt 强制:base-clone vm_nd1

8. 使用 crm 中的 show 命令检查所有更改,然后提交:

    例如 

    crm(live/sle15sp2-test1)configure# 显示
    节点 172167755:sle15sp2-test2
    节点 172168091:sle15sp2-test1
    原始 dlm ocf:pacemaker:controld \
    op 监视器间隔=60 超时=60
    原始 ocfs2-2 文件系统 \
    参数设备=“/dev/disk/by-id/scsi-149455400000000004100c3befec3dc9a81f9ce28f7a8b8de-part1”目录=“/mnt/shared”fstype=ocfs2 \
    op 监视器间隔=20 超时=40
    原始 stonith-sbd stonith:external/sbd \
    参数 pcmk_delay_max=30s
    原始 vm_nd1 虚拟域 \
    参数config="/mnt/shared/sle15-nd.xml" remoteuri="qemu+ssh://%n/system" \
    meta allow-migrate=true \
    op monitor timeout=30s interval=10s \
    utilize cpu=2 hv_memory=1024
    group base-group dlm ocfs2-2
    clone base-clone base-group \
    meta interleave=true
    order ord_fs_virt 强制:base-clone vm_nd1
    属性 cib-bootstrap-options:\
    have-watchdog=true \
    dc-version="2.0.3+20200511.2b248d828-1.10-2.0.3+20200511.2b248d828" \
    cluster-infrastructure=corosync \
    cluster-name=hacluster \
    stonith-enabled=true
    rsc_defaults rsc 选项:\
    resource-stickiness=1 \
    migration-threshold=3
    op_defaults op 选项:\
    timeout=600 \
    record-pending=true

验证虚拟机资源是否可以在 HA 集群上运行:

1.验证虚拟机资源是否在集群节点间受到保护。

    测试结果:当该虚拟机在另一个集群节点上运行时,无法通过 virsh 命令手动启动该虚拟机。

2. 验证当前集群节点崩溃时,虚拟机资源是否可以被另一个集群节点接管

    测试结果:几秒后(集群隔离时间),VM 在另一个集群节点上启动。

3. 验证当前集群节点重启时,虚拟机资源是否可以被另一个集群节点获取

    测试结果:VM迁移至另一个集群节点。

4.检查是否可以在集群节点之间迁移虚拟机资源

   测试结果:是的,整个迁移过程中与虚拟机的远程 SSH 连接没有中断。

评论:

1.实际生产环境中,集群通信/管理应该使用单独的网络。

2.实际生产环境中,集群sbd设备应该使用单独的共享磁盘,以避免IO饥饿。 

3. 由于文件 lockspace 目录位于 ocfs2 文件系统下,因此在 ocfs2 文件系统挂载前,不要手动启动虚拟机实例。换句话说,您应该让集群(pacemaker)管理所有虚拟机的启动和停止。

相关内容