跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise High Availability Extension 文档 / 管理指南 / 配置和管理 / 储存保护和 SBD
适用范围 SUSE Linux Enterprise High Availability Extension 15 SP2

11 储存保护和 SBD

SBD(STONITH 块设备)通过经由共享块储存(SAN、iSCSI、FCoE 等)交换讯息来为基于 Pacemaker 的群集提供节点屏蔽机制。此方法可以将屏蔽机制隔离开来,使其不受固件版本更改的影响或不依赖于特定固件控制器。SBD 需要在每个节点上安装一个检查包,以确保能确实停止行为异常的节点。在某些情况下,还可以通过无磁盘模式运行 SBD,以便使用不含共享储存的 SBD。

ha-cluster-bootstrap 脚本提供了一种自动设置群集的方式,并可选择使用 SBD 作为屏蔽机制。有关详细信息,请参见安装和设置快速入门。但是,手动设置 SBD 可为您提供个别设置的更多选项。

本章介绍 SBD 背后的概念。它将指导您完成 SBD 所需的组件配置,以保护您的群集防止在发生节点分裂情况下出现可能的数据损坏。

除了节点级别屏蔽,您还可以使用额外的储存保护机制,例如 LVM2 排它激活或 OCFS2 文件锁定支持(资源级别屏蔽)。它们可以保护您的系统,以防出现管理或应用程序故障。

11.1 概念概述

SBD 是 Storage-Based Death(基于储存区的终止)或 STONITH Block Device(STONITH 块设备)的缩写。

高可用性群集堆栈的最高优先级是保护数据完整性。此项保护通过防止对数据储存进行未协调的并行访问来实现。群集堆栈会使用几种控制机制来实现此目标。

但是,如果在群集中选出数个 DC,则可能导致网络分区或软件故障。如果允许出现这种所谓的“节点分裂”情况,则可能会发生数据损坏。

避免出现这种情况可采用的主要机制是通过 STONITH 实现节点屏蔽。如果使用 SBD 作为节点屏蔽机制可在节点分裂情况下关闭节点而无需使用外部关闭设备。

SBD 组件和机制
SBD 分区

在所有节点都可访问共享储存的环境中,设备的某个小分区会格式化,以用于 SBD。该分区的大小取决于所用磁盘的块大小(例如,对于块大小为 512 字节的标准 SCSI 磁盘,该分区大小为 1 MB;块大小为 4 KB 的 DASD 磁盘需要 4 MB 大小的分区)。初始化过程会在设备上创建讯息布局,配置最多 255 个节点的讯息槽。

SBD 守护程序

配置完相应的 SBD 守护程序后,在每个节点上使其联机,然后启动其余群集堆栈。它在所有其他群集组件都关闭之后才终止,从而确保了群集资源绝不会在没有 SBD 监督的情况下被激活。

讯息

此守护程序会自动将分区上的消息槽之一分配给其自身,并持续监视其中有无发送给它自己的消息。收到消息后,守护程序会立即执行请求,如启动关闭电源或重引导循环以进行屏蔽。

另外,此守护程序会持续监视与储存设备的连接性,当无法连接分区时会自行终止。这就保证了它不会从屏蔽消息断开连接。如果群集数据驻留在不同分区中的同一个逻辑单元,则一旦与储存失去连接,工作负载便将终止,因此不会增加额外的故障点。

检查包

只要使用 SBD,就必须确保检查包正常工作。新式系统支持硬件检查包,此功能需由软件组件来激发馈送数据。软件组件(在此案例中为 SBD 守护程序)通过将服务脉冲定期写入检查包来供给检查包。如果守护程序停止供给检查包,硬件将强制系统重启动。这可防止出现 SBD 进程本身的故障,如失去响应或由于 I/O 错误而卡住。

