跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise High Availability 文档 / Quick Start Guides / 使用 DRBD 和 Pacemaker 的高度可用 NFS 存储服务
SUSE Linux Enterprise High Availability 15 SP6

使用 DRBD 和 Pacemaker 的高度可用 NFS 存储服务

出版日期:2025 年 3 月 20 日

此文档介绍了如何使用以下组件在双节点群集中设置高度可用的 NFS 储存:DRBD*(Distributed Replicated Block Device,分布式复制块设备)、LVM(Logical Volume Manager,逻辑卷管理器)和群集资源管理器 Pacemaker。

版权所有 © 2006–2025 SUSE LLC 和贡献者。保留所有权利。

根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的许可权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为GNU Free Documentation License的部分。

有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有第三方商标均是其各自所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。

本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。

1 使用情形

本文档将帮助您设置高度可用的 NFS 服务器。用于实现高度可用的 NFS 存储的群集具有以下属性:

  • 两个节点:alice(IP:192.168.1.1)和 bob(IP:192.168.1.2),两者之间通过网络彼此相连。

  • 两个浮动虚拟 IP 地址(192.168.1.10192.168.1.11),这样无论服务在哪个物理节点上运行,客户端都可连接到服务。一个 IP 地址用于使用 Hawk2 进行群集管理,另一个 IP 地址专用于 NFS 导出。

  • SBD 用作 STONITH 屏蔽设备,以避免分裂情况。STONITH 对于 HA 群集而言是必需的。

  • 当活动的主机发生故障(主动/被动设置)时,资源从一个节点故障转移至另一个节点。

  • 每个节点上的本地存储。使用 LVM 上的 DRBD 在节点之间同步数据。

  • 通过 NFS 导出的文件系统,以及一个用于跟踪 NFS 客户端状态的单独文件系统。

安装并设置好基本的双节点群集后,再使用 NFS 的存储和群集资源对其进行扩展,即可获得一个高度可用的 NFS 存储服务器。

2 准备双节点群集

在设置高度可用的 NFS 存储之前,您必须先准备好一个高可用性群集:

过程 1︰ 为 NFS 存储准备两节点群集
  1. 《安装和设置快速入门》中所述安装并设置一个基本的双节点群集。

  2. 两个节点上安装软件包 nfs-kernel-server

    # zypper install nfs-kernel-server

3 创建 LVM 设备

使用 LVM(逻辑卷管理器)可在多个文件系统上灵活分配存储空间。

使用 crm cluster run 同时在两个节点上运行这些命令。

过程 2︰ 为 DRBD 创建 LVM 设备
  1. 创建 LVM 物理卷,并将 /dev/disk/by-id/DEVICE_ID 替换为 LVM 的相应设备:

    # crm cluster run "pvcreate /dev/disk/by-id/DEVICE_ID"
  2. 创建包含此物理卷的 LVM 卷组 nfs

    # crm cluster run "vgcreate nfs /dev/disk/by-id/DEVICE_ID"
  3. 在卷组 nfs 中创建一个名为 share 的逻辑卷:

    # crm cluster run "lvcreate -n share -L 20G nfs"

    此卷用于 NFS 导出。

  4. 在卷组 nfs 中创建一个名为 state 的逻辑卷:

    # crm cluster run "lvcreate -n state -L 8G nfs"

    此卷用于跟踪 NFS 客户端状态。本示例中使用的 8 GB 卷大小应支持数千个并发 NFS 客户端。

  5. 激活卷组:

    # crm cluster run "vgchange -ay nfs"

现在应会在系统上看到以下设备:/dev/nfs/share/dev/nfs/state

4 创建 DRBD 设备

本章介绍如何在 LVM 上设置 DRBD 设备。使用 LVM 作为 DRBD 的后端可获得以下好处:

  • 比在 DRBD 上使用 LVM 的配置更容易设置。

  • 当需要调整 LVM 磁盘的大小或有更多磁盘添加到卷组时,管理起来更容易。

以下过程会创建两个 DRBD 设备:一个设备用于 NFS 导出,另一个设备用于跟踪 NFS 客户端状态。

4.1 创建 DRBD 配置

