屏蔽在 HA(高可用性)计算机群集中是一个非常重要的概念。群集有时会检测到某个节点行为异常,需要删除此节点。这称为屏蔽,通常使用 STONITH 资源实现。屏蔽可以定义为一种使 HA 群集具有已知状态的方法。
群集中的每个资源均带有状态。例如:“资源 r1 已在 alice 上启动”。在 HA 群集中,这种状态暗示了“资源 r1 在除 alice 外的所有节点上都处于停止状态”,因为群集必须确保每个资源只能在一个节点上启动。每个节点都必须报告资源发生的每个更改。这样群集状态就是资源状态和节点状态的集合。
当节点或资源的状态无法十分肯定地确立时,将进行屏蔽。即使在群集未感知到给定节点上发生的事件时,屏蔽也可确保此节点不会运行任何重要资源。
有两类屏蔽:资源级别屏蔽和节点级别屏蔽。后者是本章的主题。
资源级别屏蔽可确保对给定资源的排它访问。此情况的常见示例就是通过 SAN 光纤通道开关(用于锁定节点不让访问其磁盘)或 SCSI 保留之类的方法更改节点的区域。有关示例,请参见第 11.10 节 “储存保护的其他机制”。
节点级别屏蔽可彻底防止故障节点访问共享资源。这种屏蔽通常采用一种简单但却粗暴的方式来完成,即重设置或关闭节点。
在 Pacemaker 群集中,节点级别屏蔽的实施方式是 STONITH(关闭其他节点)。High Availability Extension 包括 stonith
命令行工具,一个能远程关闭群集中节点的可扩展界面。有关可用选项的概述,请运行 stonith --help
或参见 stonith
的手册页了解更多信息。
要使用节点级屏蔽,首先需要有屏蔽设备。要获取 High Availability Extension 所支持的 STONITH 设备的列表,请在任何节点上运行以下命令之一:
root #
stonith -L
或者
root #
crm ra list stonith
STONITH 设备可分为以下类别:
电源分发单元是管理关键网络、服务器和数据中心设备的电源容量和功能的基本元素。它可以提供对已连接设备的远程负载监视和独立电源出口控制,以实现远程电源循环。
公共用电出现故障时,通过其他来源供电的稳定电源可为连接的设备提供应急电源。
如果是在刀片组上运行群集,则刀片外壳中的电源控制设备就是提供屏蔽的唯一候选。当然,此设备必须能够管理单个刀片计算机。
无人值守设备(IBM RSA、HP iLO 和 Dell DRAC)正变得越来越普遍,在未来它们甚至可能成为现成可用计算机上的标准配置。但是,如果这些设备与其主机(一个群集节点)共享电源,则它们可能无法按需工作。如果节点持续断电,则认为控制该节点的设备失去作用。因此,建议使用备用电池无人值守设备。另一方面,这些设备是通过网络访问的。这意味着可能存在单一故障点或安全隐患。
测试设备仅用于测试目的。它们通常对硬件更加友好。将群集投放到生产环境之前,必须以真实的屏蔽设备进行替换。
对 STONITH 设备的选择主要取决于您的预算和所用硬件的种类。
SUSE® Linux Enterprise High Availability Extension 的 STONITH 实施由两个组件组成:
stonithd 是可由本地进程或通过网络访问的守护程序。它接受与屏蔽操作(重设置、关闭电源和打开电源)对应的命令。它还可以检查屏蔽设备的状态。
stonithd 守护程序在 CRM HA 群集中的每个节点上运行。在 DC 节点上运行的 stonithd 实例从 CRM 接收屏蔽请求。它会对请求作出响应,其他 stonithd 程序将执行所需的屏蔽操作。
对于每个受支持的屏蔽设备,都有一个能够控制所述设备的 STONITH 插件。STONITH 插件是屏障设备的界面。cluster-glue
包中的 STONITH 插件位于每个节点上的 /usr/lib64/stonith/plugins
中(如果您还安装了 fence-agents
包,该包中的插件将安装在 /usr/sbin/fence_*
中)。所有 STONITH 插件看上去都与 stonithd 一样,但显著区别在于反映了屏障设备的性质。
某些插件支持多个设备。ipmilan
(或 external/ipmi
)就是一个典型的示例,它实施 IPMI 协议并可以控制任何支持此协议的设备。
要设置屏蔽,需要配置一个或多个 STONITH 资源 - stonithd 守护程序不需要配置。所有配置都储存在 CIB 中。STONITH 资源属于 stonith
类的资源(请参见第 6.3.2 节 “支持的资源代理类”)。STONITH 资源是 STONITH 插件在 CIB 中的代表。除了屏蔽操作,还可以启动、停止和监视 STONITH 资源,就像任何其他资源一样。启动或停止 STONITH 资源意味着装载或卸载节点上的 STONITH 设备驱动程序。启动和停止仅是管理操作,不会转换成对屏蔽设备自身的任何操作。然而,监视操作却会转换成将其记录到设备(以校验设备能否在需要时正常运行)。STONITH 资源故障转移到另一个节点时,它通过装载相应的驱动程序允许当前节点与 STONITH 设备对话。
STONITH 资源可像任何其他资源一样进行配置。有关如何使用首选群集管理工具执行此操作的细节:
参数(属性)列表取决于相应的 STONITH 类型。要查看特定设备的参数列表,请使用 stonith
命令:
stonith -t stonith-device-type -n
例如,要查看 ibmhmc
设备类型的参数,请输入以下命令:
stonith -t ibmhmc -n
要获取设备的简短帮助文本,请使用 -h
选项:
stonith -t stonith-device-type -h
在以下部分中,可了解一些用 crm
命令行工具的语法编写的示例配置。要应用这些配置,请将示例放进文本文件(例如 sample.txt
)并运行:
root #
crm
< sample.txt
有关使用 crm
命令行工具配置资源的更多信息,请参见第 8 章 “配置和管理群集资源(命令行)”。
可以如下配置 IBM RSA 无人值守设备:
configure primitive st-ibmrsa-1 stonith:external/ibmrsa-telnet \ params nodename=alice ip_address=192.168.0.101 \ username=USERNAME password=PASSW0RD primitive st-ibmrsa-2 stonith:external/ibmrsa-telnet \ params nodename=bob ip_address=192.168.0.102 \ username=USERNAME password=PASSW0RD location l-st-alice st-ibmrsa-1 -inf: alice location l-st-bob st-ibmrsa-2 -inf: bob commit
在此示例中,由于以下原因使用了位置约束:STONITH 操作始终有失败的可能性。因此,在同时兼作执行程序的节点上操作 STONITH 并不可靠。如果重设置节点,则它将无法发送有关屏蔽操作结果的通知。唯一的方法是假设操作会成功并提前发送通知。不过,如果操作失败,可能会出现问题。因此,按惯例 stonithd 会拒绝终止其主机。
UPS 类型屏蔽设置的配置类似于上面的示例。此处不作详细介绍。所有 UPS 设备均使用相同的机制屏蔽。访问设备的方式有所不同。旧的 UPS 设备只有一个串行端口,通常使用特殊的串行电缆以 1200 波特的速率进行连接。许多新的 UPS 设备仍有一个串行端口,但它们一般还使用 USB 或以太网接口。可以使用的连接类型取决于插件支持的连接。
例如,通过使用 stonith -t
stonith 设备类型
-n 命令比较 apcmaster
与 apcsmart 设备:
stonith -t apcmaster -h
返回以下信息:
STONITH Device: apcmaster - APC MasterSwitch (via telnet) NOTE: The APC MasterSwitch accepts only one (telnet) connection/session a time. When one session is active, subsequent attempts to connect to the MasterSwitch will fail. For more information see http://www.apc.com/ List of valid parameter names for apcmaster STONITH device: ipaddr login password
使用
stonith -t apcsmart -h
得到以下输出:
STONITH Device: apcsmart - APC Smart UPS (via serial port - NOT USB!). Works with higher-end APC UPSes, like Back-UPS Pro, Smart-UPS, Matrix-UPS, etc. (Smart-UPS may have to be >= Smart-UPS 700?). See http://www.networkupstools.org/protocols/apcsmart.html for protocol compatibility details. For more information see http://www.apc.com/ List of valid parameter names for apcsmart STONITH device: ttydev hostlist
第一个插件支持带有一个网络端口的 APC UPS 和 telnet 协议。第二个插件使用 APC SMART 协议(通过许多 APC UPS 产品系列都支持的串行线路)。
Kdump 属于特殊的屏蔽设备,实际上与屏蔽设备相反。该插件检查节点上是否正在进行内核转储。如果是,它将返回 true,并如同节点已被屏蔽那样进行操作。
必须以与其他真实的 STONITH 设备(例如 external/ipmi
)一致的方式使用 Kdump 插件。要正常运行屏蔽机制,必须在触发真实的 STONITH 设备之前,指定 Kdump 已经过检查。请按以下过程中所述,使用 crm configure fencing_topology
来指定屏蔽设备的顺序。
使用 stonith:fence_kdump
资源代理(由 fence-agents
包提供)来监视启用了 Kdump 功能的所有节点。下面提供了资源的配置示例:
configure
primitive st-kdump stonith:fence_kdump \
params nodename="alice "\ 1
pcmk_host_check="static-list" \
pcmk_reboot_action="off" \
pcmk_monitor_action="metadata" \
pcmk_reboot_retries="1" \
timeout="60"
commit
要监控的节点的名称。如果您需要监视多个节点,请配置更多 STONITH 资源。要防止特定节点使用屏蔽设备,请添加位置约束。 |
当资源超时后,屏蔽操作将会启动。
在每个节点上的 /etc/sysconfig/kdump
中,将 KDUMP_POSTSCRIPT
配置为在 Kdump 进程完成后向所有节点发送通知。例如:
/usr/lib/fence_kdump_send -i INTERVAL -p PORT -c 1 alice bob charlie [...]
执行 Kdump 的节点将在完成 Kdump 后自动重启动。
写入新的 initrd
,以包含支持网络的 fence_kdump_send
库。使用 -f
选项重写现有文件,以便在下一次引导过程中使用新文件:
root #
dracut -f -a kdump
在防火墙中针对 fence_kdump
资源打开一个端口。默认端口为 7410
。
为了能够在触发真实的屏蔽机制(例如 external/ipmi
)之前检查 Kdump,请使用类似以下的配置:
fencing_topology \ alice: kdump-node1 ipmi-node1 \ bob: kdump-node2 ipmi-node2
有关 fencing_topology
的详细信息:
crm configure help fencing_topology
与任何其他资源一样,STONITH 类代理还支持使用监视操作检查状态。
请定期而谨慎地监视 STONITH 资源。对于大多数设备而言,至少 1800 秒(30 分钟)的监视间隔应已足够。
屏蔽设备是 HA 群集不可缺少的组成部分,但越少需要使用它们越好。电源管理设备常常会受广播流量过多的影响。某些设备无法处理每分钟多于十个左右连接的情况。如果两个客户端同时尝试进行连接,一些设备会分辨不清。大多数设备不能同时处理多个会话。
通常,每隔几小时检查一次屏蔽设备的状态应已足够。需要执行屏蔽操作和电源开关故障的情况是较少的。
有关如何配置监视操作的详细信息,请参见针对命令行方法的第 8.4.9 节 “配置资源监视”。
除了处理真实 STONITH 设备的插件外,还有特殊用途的 STONITH 插件。
下面提到的一些 STONITH 插件仅供演示和测试之用。不要在实际情境中使用以下任何设备,因为这可能导致数据损坏和无法预料的结果:
external/ssh
ssh
fence_kdump
此插件检查节点上是否正在进行内核转储。如果有,它将返回 true
,并按节点已被屏蔽那样进行操作。在转储过程中,此节点不能运行任何资源。这可避免屏蔽已关闭但正在进行转储的节点,从而节省屏蔽所需时间。此插件必须与另一个实际 STONITH 设备一同使用。
有关配置细节,请参见例 10.3 “Kdump 设备的配置”。
external/sbd
这是一个自屏蔽设备。它对可以插入共享磁盘的所谓的“毒药”作出反应。当中断共享储存区连接时,它将停止节点运行。要了解如何使用此 STONITH 代理实施基于储存的屏蔽,请参见第 11 章、过程 11.7 “将群集配置为使用 SBD”。有关更多细节,另请参见 https://github.com/ClusterLabs/sbd。
external/sbd
和 DRBD
external/sbd
屏蔽机制要求能直接从每个节点读取 SBD 分区。因此,SBD 分区中不得使用 DRBD* 设备。
但是,如果 SBD 分区位于未镜像或未复制的共享磁盘上,则可以对 DRBD 群集使用该屏蔽机制。
external/ssh
另一个基于软件的“屏蔽”机制。节点必须能够以 root
身份相互登录,而且无需密码。它使用一个参数 hostlist
指定它将指向的目标节点。由于不能重设置已确实失败的节点,它不得用于实际群集 - 仅供测试和演示之用。将其用于共享储存将导致数据损坏。
meatware
meatware
需要用户操作才能运行。调用 meatware
时,它会记录一条 CRIT 严重性消息,显示在节点的控制台上。然后操作员确认节点已关闭,并发出 meatclient(8)
命令。此命令指示 meatware
通知群集将该节点视为已出现故障。有关更多信息,请参见 /usr/share/doc/packages/cluster-glue/README.meatware
。
suicide
这是一个仅有软件的设备,它可以使用 reboot
命令重引导它运行所处的节点。这需要节点的操作系统的操作,在某些情况下可能失败。因此,如果可能,请避免使用此设备。然而,在单节点群集上使用此设备是很安全的。
如果您想要建立一个不含共享储存的屏蔽机制,则此配置十分有用。在此无磁盘模式下,SBD 会使用硬件检查包来屏蔽节点,而不依赖于任何共享设备。不过,无磁盘 SBD 不能处理双节点群集的节点分裂情况。因此,要使用无磁盘 SBD,群集需要有三个或更多节点。
suicide
是“I do not shoot my host”(我自己不关闭我的主机)规则的唯一例外。
请查看以下建议列表以避免常见错误:
不要并行配置多个电源开关。
要测试 STONITH 设备及其配置,请从每个节点拔出一次插头,并校验该节点是否会被屏蔽。
在负载状态下测试资源,并校验超时值是否合适。超时值设置得过短会触发(不必要的)屏蔽操作。有关详细信息,请参见第 6.3.9 节 “超时值”。
对您的设置使用合适的屏蔽设备。有关细节,另请参见第 10.5 节 “特殊的屏蔽设备”。
配置一个或多个 STONITH 资源。默认情况下,全局群集选项 stonith-enabled
设置为 true
。如果未定义任何 STONITH 资源,群集将拒绝启动任何资源。
不要将全局群集选项 stonith-enabled
设置为 false
,原因如下:
未启用 STONITH 的群集不受支持。
DLM/OCFS2 将会阻止一直等待不会发生的屏蔽操作。
不要将全局群集选项 startup-fencing
设置为 false
。默认情况下,会因以下原因将其设置为 true
:如果节点在群集启动期间状态未知,则它将会被屏蔽一次以明确其状态。
/usr/share/doc/packages/cluster-glue
在已安装系统中,此目录包含多个 STONITH 插件和设备的自述文件。
有关 STONITH 的信息。
《Pacemaker Explained》(Pacemaker 配置说明):说明用于配置 Pacemaker 的概念。包含全面而非常详细的信息供参考。
说明 HA 群集中节点分裂、法定票数和屏蔽的概念的文章。