如果 Pacemaker 集成已激活,则当设备大多数节点丢失时,SBD 将不会进行自我屏蔽。例如,假设您的群集包含三个节点:A、B 和 C。由于网络分隔,A 只能看到它自己,而 B 和 C 仍可相互通讯。在此案例中,有两个群集分区,一个因节点占多数(B 和 C)而具有法定票数,而另一个则不具有 (A)。如果在大多数屏蔽设备无法访问时发生此情况,则节点 A 会立即自我关闭,而节点 B 和 C 将会继续运行。

11.2 手动设置 SBD 概述

手动设置基于储存的保护时必须执行以下步骤:必须以 root 身份执行这些步骤。在开始执行之前,请查看第 11.3 节 “要求”

  1. 设置检查包

  2. 根据您的情况,可将 SBD 与一到三个设备搭配使用,或以无磁盘模式使用。有关概述,请参见第 11.4 节 “SBD 设备的数量”。有关详细的设置,请参见:

  3. 测试 SBD 和屏蔽

11.3 要求

  • 最多可将三个 SBD 设备用于基于储存的屏蔽。使用一到三个设备时,必须可从所有节点访问共享储存。

  • 群集中的所有节点上,共享存储设备的路径都必须永久且一致。使用稳定的设备名称,如 /dev/disk/by-id/dm-uuid-part1-mpath-abcedf12345

  • 可通过光纤通道 (FC)、以太网光纤通道 (FCoE) 甚至 iSCSI 来连接共享储存。

  • 共享储存段不得使用基于主机的 RAID、LVM2 或 DRBD*。DRBD 可能已分割,这会导致 SBD 发生问题,因为 SBD 中不能存在两种状态。不能将群集多设备(群集 MD)用于 SBD。

  • 但是,建议使用基于储存区的 RAID 和多路径,以提高可靠性。

  • 可以在不同群集之间共享某个 SBD 设备,只要共享该设备的节点数不超过 255 个。

  • 对于具有两个以上节点的群集,还可以在无磁盘模式下使用 SBD。

11.4 SBD 设备的数量

SBD 支持最多使用三个设备:

一个设备

最简单的实施。适用于所有数据位于同一个共享储存的群集。

两个设备

此配置主要用于使用基于主机的镜像但未提供第三个存储设备的环境。SBD 在丢失对某个镜像分支的访问权后将自我终止,以允许群集继续运行。但是,由于 SBD 不具备足够的知识可以检测到存储区的不对称分裂,因此在只有一个镜像分支可用时它不会屏蔽另一个分支。如此一来,就无法在存储阵列中的一个关闭时对第二个故障自动容错。

三个设备

最可靠的配置。它具有从一个设备中断(可能是因为故障或维护)的情况中恢复的能力。只有当一个以上设备丢失及必要时,SBD 才会自行终止,具体取决于群集分区或节点的状态。如果至少有两个设备仍然可访问,便能成功传输屏蔽讯息。

此配置适用于存储未限制为单个阵列的更为复杂的环境。基于主机的镜像解决方案可以每个镜像分支拥有一个 SBD(不自我镜像),并在 iSCSI 上有一个额外的决定项。

无磁盘

如果您想要建立一个不含共享储存的屏蔽机制,则此配置十分有用。在此无磁盘模式下,SBD 会使用硬件检查包来屏蔽节点,而不依赖于任何共享设备。不过,无磁盘 SBD 不能处理双节点群集的节点分裂情况。此选项仅适用于具有两个以上节点的群集。

11.5 超时计算

使用 SBD 作为屏蔽机制时,必须考虑所有组件的超时,因为它们之间相互依赖。

检查包超时

此超时在初始化 SBD 设备期间设置。它主要取决于储存延迟。必须可在此时间内成功读取大多数设备。否则,节点可能会自我屏蔽。

注意
注意:多路径或 iSCSI 设置

如果 SBD 设备驻留在多路径设置或 iSCSI 上,则应将超时设置为检测到路径故障并切换到下一个路径所需的时间。