DRBD 配置文件保存在 /etc/drbd.d/ 目录中,必须以 .res 扩展名结尾。在此过程中,配置文件命名为 /etc/drbd.d/nfs.res

过程 3︰ 创建 DRBD 配置
  1. 创建包含以下内容的 /etc/drbd.d/nfs.res 文件:

    resource nfs {
       volume 0 { 1
          device           /dev/drbd0; 2
          disk             /dev/nfs/state; 3
          meta-disk        internal; 4
       }
       volume 1 {
          device           /dev/drbd1;
          disk             /dev/nfs/share;
          meta-disk        internal;
       }
    
       net {
          protocol  C; 5
          fencing resource-and-stonith; 6
       }
    
       handlers { 7
          fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh";
          after-resync-target "/usr/lib/drbd/crm-unfence-peer.9.sh";
       }
    
       connection-mesh { 8
          hosts     alice bob;
       }
       on alice { 9
          address   192.168.1.1:7790;
          node-id   0;
       }
       on bob { 9
          address   192.168.1.2:7790;
          node-id   1;
       }
    }

    1

    要创建的每个 DRBD 设备的卷号。

    2

    应用程序要访问的 DRBD 设备。

    3

    DRBD 用于存储实际数据的较低级别块设备。这是在第 3 节 “创建 LVM 设备”中创建的 LVM 设备。

    4

    元数据的存储位置。如果使用 internal,元数据将与用户数据一起存储在同一设备上。有关更多信息,请参见手册页。

    5

    此连接使用的协议。协议 C 提供更好的数据可用性,只有在写入内容进入所有本地和远程磁盘之后,该协议才将写入操作视为已完成。

    6

    指定屏蔽策略。对于配置了 STONITH 设备的群集,请使用 resource-and-stonith

    7

    启用资源级别屏蔽。如果 DRBD 复制链路的连接中断,Pacemaker 会尝试将 DRBD 资源升级到另一个节点。有关详细信息,请参见第 23.6 节 “搭配使用资源级屏蔽与 STONITH”

    8

    定义网格的所有节点。hosts 参数包含共享相同 DRBD 设置的所有主机名。

    9

    包含每个节点的 IP 地址和唯一标识符。

  2. 打开 /etc/csync2/csync2.cfg 并检查其中是否包含以下两行:

    include /etc/drbd.conf;
    include /etc/drbd.d;

    如果不存在,请将这两行添加到文件中。

  3. 将文件复制到其他节点上:

    # csync2 -xv

    有关 Csync2 的信息,请参见第 4.7 节 “将配置传输到所有节点”

4.2 激活 DRBD 设备

准备好 DRBD 配置后,激活设备:

过程 4︰ 激活 DRBD 设备
  1. 如果您在群集中使用防火墙,请在防火墙配置中打开端口 7790

  2. 初始化元数据存储:

    # crm cluster run "drbdadm create-md nfs"
  3. 创建 DRBD 设备:

    # crm cluster run "drbdadm up nfs"
  4. 设备中尚不包含数据,因此您可以运行以下命令来跳过初始同步:

    # drbdadm new-current-uuid --clear-bitmap nfs/0
    # drbdadm new-current-uuid --clear-bitmap nfs/1
  5. alice 设为主节点:

    # drbdadm primary --force nfs
  6. 检查 nfs 的 DRBD 状态:

    # drbdadm status nfs

    此命令将返回以下消息:

    nfs role:Primary
      volume:0 disk:UpToDate
      volume:1 disk:UpToDate
      bob role:Secondary
        volume:0 peer-disk:UpToDate
        volume:1 peer-disk:UpToDate

您可以访问块设备 /dev/drbd0/dev/drbd1 上的 DRBD 资源。

4.3 创建文件系统

激活 DRBD 设备后,在其上创建文件系统:

过程 5︰ 为 DRBD 创建文件系统
  1. /dev/drbd0 上创建 ext4 文件系统:

    # mkfs.ext4 /dev/drbd0
  2. /dev/drbd1 上创建 ext4 文件系统:

    # mkfs.ext4 /dev/drbd1

5 创建群集资源

以下过程说明如何配置高度可用的 NFS 群集所需的资源。

群集资源概述
DRBD 原始资源和可升级克隆资源

