
屏蔽在 HA(高可用性)计算机群集中是一个非常重要的概念。群集有时会检测到某个节点行为异常,需要删除此节点。这称为屏蔽,通常使用 STONITH 资源实现。屏蔽可以定义为一种使 HA 群集具有已知状态的方法。
群集中的每个资源均带有状态。例如:“资源 r1 已在 alice 上启动”。在 HA 群集中,这种状态暗示了“资源 r1 在除 alice 外的所有节点上都处于停止状态”,因为群集必须确保每个资源只能在一个节点上启动。每个节点都必须报告资源发生的每个更改。这样群集状态就是资源状态和节点状态的集合。
当节点或资源的状态无法十分肯定地确立时,将进行屏蔽。即使在群集未感知到给定节点上发生的事件时,屏蔽也可确保此节点不会运行任何重要资源。
有两类屏蔽:资源级别屏蔽和节点级别屏蔽。后者是本章的主题。
通过使用资源级屏蔽,群集可确保节点不能访问一个或多个资源。SAN 就是一个典型的示例,屏蔽操作更改了 SAN 交换机上的规则从而拒绝节点的访问。
通过使用要保护的资源所依赖的常规资源可以完成资源级别的屏蔽。这种资源应会拒绝在此节点上启动,所以依赖它的资源也不会在同一节点上运行。
节点级屏蔽可确保节点绝对不会运行任何资源。这种屏蔽通常采用简单但有点粗暴的方式来完成,即重设置或关闭节点。
在 SUSE® Linux Enterprise High Availability Extension 中,屏障实施为 STONITH (Shoot The Other Node In The Head)。它提供节点级屏蔽。High Availability Extension 包括 stonith 命令行工具,一个能远程关闭群集中节点的可扩展界面。有关可用选项的概述,请运行 stonith --help 或参见 stonith 的手册页了解更多信息。
要使用节点级屏蔽,首先需要有屏蔽设备。要获取由 High Availability Extension 支持的 STONITH 设备的列表,请以 root 身份在任何节点上运行以下命令:
stonith -L
STONITH 设备可分为以下类别:
电源分发单元是管理关键网络、服务器和数据中心设备的电源容量和功能的基本元素。它可以提供对已连接设备的远程负载监视和独立电源出口控制,以实现远程电源循环。
稳定的电源可在公用电源故障时通过从单独源供电向连接的设备提供应急电源。
如果是在刀片组上运行群集,则刀片外壳中的电源控制设备就是提供屏蔽的唯一候选。当然,此设备必须能够管理单个刀片计算机。
无人值守设备(IBM RSA、HP iLO 和 Dell DRAC)正变得越来越普遍,在未来它们甚至可能成为现成可用计算机上的标准配置。然而,它们相比 UPS 设备有一点不足,因为它们与主机(群集节点)共享一个电源。如果节点持续断电,则认为控制该节点的设备失去作用。在这种情况下,CRM 将继续无限期地尝试屏蔽节点,而所有其他资源操作都将等待屏蔽/STONITH 操作完成。
测试设备仅用于测试目的。它们通常对硬件更加友好。将群集投放到生产环境之前,必须以真实的屏蔽设备进行替换。
对 STONITH 设备的选择主要取决于您的预算和所用硬件的种类。
SUSE® Linux Enterprise High Availability Extension 的 STONITH 实施由两个组件组成:
stonithd 是可由本地进程或通过网络访问的守护程序。它接受与屏蔽操作(重设置、关闭电源和打开电源)对应的命令。它还可以检查屏蔽设备的状态。
stonithd 守护程序在 CRM HA 群集中的每个节点上运行。在 DC 节点上运行的 stonithd 实例从 CRM 接收屏蔽请求。它会对请求作出响应,其他 stonithd 程序将执行所需的屏蔽操作。
对于每个受支持的屏蔽设备,都有一个能够控制所述设备的 STONITH 插件。STONITH 插件是屏障设备的界面。在每个节点上,所有 STONITH 插件的位置都在 /usr/lib/stonith/plugins(对于 64 位体系结构,在 /usr/lib 64/stonith/plugins)中。所有 STONITH 插件看上去都与 stonithd 一样,但显著区别在于反映了屏障设备的性质。
某些插件支持多个设备。ipmilan(或 external/ipmi)就是一个典型的示例,它实施 IPMI 协议并可以控制任何支持此协议的设备。
要设置屏蔽,需要配置一个或多个 STONITH 资源 - stonithd 守护程序不需要配置。所有配置都储存在 CIB 中。STONITH 资源属于 stonith 类的资源(请参见第 4.2.2 节 “支持的资源代理类”)。STONITH 资源是 STONITH 插件在 CIB 中的代表。除了屏蔽操作,还可以启动、停止和监视 STONITH 资源,就像任何其他资源一样。启动或停止 STONITH 资源意味着装载或卸载节点上的 STONITH 设备驱动程序。启动和停止仅是管理操作,不会转换成对屏蔽设备自身的任何操作。然而,监视操作却会转换成将其记录到设备(以校验设备能否在需要时正常运行)。 STONITH 资源故障转移到另一个节点时,它通过装载相应的驱动程序允许当前节点与 STONITH 设备对话。
STONITH 资源可像任何其他资源一样进行配置。有关配置资源的更多信息,请参见第 5.3.3 节 “创建 STONITH 资源”或第 6.4.3 节 “创建 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 命令行工具配置资源的更多信息,请参见第 6 章 配置和管理群集资源(命令行)。
以下一些示例仅用于演示和测试目的。请勿将任何测试配置示例用于真实的群集方案。
configure primitive st-null stonith:null \ params hostlist="alice bob" clone fencing st-null commit
备用配置:
configure primitive st-alice stonith:null \ params hostlist="alice" primitive st-bob stonith:null \ params hostlist="bob" location l-st-alice st-alice -inf: alice location l-st-bob st-bob -inf: bob commit
考虑到群集软件,此配置示例是完全正确的。与真实配置的唯一区别是没有发生屏蔽操作。
一个更实际的示例(但仍只能用于测试)是以下 external/ssh 配置:
configure primitive st-ssh stonith:external/ssh \ params hostlist="alice bob" clone fencing st-ssh commit
此配置也可以重设置节点。此配置类似于针对空 STONITH 设备的第一个示例。在此示例中使用了克隆。这是 CRM/Pacemaker 的一个功能。克隆是一种快捷方式:无需费力地定义 n 个完全相同只名称不同的资源,只需一个克隆的资源就够了。到目前为止,只要可从所有节点访问 STONITH 设备,那么最常用的克隆资源就是 STONITH 资源。
真实的设备配置没有太大区别,尽管某些设备可能要求更多属性。可以如下配置 IBM RSA 无人值守设备:
configure primitive st-ibmrsa-1 stonith:external/ibmrsa-telnet \ params nodename=alice ipaddr=192.168.0.101 \ userid=USERID passwd=PASSW0RD primitive st-ibmrsa-2 stonith:external/ibmrsa-telnet \ params nodename=bob ipaddr=192.168.0.102 \ userid=USERID passwd=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 need 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 产品线都支持此协议。
如第 8.3.1 节 “STONITH 资源配置示例”中所述,有多种方式可以配置 STONITH 资源:使用约束和/或克隆。选择何种构造用于配置取决于多个因素:屏蔽设备的性质、设备管理的主机数、群集节点数或个人喜好。
如果使用克隆方式配置 STONITH 资源是安全的,而且能减少配置,则使用克隆的 STONITH 资源。
与任何其他资源一样,STONITH 类代理还支持使用监视操作检查状态。
请定期而谨慎地监视 STONITH 资源。对于大多数设备而言,至少 1800 秒(30 分钟)的监视间隔应已足够。
屏蔽设备是 HA 群集不可缺少的组成部分,但越少需要使用它们越好。电源管理设备常常会受广播流量过多的影响。某些设备无法处理每分钟多于十个左右连接的情况。如果两个客户端同时尝试进行连接,一些设备会分辨不清。大多数设备不能同时处理多个会话。
通常,每隔几小时检查一次屏蔽设备的状态应已足够。需要执行屏蔽操作和电源开关故障的情况是较少的。
有关如何配置监视操作的详细信息,请参见针对命令行方法的第 6.4.8 节 “配置资源监视”。
除了处理真实 STONITH 设备的插件外,还有特殊用途的 STONITH 插件。
下面提到的一些 STONITH 插件仅供演示和测试之用。不要在实际情境中使用以下任何设备,因为这可能导致数据损坏和无法预料的结果:
external/ssh
ssh
null
external/kdumpcheck
此插件检查节点上是否正在进行内核转储。如果有,它将返回 true,并按节点已被屏蔽那样进行操作。在转储过程中,此节点不能运行任何资源。这可避免屏蔽已关闭但正在进行转储的节点,从而节省屏蔽所需时间。此插件必须与另一个实际 STONITH 设备一同使用。有关更多细节,请参见 /usr/share/doc/packages/cluster-glue/README_kdumpcheck.txt。
external/sbd
这是一个自屏蔽设备。它对可以插入共享磁盘的所谓的“毒药”作出反应。当中断共享储存区连接时,它将停止节点运行。要了解如何使用此 STONITH 代理实施基于储存的屏蔽,请参见第 17 章 储存保护。有关更多细节,另请参见 http://www.linux-ha.org/wiki/SBD_Fencing。
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。
null
这是一个用于各种测试情境的假设设备。它总是声明它已连接某个节点,但其实未做任何操作。除非您了解您所执行的操作,否则请勿使用它。
suicide
这是一个仅有软件的设备,它可以使用 reboot 命令重引导它运行所处的节点。这需要节点的操作系统的操作,在某些情况下可能失败。因此,如果可能,请避免使用此设备。然而,在单节点群集上使用此设备是很安全的。
suicide 和 null 是“不连接我的主机”规则的唯一例外。
请查看以下建议列表以避免常见错误:
不要并行配置多个电源开关。
要测试 STONITH 设备及其配置,请从每个节点拔出一次插头,并校验该节点是否会被屏蔽。
在负载状态下测试资源,并校验超时值是否合适。超时值设置得过短会触发(不必要的)屏蔽操作。有关详细信息,请参见第 4.2.9 节 “超时值”。
对您的设置使用合适的屏蔽设备。有关细节,另请参见第 8.5 节 “特殊的屏蔽设备”。
配置一个或多个 STONITH 资源。默认情况下,全局群集选项 stonith-enabled 设置为 true。如果未定义任何 STONITH 资源,群集将拒绝启动任何资源。
不要将全局群集选项 stonith-enabled 设置为 false,原因如下:
未启用 STONITH 的群集不受支持。
DLM/OCFS2 将会阻止一直等待不会发生的屏蔽操作。
不要将全局群集选项 startup-fencing 设置为 false。默认情况下,会因以下原因将其设置为 true:如果节点在群集启动期间状态未知,则它将会被屏蔽一次以明确其状态。
/usr/share/doc/packages/cluster-glue
在已安装系统中,此目录包含多个 STONITH 插件和设备的自述文件。
High Availability Linux 项目主页上有关 STONITH 的信息。
Fencing and Stonith(屏蔽和 Stonith):Pacemaker 项目主页上有关屏蔽的信息。
Pacemaker Explained (Pacemaker 1.1 for Corosync 2.x and crmsh)(Pacemaker 说明(适用于 Corosync 2.x 和 crmsh 的 Pacemaker 1.1)):解释配置 Pacemaker 用到的概念。包含全面而非常详细的信息供参考。
说明 HA 群集中节点分裂、法定票数和屏蔽的概念的文章。