这还意味着在 /etc/multipath.conf 中,max_polling_interval 的值必须小于 watchdog 超时。

msgwait 超时

此超时在初始化 SBD 设备期间设置。它定义了将讯息写入到 SBD 设备上的某个节点槽后经过多长时间视为已传递。该超时应设置的足够长,让节点有时间检测到它是否需要自我屏蔽。

但是,如果 msgwait 超时相对较长,已屏蔽的群集节点可能会在屏蔽操作返回之前便又重新加入。此情况可通过在 SBD 配置中设置 SBD_DELAY_START 参数来缓解,请参见步骤 4 中的过程 11.4

CIB 中的 stonith-timeout

此超时在 CIB 中作为全局群集属性设置。它定义了等待 STONITH 操作(重引导、打开、关闭)完成的时间。

CIB 中的 stonith-watchdog-timeout

此超时在 CIB 中作为全局群集属性设置。如果未显式设置,则默认值为 0,此值适用于 SBD 与一到三个设备搭配使用的情况。若要以无磁盘模式使用 SBD,请参见过程 11.8 “配置无磁盘 SBD”以获取详细信息。

如果您更改检查包超时,则需要同时调整另外两个超时。以下公式表达了这三个值之间的关系:

例 11.1︰ 超时计算公式
Timeout (msgwait) >= (Timeout (watchdog) * 2)
stonith-timeout = Timeout (msgwait) + 20%

例如,如果您将检查包超时设置为 120,则请将 msgwait 超时设置为 240,并将 stonith-timeout 设置为 288

如果您使用 ha-cluster-bootstrap 脚本设置群集并初始化 SBD 设备,则会自动考虑这些超时之间的关系。

11.6 设置检查包

SUSE Linux Enterprise High Availability Extension 随附了几个内核模块用于提供硬件特定的检查包驱动程序。有关最常用检查包驱动程序列表,请参见常用检查包驱动程序

对于生产环境中的群集,建议使用硬件特定的检查包驱动程序。不过,如果没有与您的硬件匹配的检查包,则可以将 softdog 用作内核检查包模块。

High Availability Extension 使用 SBD 守护程序作为供给检查包的软件组件。

11.6.1 使用硬件检查包

查找给定系统的正确检查包内核模块并非没有意义。自动探测常常会失败。因此,在装载正确的模块之前,许多模块就已装载。

表 11.1 列出了最常用的检查包驱动程序。如果您的硬件未列在其中,也可从目录 /lib/modules/KERNEL_VERSION/kernel/drivers/watchdog 提供的列表中选择。或者,咨询您的硬件或系统供应商,获取有关特定于系统的检查包配置的细节。

表 11.1︰ 常用检查包驱动程序
硬件驱动程序
HPhpwdt
Dell、Lenovo (Intel TCO)iTCO_wdt
Fujitsuipmi_watchdog
IBM 大型机上的 VM 或 z/VMvmwatchdog
Xen VM (DomU)xen_xdt
通用softdog
重要
重要:访问检查包计时器

有些硬件供应商交付的系统管理软件(例如 HP ASR 守护程序)会使用检查包来进行系统重设置。如果 SBD 使用了检查包,请禁用此类软件。不能有其他任何软件在访问检查包计时器。

过程 11.1︰ 装载正确的内核模块

要确保装载正确的检查包模块,请执行如下操作:

  1. 列出已随内核版本安装的驱动程序:

    root # rpm -ql kernel-VERSION | grep watchdog
  2. 列出内核中当前装载的任何检查包模块:

    root # lsmod | egrep "(wd|dog)"
  3. 如果返回了结果,请卸载错误的模块:

    root # rmmod WRONG_MODULE
  4. 启用与您的硬件匹配的检查包模块:

    root # echo WATCHDOG_MODULE > /etc/modules-load.d/watchdog.conf
    root # systemctl restart systemd-modules-load
  5. 测试是否已正确装载检查包模块:

    root # lsmod | grep dog