这些资源用于复制数据。群集资源管理器认为有必要时,会将可升级克隆资源在主次角色之间切换。

文件系统资源

这些资源将管理要导出的文件系统,以及要跟踪 NFS 客户端状态的文件系统。

NFS 内核服务器资源

此资源管理 NFS 服务器守护程序。

NFS 导出

此资源用于将目录 /srv/nfs/share 导出到客户端。

虚拟 IP 地址

初始安装会创建用于 Hawk2 的管理虚拟 IP 地址。创建另一个专用于 NFS 导出的虚拟 IP 地址。这样,以后便可更轻松地应用安全限制。

示例 NFS 情形
  • 下列配置示例假设 192.168.1.11 是用于为 192.168.1.x/24 子网中的客户端传递数据的 NFS 服务器的虚拟 IP 地址。

  • 服务导出从 /srv/nfs/share 传递的数据。

  • 群集将 DRBD 设备 /dev/drbd1 中的 ext4 文件系统挂载到此导出目录中。此 DRBD 设备位于名为 /dev/nfs/share 的 LVM 逻辑卷上。

  • DRBD 设备 /dev/drbd0 用于共享 /var/lib/nfs 中的 NFS 客户端状态。此 DRBD 设备位于名为 /dev/nfs/state 的 LVM 逻辑卷上。

5.1 创建 DRBD 原始资源和可升级克隆资源

创建一个群集资源用于管理 DRBD 设备,并创建一个可升级克隆资源,使此群集资源可在两个节点上运行:

过程 6︰ 为 NFS 创建 DRBD 资源
  1. 启动 crm 交互外壳:

    # crm configure
  2. 为 DRBD 配置 nfs 创建原始资源:

    crm(live)configure# primitive drbd-nfs ocf:linbit:drbd \
      params drbd_resource="nfs" \
      op monitor interval=15 role=Promoted \
      op monitor interval=30 role=Unpromoted
  3. drbd-nfs 原始资源创建一个可升级克隆资源:

    crm(live)configure# clone cl-drbd-nfs drbd-nfs \
      meta promotable="true" promoted-max="1" promoted-node-max="1" \
      clone-max="2" clone-node-max="1" notify="true" interleave=true
  4. 提交此配置:

    crm(live)configure# commit

Pacemaker 将激活两个节点上的 DRBD 资源,并将其升级为其中一个节点上的主要角色。使用 crm status 命令检查群集的状态,或运行 drbdadm status

5.2 创建文件系统资源

创建群集资源来管理要导出的文件系统和用于状态跟踪的文件系统:

过程 7︰ 为 NFS 创建文件系统资源
  1. /dev/drbd0 上创建一个用于跟踪 NFS 客户端状态的原始资源:

    crm(live)configure# primitive fs-nfs-state Filesystem \
      params device=/dev/drbd0 directory=/var/lib/nfs fstype=ext4
  2. /dev/drbd1 上为要导出的文件系统创建一个原始资源:

    crm(live)configure# primitive fs-nfs-share Filesystem \
      params device=/dev/drbd1 directory=/srv/nfs/share fstype=ext4

    仅在添加并置约束和顺序约束之后才提交此配置。

  3. 将这两个资源添加到名为 g-nfs 的资源组:

    crm(live)configure# group g-nfs fs-nfs-state fs-nfs-share

    资源按照它们在组中的添加顺序启动,并按照相反的顺序停止。

  4. 添加共置约束,以确保资源组始终在 DRBD 可升级克隆资源充当主要角色的节点上启动:

    crm(live)configure# colocation col-nfs-on-drbd inf: g-nfs cl-drbd-nfs:Promoted
  5. 添加顺序约束,以确保 DRBD 可升级克隆资源始终在资源组之前启动:

    crm(live)configure# order o-drbd-before-nfs Mandatory: cl-drbd-nfs:promote g-nfs:start
  6. 提交此配置:

    crm(live)configure# commit

Pacemaker 将 /dev/drbd0 挂载到 /var/lib/nfs,将 /dev/drbd1 挂载到 srv/nfs/share。使用 mount 或通过查看 /proc/mounts 来确认是否如此。

5.3 创建 NFS 内核服务器资源

