使用 DRBD 和 Pacemaker 的高度可用 NFS 存储服务 #
此文档介绍了如何使用以下组件在双节点群集中设置高度可用的 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.10
和192.168.1.11
),这样无论服务在哪个物理节点上运行,客户端都可连接到服务。一个 IP 地址用于使用 Hawk2 进行群集管理,另一个 IP 地址专用于 NFS 导出。SBD 用作 STONITH 屏蔽设备,以避免分裂情况。STONITH 对于 HA 群集而言是必需的。
当活动的主机发生故障(主动/被动设置)时,资源从一个节点故障转移至另一个节点。
每个节点上的本地存储。使用 LVM 上的 DRBD 在节点之间同步数据。
通过 NFS 导出的文件系统,以及一个用于跟踪 NFS 客户端状态的单独文件系统。
安装并设置好基本的双节点群集后,再使用 NFS 的存储和群集资源对其进行扩展,即可获得一个高度可用的 NFS 存储服务器。
2 准备双节点群集 #
在设置高度可用的 NFS 存储之前,您必须先准备好一个高可用性群集:
按《安装和设置快速入门》中所述安装并设置一个基本的双节点群集。
在两个节点上安装软件包 nfs-kernel-server:
#
zypper install nfs-kernel-server
3 创建 LVM 设备 #
使用 LVM(逻辑卷管理器)可在多个文件系统上灵活分配存储空间。
使用 crm cluster run
同时在两个节点上运行这些命令。
创建 LVM 物理卷,并将
/dev/disk/by-id/DEVICE_ID
替换为 LVM 的相应设备:#
crm cluster run "pvcreate /dev/disk/by-id/DEVICE_ID"
创建包含此物理卷的 LVM 卷组
nfs
:#
crm cluster run "vgcreate nfs /dev/disk/by-id/DEVICE_ID"
在卷组
nfs
中创建一个名为share
的逻辑卷:#
crm cluster run "lvcreate -n share -L 20G nfs"
此卷用于 NFS 导出。
在卷组
nfs
中创建一个名为state
的逻辑卷:#
crm cluster run "lvcreate -n state -L 8G nfs"
此卷用于跟踪 NFS 客户端状态。本示例中使用的 8 GB 卷大小应支持数千个并发 NFS 客户端。
激活卷组:
#
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
。
创建包含以下内容的
/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; } }
要创建的每个 DRBD 设备的卷号。
应用程序要访问的 DRBD 设备。
DRBD 用于存储实际数据的较低级别块设备。这是在第 3 节 “创建 LVM 设备”中创建的 LVM 设备。
元数据的存储位置。如果使用
internal
,元数据将与用户数据一起存储在同一设备上。有关更多信息,请参见手册页。此连接使用的协议。协议
C
提供更好的数据可用性,只有在写入内容进入所有本地和远程磁盘之后,该协议才将写入操作视为已完成。指定屏蔽策略。对于配置了 STONITH 设备的群集,请使用
resource-and-stonith
。启用资源级别屏蔽。如果 DRBD 复制链路的连接中断,Pacemaker 会尝试将 DRBD 资源升级到另一个节点。有关详细信息,请参见第 23.6 节 “搭配使用资源级屏蔽与 STONITH”。
定义网格的所有节点。
hosts
参数包含共享相同 DRBD 设置的所有主机名。包含每个节点的 IP 地址和唯一标识符。
打开
/etc/csync2/csync2.cfg
并检查其中是否包含以下两行:include /etc/drbd.conf; include /etc/drbd.d;
如果不存在,请将这两行添加到文件中。
将文件复制到其他节点上:
#
csync2 -xv
有关 Csync2 的信息,请参见第 4.7 节 “将配置传输到所有节点”。
4.2 激活 DRBD 设备 #
准备好 DRBD 配置后,激活设备:
如果您在群集中使用防火墙,请在防火墙配置中打开端口
7790
。初始化元数据存储:
#
crm cluster run "drbdadm create-md nfs"
创建 DRBD 设备:
#
crm cluster run "drbdadm up nfs"
设备中尚不包含数据,因此您可以运行以下命令来跳过初始同步:
#
drbdadm new-current-uuid --clear-bitmap nfs/0
#
drbdadm new-current-uuid --clear-bitmap nfs/1
将
alice
设为主节点:#
drbdadm primary --force nfs
检查
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 设备后,在其上创建文件系统:
在
/dev/drbd0
上创建ext4
文件系统:#
mkfs.ext4 /dev/drbd0
在
/dev/drbd1
上创建ext4
文件系统:#
mkfs.ext4 /dev/drbd1
5 创建群集资源 #
以下过程说明如何配置高度可用的 NFS 群集所需的资源。
- DRBD 原始资源和可升级克隆资源
这些资源用于复制数据。群集资源管理器认为有必要时,会将可升级克隆资源在主次角色之间切换。
- 文件系统资源
这些资源将管理要导出的文件系统,以及要跟踪 NFS 客户端状态的文件系统。
- NFS 内核服务器资源
此资源管理 NFS 服务器守护程序。
- NFS 导出
此资源用于将目录
/srv/nfs/share
导出到客户端。- 虚拟 IP 地址
初始安装会创建用于 Hawk2 的管理虚拟 IP 地址。创建另一个专用于 NFS 导出的虚拟 IP 地址。这样,以后便可更轻松地应用安全限制。
下列配置示例假设
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 设备,并创建一个可升级克隆资源,使此群集资源可在两个节点上运行:
启动
crm
交互外壳:#
crm configure
为 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
为
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
提交此配置:
crm(live)configure#
commit
Pacemaker 将激活两个节点上的 DRBD 资源,并将其升级为其中一个节点上的主要角色。使用 crm status
命令检查群集的状态,或运行 drbdadm status
。
5.2 创建文件系统资源 #
创建群集资源来管理要导出的文件系统和用于状态跟踪的文件系统:
在
/dev/drbd0
上创建一个用于跟踪 NFS 客户端状态的原始资源:crm(live)configure#
primitive fs-nfs-state Filesystem \ params device=/dev/drbd0 directory=/var/lib/nfs fstype=ext4
在
/dev/drbd1
上为要导出的文件系统创建一个原始资源:crm(live)configure#
primitive fs-nfs-share Filesystem \ params device=/dev/drbd1 directory=/srv/nfs/share fstype=ext4
请仅在添加并置约束和顺序约束之后才提交此配置。
将这两个资源添加到名为
g-nfs
的资源组:crm(live)configure#
group g-nfs fs-nfs-state fs-nfs-share
资源按照它们在组中的添加顺序启动,并按照相反的顺序停止。
添加共置约束,以确保资源组始终在 DRBD 可升级克隆资源充当主要角色的节点上启动:
crm(live)configure#
colocation col-nfs-on-drbd inf: g-nfs cl-drbd-nfs:Promoted
添加顺序约束,以确保 DRBD 可升级克隆资源始终在资源组之前启动:
crm(live)configure#
order o-drbd-before-nfs Mandatory: cl-drbd-nfs:promote g-nfs:start
提交此配置:
crm(live)configure#
commit
Pacemaker 将 /dev/drbd0
挂载到 /var/lib/nfs
,将 /dev/drbd1
挂载到 srv/nfs/share
。使用 mount
或通过查看 /proc/mounts
来确认是否如此。
5.3 创建 NFS 内核服务器资源 #
创建一个群集资源来管理 NFS 服务器守护程序:
创建一个原始资源来管理 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 的值。将此资源追加到现有的
g-nfs
资源组:crm(live)configure#
modgroup g-nfs add nfsserver
提交此配置:
crm(live)configure#
commit
5.4 创建 NFS 导出资源 #
创建一个群集资源来管理 NFS 导出:
为 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/nfs
和nfsserver
,则无需将其设置为true
。将此资源追加到现有的
g-nfs
资源组:crm(live)configure#
modgroup g-nfs add exportfs-nfs
提交此配置:
crm(live)configure#
commit
确认 NFS 导出设置正确:
#
exportfs -v
/srv/nfs/share IP_ADDRESS_OF_CLIENT(OPTIONS)
5.5 为 NFS 导出创建虚拟 IP 地址 #
创建一个群集资源来管理 NFS 导出的虚拟 IP 地址:
为虚拟 IP 地址创建原始资源:
crm(live)configure#
primitive vip-nfs IPaddr2 params ip=192.168.1.11
将此资源追加到现有的
g-nfs
资源组:crm(live)configure#
modgroup g-nfs add vip-nfs
提交此配置:
crm(live)configure#
commit
退出
crm
交互外壳:crm(live)configure#
quit
检查集群的状态。
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
)、最大读写请求大小(rsize
和 wsize
)或特定的 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 逻辑卷上。
8 更多信息 #
有关本指南中所述步骤的更多细节,请参见 https://www.suse.com/support/kb/doc/?id=000020396。
有关 NFS 和 LVM 的详细信息,请参见 《SUSE Linux Enterprise Server 存储管理指南》。
有关 DRBD 的详细信息,请参见第 23 章 “DRBD”。
有关群集资源的详细信息,请参见第 6 章 “配置群集资源”。