11.6.2 使用软件检查包 (softdog)

对于生产环境中的群集,建议使用硬件特定的检查包驱动程序。不过,如果没有与您的硬件匹配的检查包,则可以将 softdog 用作内核检查包模块。

重要
重要:Softdog 限制

Softdog 驱动程序假设至少有一个 CPU 仍然在运行。如果所有 CPU 均已阻塞,则 softdog 驱动程序中应该重引导系统的代码永远都不会执行。相反地,即使所有 CPU 均已阻塞,硬件检查包也仍然会继续工作。

过程 11.2︰ 装载 Softdog 内核模块
  1. 启用 softdog 驱动程序:

    root # echo softdog > /etc/modules-load.d/watchdog.conf
  2. /etc/modules-load.d/watchdog.conf 中添加 softdog 模块并重启动服务:

    root # echo softdog > /etc/modules-load.d/watchdog.conf
    root # systemctl restart systemd-modules-load
  3. 测试是否已正确装载 softdog 检查包模块:

    root # lsmod | grep softdog

11.7 设置 SBD 与设备

进行该设置必须执行以下步骤:

在开始之前,请确保要用于 SBD 的一个或多个块设备满足在第 11.3 节中指定的要求。

设置 SBD 设备时,您需要考虑几个超时值。有关细节,请参见第 11.5 节 “超时计算”

如果节点上运行的 SBD 守护程序未足够快速地更新检查包计时器,则节点会自行终止。设置超时后,请在您的特定环境中予以测试。

过程 11.3︰ 初始化 SBD 设备

要将 SBD 与共享储存搭配使用,必须先在一到三个块设备上创建讯息布局。sbd create 命令会将元数据头写入指定的一个或多个设备。它还将初始化最多 255 个节点的讯息槽。如果该命令不带任何其他选项,则执行时将使用默认的超时设置。

警告
警告:覆盖现有数据

确保要用于 SBD 的一个或多个设备未保存任何重要数据。执行 sbd create 命令时,会直接重写指定块设备的大约第一个 MB,而不会进一步发出请求或进行备份。

  1. 决定要将哪个块设备或哪些块设备用于 SBD。

  2. 使用以下命令初始化 SBD 设备:

    root # sbd -d /dev/SBD create

    (请将 /dev/SBD 替换为实际路径名称,例如:/dev/disk/by-id/scsi-ST2000DM001-0123456_Wabcdefg。)

    要将多个设备用于 SBD,请多次指定 -d 选项,例如:

    root # sbd -d /dev/SBD1 -d /dev/SBD2 -d /dev/SBD3 create
  3. 如果您的 SBD 设备驻留在多路径组上,请使用 -1-4 选项来调整要用于 SBD 的超时。有关详细信息,请参见第 11.5 节 “超时计算”。所有超时均以秒为单位指定:

    root # sbd -d /dev/SBD -4 1801 -1 902 create

    1

    -4 选项用于指定 msgwait 超时。在以上示例中,超时设置为 180 秒。

    2

    -1 选项用于指定 watchdog 超时。在以上示例中,超时设置为 90 秒。模拟检查包的最小允许值为 15 秒。

  4. 检查已写入设备的内容:

    root # sbd -d /dev/SBD dump
    Header version     : 2.1
    UUID               : 619127f4-0e06-434c-84a0-ea82036e144c
    Number of slots    : 255
    Sector size        : 512
    Timeout (watchdog) : 5
    Timeout (allocate) : 2
    Timeout (loop)     : 1
    Timeout (msgwait)  : 10
    ==Header on disk /dev/SBD is dumped

    正如您看到的,超时数也储存在报头中,以确保所有参与的节点在这方面都一致。

初始化 SBD 设备之后,编辑 SBD 配置文件,然后启用并启动相应的服务以让更改生效。