创建一个群集资源来管理 NFS 服务器守护程序:

过程 8︰ 创建 NFS 内核服务器资源
  1. 创建一个原始资源来管理 NFS 服务器守护程序:

    crm(live)configure# primitive nfsserver nfsserver \
      params nfs_server_scope=SUSE

    在群集中运行 NFS 服务器的所有节点上,nfs_server_scope 必须相同,但默认情况下并非采用这种设置。所有使用 SUSE 软件的群集都可以使用相同的范围,因此我们建议将该值设置为 SUSE

    警告
    警告:过短的租用时间可能会导致文件状态丢失

    NFS 客户端定期与 NFS 服务器续订其状态。如果租用时间过短,系统或网络延迟可能会导致计时器在续订完成之前失效,从而导致发生 I/O 错误并丢失文件状态。

    NFSV4LEASETIME 是在 NFS 服务器上的 /etc/sysconfig/nfs 文件中设置的。默认值为 90 秒。如果有必要缩短租用时间,我们建议将值设置为 60 或更大。强烈反对设置小于 30 的值。

  2. 将此资源追加到现有的 g-nfs 资源组:

    crm(live)configure# modgroup g-nfs add nfsserver
  3. 提交此配置:

    crm(live)configure# commit

5.4 创建 NFS 导出资源

创建一个群集资源来管理 NFS 导出:

过程 9︰ 创建 NFS 导出资源
  1. 为 NFS 导出创建原始资源:

    crm(live)configure# primitive exportfs-nfs exportfs \
      params directory="/srv/nfs/share" \
      options="rw,mountpoint" clientspec="192.168.1.0/24" \
      op monitor interval=30s timeout=90s

    op monitor timeout 的值必须大于 stonith-timeout 的值。要查找 stonith-timeout 值,请运行 crm configure show 并查看 property 部分。

    重要
    重要:不要设置 wait_for_leasetime_on_stop=true

    在高度可用的 NFS 设置中将此选项设置为 true 可能会导致不必要的延迟和锁丢失。

    wait_for_leasetime_on_stop 的默认值为 false。如果已按本指南中所述配置了 /var/lib/nfsnfsserver,则无需将其设置为 true

  2. 将此资源追加到现有的 g-nfs 资源组:

    crm(live)configure# modgroup g-nfs add exportfs-nfs
  3. 提交此配置:

    crm(live)configure# commit
  4. 确认 NFS 导出设置正确:

    # exportfs -v
    /srv/nfs/share   IP_ADDRESS_OF_CLIENT(OPTIONS)

5.5 为 NFS 导出创建虚拟 IP 地址

创建一个群集资源来管理 NFS 导出的虚拟 IP 地址:

过程 10︰ 为 NFS 导出创建虚拟 IP 地址
  1. 为虚拟 IP 地址创建原始资源:

    crm(live)configure# primitive vip-nfs IPaddr2 params ip=192.168.1.11
  2. 将此资源追加到现有的 g-nfs 资源组:

    crm(live)configure# modgroup g-nfs add vip-nfs
  3. 提交此配置:

    crm(live)configure# commit
  4. 退出 crm 交互外壳:

    crm(live)configure# quit
  5. 检查集群的状态。g-nfs 组中的资源应按以下顺序显示:

    # crm status
      [...]
      Full List of Resources
        [...]
        * Resource Group: g-nfs:
          * fs-nfs-state    (ocf:heartbeat:Filesystem):   Started alice
          * fs-nfs-share    (ocf:heartbeat:Filesystem):   Started alice
          * nfsserver       (ocf:heartbeat:nfsserver):    Started alice
          * exportfs-nfs    (ocf:heartbeat:exportfs):     Started alice
          * vip-nfs         (ocf:heartbeat:IPaddr2):      Started alice

6 使用 NFS 服务

本章概述如何从 NFS 客户端使用高度可用的 NFS 服务。

要连接到 NFS 服务,请务必使用虚拟 IP 地址来连接群集,而不要使用其中一个群集节点的网络接口上配置的物理 IP。出于兼容性原因,请使用服务器上 NFS 导出的完整路径。

用于挂载 NFS 导出的命令如下:

# mount 192.168.1.11:/srv/nfs/share /home/share