过程 11.4︰ 编辑 SBD 配置文件
  1. 打开文件 /etc/sysconfig/sbd

  2. 搜索以下参数: SBD_DEVICE

    该参数指定要监视和要用于交换 SBD 讯息的设备。

  3. 编辑此行,并用您的 SBD 设备替换 SBD

    SBD_DEVICE="/dev/SBD"

    如果您需要在第一行中指定多个设备,请使用分号分隔设备(设备顺序无关紧要):

    SBD_DEVICE="/dev/SBD1; /dev/SBD2; /dev/SBD3"

    如果无法访问 SBD 设备,守护程序将无法启动群集,并会禁止群集启动。

  4. 搜索以下参数: SBD_DELAY_START

    启用或禁用延迟。设置 SBD_DELAY_STARTyes(如果 msgwait 相对较长,而群集节点引导很快)。将此参数设置为 yes 可在引导时延迟 SBD 启动。虚拟机有时候需要此项延迟。

将您的 SBD 设备添加到 SBD 配置文件之后,启用 SBD 守护程序。SBD 守护程序是群集堆栈的关键部分。当群集堆栈正在运行时,需要运行该守护程序。因此,每当启动 pacemaker 服务时,作为依赖项,也要启动 sbd 服务。

过程 11.5︰ 启用和启动 SBD 服务
  1. 在每个节点,启用 SBD 服务:

    root # systemctl enable sbd

    每当启动 Pacemaker 服务时,SBD 服务将与 Corosync 服务一起启动。

  2. 在每个节点上重启动群集堆栈:

    root # crm cluster restart

    此操作会自动触发 SBD 守护程序的启动。

下一步是测试 SBD 设备,请参见过程 11.6

过程 11.6︰ 测试 SBD 设备
  1. 以下命令会将节点槽及其当前消息从 SBD 设备进行转储:

    root # sbd -d /dev/SBD list

    现在,您应该会看到曾随 SBD 启动的所有群集节点都列在此处。例如,如果您拥有双节点群集,讯息槽对于两个节点都应显示 clear

    0       alice        clear
    1       bob          clear
  2. 尝试将测试消息发送到节点之一:

    root # sbd -d /dev/SBD message alice test
  3. 此节点将在系统日志文件中确认收到了该讯息:

    May 03 16:08:31 alice sbd[66139]: /dev/SBD: notice: servant: Received command test from bob on disk /dev/SBD

    这就确认了 SBD 确实在节点上正常运行,并已准备好接收消息。

在最后一步中,您需要调整群集配置,请参见过程 11.7

过程 11.7︰ 将群集配置为使用 SBD

要配置在群集中使用 SBD,您需要在群集配置中执行以下操作:

  • stonith-timeout 参数设置为与您的设置相匹配的值。

  • 配置 SBD STONITH 资源。

有关 stonith-timeout 的计算,请参见第 11.5 节 “超时计算”

  1. 启动壳层,并以 root 用户身份或同等身份登录。

  2. 运行 crm configure

  3. 输入以下内容:

    crm(live)configure# property stonith-enabled="true" 1
    crm(live)configure# property stonith-watchdog-timeout=0 2
    crm(live)configure# property stonith-timeout="40s" 3

    1

    此为默认配置,因为不支持没有 STONITH 的群集。而如果出于测试目的停用了 STONITH,请确保再次将此参数设置为 true

    2

    如果未显式设置,此值默认为 0,适用于 SBD 与一到三个设备搭配使用的情况。

    3

    如果将 SBD 的 msgwait 超时值设置为 30 秒,则适合将 stonith-timeout 值设置为 40

  4. 对于双节点群集,请确定您希望延迟是可预测的还是随机的。对于其他类型的群集,则不需要设置此参数。

    可预测的静态延迟

    此参数会在执行 STONITH 操作之前启用静态延迟。它可以确保在使用不同的屏蔽资源和不同的延迟值时,节点不会互相屏蔽。在发生屏蔽资源争用时,目标节点将会松脱。使用该参数可将特定的节点标记为在双节点群集出现节点分裂情况时能够幸存。要达到此目的,为每个节点创建两个原始 STONITH 设备至关重要。在以下配置中,如果出现节点分裂情况,alice 将会获胜并得以幸存:

    crm(live)configure# primitive st-sbd-alice stonith:external/sbd params \
           pcmk_host_list=alice pcmk_delay_base=20
    crm(live)configure# primitive st-sbd-bob stonith:external/sbd params \
           pcmk_host_list=bob pcmk_delay_base=0
    动态随机延迟

    此参数防止在使用慢速设备(例如 SBD)时出现双重屏蔽。它会为屏蔽设备上的 STONITH 操作添加随机延迟。这对于双节点群集尤其重要,否则若发生节点分裂的情况,两个节点可能都会尝试相互屏蔽。

    crm(live)configure# primitive stonith_sbd stonith:external/sbd
      params pcmk_delay_max=30
  5. 使用 show 复查更改。

  6. 使用 commit 提交更改,并使用 exit 退出 crm 当前配置。

启动资源之后,群集即会成功配置为使用 SBD。如果需要屏蔽某个节点,将会使用此方法。

11.8 设置无磁盘 SBD

SBD 可在无磁盘模式下操作。在此模式下,发生以下情况时,将使用检查包设备来重置节点:如果失去法定票数、如果任何受监视的守护程序丢失且未恢复,或者如果 Pacemaker 决定节点需要屏蔽。无磁盘 SBD 基于节点的自我屏蔽,具体取决于群集的状态、法定票数和一些合理的假设。CIB 中不需要 STONITH SBD 原始资源。

重要
重要:群集节点数

不要将无磁盘 SBD 用作双节点群集的屏蔽机制。请仅在三节点或更多节点的群集中使用。无磁盘模式下的 SBD 无法处理双节点群集的节点分裂情况。

过程 11.8︰ 配置无磁盘 SBD
  1. 打开文件 /etc/sysconfig/sbd 并使用以下项:

    SBD_PACEMAKER=yes
    SBD_STARTMODE=always
    SBD_DELAY_START=no
    SBD_WATCHDOG_DEV=/dev/watchdog
    SBD_WATCHDOG_TIMEOUT=5

    SBD_DEVICE 项不需要,因为未使用共享磁盘。此参数缺失时,sbd 服务不会为 SBD 设备启动任何观察程序进程。

  2. 在每个节点,启用 SBD 服务:

    root # systemctl enable sbd

    每当启动 Pacemaker 服务时,SBD 服务将与 Corosync 服务一起启动。

  3. 在每个节点上重启动群集堆栈:

    root # crm cluster restart

    此操作会自动触发 SBD 守护程序的启动。

  4. 检查参数 have-watchdog=true 是否已自动设置:

    root # crm configure show | grep have-watchdog
             have-watchdog=true
  5. 运行 crm configure 并在 crm 外壳上设置以下群集属性:

    crm(live)configure# property stonith-enabled="true" 1
    crm(live)configure# property stonith-watchdog-timeout=10 2

    1

    此为默认配置,因为不支持没有 STONITH 的群集。而如果出于测试目的停用了 STONITH,请确保再次将此参数设置为 true

    2

    对于无磁盘 SBD,此参数不能为零。它定义了经过多长时间之后可以假定屏蔽目标已自我屏蔽。因此,其值必须大于等于 SBD_WATCHDOG_TIMEOUT/etc/sysconfig/sbd 中)的值。从 SUSE Linux Enterprise High Availability Extension 15 开始,如果您将 stonith-watchdog-timeout 设置为负值,Pacemaker 将自动计算此超时并将它设置为 SBD_WATCHDOG_TIMEOUT 值的两倍。

  6. 使用 show 复查更改。

  7. 使用 commit 提交更改,并使用 exit 退出 crm 当前配置。