如果您需要配置其他挂载选项,例如特定的传输协议 (proto)、最大读写请求大小(rsizewsize)或特定的 NFS 版本 (vers),请使用 -o 选项。例如:

# mount -o proto=tcp,rsize=32768,wsize=32768,vers=3 \
192.168.1.11:/srv/nfs/share /home/share

要了解更多 NFS 挂载选项,请参见 nfs 手册页。

注意
注意:回写挂载

只有 NFS 版本 3 支持回写挂载,而 NFS 版本 4 则支持。有关详细信息,请参见 https://www.suse.com/support/kb/doc/?id=000018709

7 将更多 NFS 共享添加到群集

如果需要增加可用存储,您可以将更多 NFS 共享添加到群集。

在此示例中,名为 /dev/drbd2 的新 DRBD 设备位于名为 /dev/nfs/share2 的 LVM 逻辑卷上。

过程 11︰ 将更多 NFS 共享添加到群集
  1. 为新共享创建 LVM 逻辑卷:

    # crm cluster run "lvcreate -n share2 -L 20G nfs"
  2. 更新文件 /etc/drbd.d/nfs.res 以在现有卷下添加新卷:

       volume 2 {
          device           /dev/drbd2;
          disk             /dev/nfs/share2;
          meta-disk        internal;
       }
  3. 将已更新的文件复制到其他节点:

    # csync2 -xv
  4. 初始化新卷的元数据存储:

    # crm cluster run "drbdadm create-md nfs/2 --force"
  5. 更新 nfs 配置以创建新设备:

    # crm cluster run "drbdadm adjust nfs"
  6. 跳过新设备的初始同步:

    # drbdadm new-current-uuid --clear-bitmap nfs/2
  7. NFS 群集资源自创建后可能已转移到其他节点。使用 drbdadm status nfs 检查 DRBD 状态,并记下哪个节点充当 Primary 角色。

  8. 在充当 Primary 角色的节点上的 /dev/drbd2 中创建 ext4 文件系统:

    # mkfs.ext4 /dev/drbd2
  9. 启动 crm 交互外壳:

    # crm configure
  10. /dev/drbd2 上为要导出的文件系统创建一个原始资源:

    crm(live)configure# primitive fs-nfs-share2 Filesystem \
      params device="/dev/drbd2" directory="/srv/nfs/share2" fstype=ext4
  11. 将新文件系统资源添加到 g-nfs 组中的 nfsserver 资源之前

    crm(live)configure# modgroup g-nfs add fs-nfs-share2 before nfsserver
  12. 为新共享中的 NFS 导出创建原始资源:

    crm(live)configure# primitive exportfs-nfs2 exportfs \
      params directory="/srv/nfs/share2" \
      options="rw,mountpoint" clientspec="192.168.1.0/24" \
      op monitor interval=30s timeout=90s
  13. 将新的 NFS 导出资源添加到 g-nfs 组中的 vip-nfs 资源之前

    crm(live)configure# modgroup g-nfs add exportfs-nfs2 before vip-nfs
  14. 提交此配置:

    crm(live)configure# commit
  15. 退出 crm 交互外壳:

    crm(live)configure# quit
  16. 检查集群的状态。g-nfs 组中的资源应按以下顺序显示:

    # crm status
    [...]
    Full List of Resources
      [...]
      * Resource Group: g-nfs:
        * fs-nfs-state    (ocf:heartbeat:Filesystem):   Started alice
        * fs-nfs-share    (ocf:heartbeat:Filesystem):   Started alice
        * fs-nfs-share2   (ocf:heartbeat:Filesystem):   Started alice
        * nfsserver       (ocf:heartbeat:nfsserver):    Started alice
        * exportfs-nfs    (ocf:heartbeat:exportfs):     Started alice
        * exportfs-nfs2   (ocf:heartbeat:exportfs):     Started alice
        * vip-nfs         (ocf:heartbeat:IPaddr2):      Started alice
  17. 确认 NFS 导出设置正确:

    # exportfs -v
    /srv/nfs/share   IP_ADDRESS_OF_CLIENT(OPTIONS)
    /srv/nfs/share2  IP_ADDRESS_OF_CLIENT(OPTIONS)

8 更多信息