11.9 测试 SBD 和屏蔽

要测试 SBD 在节点屏蔽方面是否按预期工作,请使用以下其中一种或所有方法:

手动触发节点屏蔽

要针对节点 NODENAME 触发屏蔽操作,请执行以下操作:

root # crm node fence NODENAME

检查经过以下时间之后,节点是否已屏蔽,以及其他节点是否将该节点视为已屏蔽: stonith-watchdog-timeout

模拟 SBD 失败
  1. 识别 SBD inquisitor 的进程 ID:

    root # systemctl status sbd
    ● sbd.service - Shared-storage based fencing daemon
    
       Loaded: loaded (/usr/lib/systemd/system/sbd.service; enabled; vendor preset: disabled)
       Active: active (running) since Tue 2018-04-17 15:24:51 CEST; 6 days ago
         Docs: man:sbd(8)
      Process: 1844 ExecStart=/usr/sbin/sbd $SBD_OPTS -p /var/run/sbd.pid watch (code=exited, status=0/SUCCESS)
     Main PID: 1859 (sbd)
        Tasks: 4 (limit: 4915)
       CGroup: /system.slice/sbd.service
               ├─1859 sbd: inquisitor
    [...]
  2. 通过终止 SBD inquisitor 进程模拟 SBD 失败。在我们的示例中,SBD inquisitor 的进程 ID 是 1859

    root # kill -9 1859

    节点主动自我屏蔽。经过以下时间之后,其他节点注意到该节点丢失并将它视为已自我屏蔽: stonith-watchdog-timeout

通过监视操作失败触发屏蔽

对于正常配置,资源停止操作失败将触发屏蔽。要手动触发屏蔽,可以产生一个资源停止操作失败。或者,可以临时更改资源监视操作的配置,产生监视失败,如下所示:

  1. 配置资源监视操作的 on-fail=fence 属性:

    op monitor interval=10 on-fail=fence
  2. 让监视操作失败(例如,如果资源与某个服务相关,则可通过终止相应的守护程序来实现)。

    此失败会触发屏蔽操作。

11.10 储存保护的其他机制

除了通过 STONITH 进行节点屏蔽之外,还可使用其他方法在资源级别实现储存保护。例如,SCSI-3 和 SCSI-4 使用永久保留,而 sfex 提供锁定机制。这两种方法将在下面的小节中介绍。

11.10.1 配置 sg_persist 资源

SCSI 规范 3 和 4 定义了永久保留。其属于 SCSI 协议功能,可用于 I/O 屏蔽和故障转移。此功能在 sg_persist Linux 命令中实施。

注意
注意:SCSI 磁盘兼容性

用于 sg_persist 的所有后备磁盘都必须与 SCSI 磁盘兼容。sg_persist 仅适用于 SCSI 磁盘或 iSCSI LUN 等设备。不要将它用于 IDE、SATA 或不支持 SCSI 协议的任何块设备。

继续之前,请检查您的磁盘是否支持永久保留。使用以下命令(用您的设备名称替换 DISK):

root # sg_persist -n --in --read-reservation -d /dev/DISK

结果显示您的磁盘是否支持永久保留:

  • 支持的磁盘:

    PR generation=0x0, there is NO reservation held
  • 不支持的磁盘:

    PR in (Read reservation): command not supported
    Illegal request, Invalid opcode

如果您收到错误讯息(如上面所示),请用 SCSI 兼容的磁盘替换旧磁盘。否则请执行如下操作:

  1. 要创建原始资源 sg_persist,请以 root 身份运行以下命令:

    root # crm configure
    crm(live)configure# primitive sg sg_persist \
        params devs="/dev/sdc" reservation_type=3 \
        op monitor interval=60 timeout=60
  2. sg_persist 原始资源添加到主从组:

    crm(live)configure# ms ms-sg sg \
        meta master-max=1 notify=true
  3. 执行一些测试。当资源处于主/从状态时,您可以在运行主实例的群集节点上的 /dev/sdc1 中进行装入和写入,但无法在运行从实例的群集节点上进行写入。

  4. 为 Ext4 添加文件系统原始资源:

    crm(live)configure# primitive ext4 ocf:heartbeat:Filesystem \
        params device="/dev/sdc1" directory="/mnt/ext4" fstype=ext4
  5. sg_persist 主资源和文件系统资源之间添加以下顺序关系和并置:

    crm(live)configure# order o-ms-sg-before-ext4 Mandatory: ms-sg:promote ext4:start
    crm(live)configure# colocation col-ext4-with-sg-persist Mandatory: ext4 ms-sg:Master
  6. 使用 show 命令检查所有更改。

  7. 提交更改。

有关详细信息,请参见 sg_persist 手册页。

11.10.2 使用 sfex 确保排它激活储存

此部分将介绍另一种低级别机制:sfex,可将对共享储存区的访问以排它的方式锁定于一个节点。请注意,sfex 不会替代 STONITH。由于 sfex 需要共享储存,因此建议将上述 SBD 节点屏蔽机制用于储存的另一个分区。

按照设计,sfex 不能与需要并发的工作负载(例如 OCFS2)配合使用。其可作为传统故障转移型工作负载的一层保护。实际效果与 SCSI-2 保留类似,但更具一般性。

11.10.2.1 概述

在共享储存环境中,储存区的一个小分区专门设置为储存一个或多个锁。

在获取受保护资源之前,节点必须先获取保护锁。此顺序由 Pacemaker 强制实施。sfex 组件可确保即使 Pacemaker 遇到了节点分裂情况,也不会被多次授予锁。

这些锁必须定期刷新,这样某个节点的终止才不会永久性地阻止此锁,其他节点仍可继续操作。

11.10.2.2 设置

以下内容可帮助您了解如何创建用于 sfex 的共享分区以及如何为 CIB 中的 sfex 锁配置资源。单个 sfex 分区可存放任意数量的锁,并需要为每个锁分配 1 KB 的储存空间。默认情况下,sfex_init 将在分区上创建一个锁。

重要
重要:要求
  • sfex 的共享分区应和要保护的数据位于同一逻辑单元上。

  • 共享的 sfex 分区不得使用基于主机的 RAID 或 DRBD。

  • 可以使用 LVM2 逻辑卷。

过程 11.9︰ 创建 sfex 分区
  1. 创建用于 sfex 的共享分区。注意此分区的名称,并用它替代下面的 /dev/sfex

  2. 使用以下命令创建 sfex 元数据:

    root # sfex_init -n 1 /dev/sfex
  3. 校验元数据是否正确创建:

    root # sfex_stat -i 1 /dev/sfex ; echo $?

    此操作应返回 2,因为当前未保存锁。

过程 11.10︰ 为 sfex 锁配置资源
  1. sfex 锁通过 CIB 中的资源表示,其配置如下:

    crm(live)configure# primitive sfex_1 ocf:heartbeat:sfex \
    #	params device="/dev/sfex" index="1" collision_timeout="1" \
          lock_timeout="70" monitor_interval="10" \
    #	op monitor interval="10s" timeout="30s" on-fail="fence"
  2. 要通过 sfex 锁保护资源,请在要保护的资源和 sfex 资源之间创建强制顺序和放置约束。如果要保护的资源 ID 是 filesystem1

    crm(live)configure# order order-sfex-1 Mandatory: sfex_1 filesystem1
    crm(live)configure# colocation col-sfex-1 Mandatory: filesystem1 sfex_1
  3. 如果使用组语法,请将 sfex 资源添加为组内的第一个资源:

    crm(live)configure# group LAMP sfex_1 filesystem1 apache ipaddr

11.11 更多信息