A 查错 #
用户可能会遇到奇怪而不易理解的问题,特别是刚开始尝试使用 High Availability 时。不过,有一些实用程序可用来仔细地观察 High Availability 的内部进程。本章推荐了一些解决方案。
A.1 安装和前期阶段的步骤 #
对安装软件包或使群集上线的过程中遇到的问题查错。
- 是否安装了 HA 软件包?
配置和管理群集所需的软件包包含在 SUSE Linux Enterprise High Availability 提供的
High Availability
安装软件集中。按《安装和设置快速入门》中所述,检查每个群集节点上是否安装了 SUSE Linux Enterprise High Availability,并且每台计算机上是否安装了
软件集。- 所有群集节点的初始配置是否相同?
如第 4 章 “使用 YaST 群集模块”中所述,为了能够相互通讯,属于同一个群集的所有节点都需要使用相同的
bindnetaddr
、mcastaddr
和mcastport
。检查所有群集节点的
/etc/corosync/corosync.conf
中配置的通讯通道和选项是否都相同。如果使用加密通讯,请检查是否所有群集节点上都存在
/etc/corosync/authkey
文件。除
corosync.conf
以外的所有nodeid
设置都必须相同;所有节点上的authkey
文件都必须相同。- 防火墙是否允许通过
mcastport
进行通讯? 如果用于群集节点之间通讯的 mcastport 由防火墙阻止,这些节点将无法相互可见。在分别按第 4 章 “使用 YaST 群集模块”或安装和设置快速入门中所述使用 YaST 或引导脚本执行初始设置时,防火墙设置通常会自动调整。
要确保 mcastport 不被防火墙阻止,请检查每个节点上的防火墙设置。
- 每个群集节点上是否都启动了 Pacemaker 和 Corosync?
通常,启动 Pacemaker 也会启动 Corosync 服务。要检查这两个服务是否在运行,请使用以下命令:
#
crm cluster status
如果它们未运行,请执行以下命令将其启动:
#
crm cluster start
A.2 日志记录 #
- 可以在哪里找到日志文件?
Pacemaker 会将其日志文件写入
/var/log/pacemaker
目录。Pacemaker 的主日志文件是/var/log/pacemaker/pacemaker.log
。如果您找不到日志文件,请检查/etc/sysconfig/pacemaker
(Pacemaker 自己的配置文件)中的日志记录设置。如果该文件中配置了PCMK_logfile
,Pacemaker 会使用此参数定义的路径。如果您需要获得一份显示所有相关日志文件的群集级报告,请参见如何创建包含所有群集节点分析的报告?以了解更多信息。
- 我启用了监控,但为什么日志文件中没有监控操作的任何跟踪信息?
除非发生错误,否则
pacemaker-execd
守护程序不会记录重复的监控操作。记录所有重现的操作会产生太多噪音。因此,只会每小时记录一次重现的监控操作。- 我只收到一条
failed
消息。有可能收到更多信息吗? 在命令中添加
--verbose
参数。如果多次执行该操作,调试输出就会变得更详细。请参见日志记录数据 (sudo journalctl -n
) 以获得有用的提示。- 如何获取所有节点和资源的概述?
使用
crm_mon
命令。下面显示了资源操作的历史记录(选项-o
)和处于不活动状态的资源 (-r
):#
crm_mon -o -r
状态改变时,显示内容会刷新(要取消,请按 Ctrl–C)。示例可能显示如下:
例 A.1︰ 停止的资源 #Last updated: Fri Aug 15 10:42:08 2014 Last change: Fri Aug 15 10:32:19 2014 Stack: corosync Current DC: bob (175704619) - partition with quorum Version: 1.1.12-ad083a8 2 Nodes configured 3 Resources configured Online: [ alice bob ] Full list of resources: my_ipaddress (ocf:heartbeat:Dummy): Started bob my_filesystem (ocf:heartbeat:Dummy): Stopped my_webserver (ocf:heartbeat:Dummy): Stopped Operations: * Node bob: my_ipaddress: migration-threshold=3 + (14) start: rc=0 (ok) + (15) monitor: interval=10000ms rc=0 (ok) * Node alice:
Pacemaker Explained PDF(在 https://www.clusterlabs.org/pacemaker/doc/ 上提供)的 How are OCF Return Codes Interpreted? 部分介绍了三种不同的恢复类型。
- 如何查看日志?
要详细查看群集中的当前活动,请使用以下命令:
#
crm history log [NODE]
将 NODE 替换为您要检查的节点,或将它保留空白。有关更多信息,请参见第 A.5 节 “历史记录”。
A.3 资源 #
- 如何清理我的资源?
使用以下命令:
#
crm resource list
#
crm resource cleanup rscid [node]
如果遗漏此节点,则资源将在所有节点上清除。更多信息可以在第 8.5.2 节 “使用 crmsh 清理群集资源”中找到。
- 如何列出当前已知的资源?
使用命令
crm resource list
可以显示当前资源。- 我配置了一个资源,但是它总是失败。为什么?
要检查 OCF 脚本,请使用
ocf-tester
,例如:ocf-tester -n ip1 -o ip=YOUR_IP_ADDRESS \ /usr/lib/ocf/resource.d/heartbeat/IPaddr
如果有多个参数,请使用
-o
多次。运行crm ra info AGENT
可获取必需参数和可选参数的列表,例如:#
crm ra info ocf:heartbeat:IPaddr
运行 ocf-tester 之前,请确保资源不受群集管理。
- 资源为什么不故障转移,为什么没有错误?
已终止的节点可能会被视为不干净。这样就必须屏蔽它。如果 STONITH 资源无法正常运行或不存在,另一个节点便会等待屏蔽发生。屏蔽超时值通常比较大,因此可能需要一段时间才能看到问题的明显迹象(如果最终出现问题)。
另一种可能的解释是仅仅是不允许资源在此节点上运行。这可能是由于未“清理”过去发生的失败所致。或者可能是先前的管理操作(即,添加了分数为负值的位置约束)所致。例如,使用
crm resource move
命令插入了这样的位置约束。- 我为什么从不知道资源将在何处运行?
如果资源没有位置约束,则其放置取决于(几乎)随机节点选择。建议您始终明确表示资源的首选节点。这并不意味着您需要指定所有资源的位置自选设置。一个自选设置就能满足一组相关(共置)资源的需要。节点自选设置类似如下:
location rsc-prefers-alice rsc 100: alice
A.4 STONITH 和屏蔽 #
- 我的 STONITH 资源为什么不启动?
启动(或启用)操作执行时会检查设备的状态。如果设备未就绪,STONITH 资源便无法启动。
同时,系统会要求 STONITH 插件生成主机列表。如果此列表为空,则运行无法关闭任何节点的 STONITH 资源将毫无意义。运行 STONITH 的主机的名称是从列表中滤除的,因为节点不能自我关闭。
要使用单主机管理设备(如无人值守设备),请务必不要允许 STONITH 资源在应当屏蔽的节点上运行。使用无限负位置节点自选设置(约束)。群集会将 STONITH 资源移到其他可以启动的位置,但不会未通知您就移动。
- 为什么尽管我有 STONITH 资源,却没有发生屏蔽?
每个 STONITH 资源都必须提供主机列表。您可以手动将此列表插入 STONITH 资源配置,也可以从设备自身(例如,从输出名称)检索。这取决于 STONITH 插件的性质。
pacemaker-fenced
使用该列表来查找可以屏蔽目标节点的 STONITH 资源。只有出现在该列表中的节点 STONITH 资源才能关闭(屏蔽)。如果
pacemaker-fenced
在正在运行的 STONITH 资源所提供的任何主机列表中都找不到该节点,它将询问其他节点上的pacemaker-fenced
实例。如果目标节点未显示在其他pacemaker-fenced
实例的主机列表中,则屏蔽请求将以超时在源节点上结束。- 我的 STONITH 资源为什么会偶尔失败?
如果广播流量过大,电源管理设备可能会停止运行。隔开监控操作。如果只是偶尔(希望从不)需要屏蔽,则每隔几小时检查一次设备状态就已足够。
另外,其中的一些设备可能会拒绝同时与多方通讯。如果在群集尝试测试状态时将终端或浏览器会话保持打开状态,则这可能会产生问题。
A.5 历史记录 #
- 如何从发生故障的资源中检索状态信息或日志?
使用
history
命令及其子命令resource
:#
crm history resource NAME1
这只会返回给定资源的完整转换日志。不过,您也可以调查多个资源,在第一个资源名称的后面追加更多的资源名称即可。
如果您遵循了命名约定(请参见附录 B “命名约定”),使用
resource
命令可以更轻松地调查一组资源。例如,以下命令将调查以db
开头的所有原始资源:#
crm history resource db*
查看
/var/cache/crm/history/live/alice/ha-log.txt
中的日志文件。- 如何减少历史输出?
history
命令有两个选项:使用
exclude
使用
timeframe
exclude
命令可让您设置附加的正则表达式用于从日志中排除特定的模式。例如,以下命令会排除所有 SSH、systemd
和内核消息:#
crm history exclude ssh|systemd|kernel.
使用
timeframe
命令可将输出限制为特定的范围。例如,以下命令会显示 8 月 23 日 12:00 到 12:30 的所有事件:#
crm history timeframe "Aug 23 12:00" "Aug 23 12:30"
- 如何存储“会话”以便日后检查?
当您遇到 bug 或者需要进一步检查的事件时,存储所有当前设置的做法非常有用。您可以将存储的文件发送给支持人员,或者使用
bzless
进行查看。例如:crm(live)history#
timeframe "Oct 13 15:00" "Oct 13 16:00"
crm(live)history#
session save tux-test
crm(live)history#
session pack
Report saved in '/root/tux-test.tar.bz2'
A.6 Hawk2 #
- 替换自我签名证书
要避免在首次启动 Hawk2 时收到有关自我签名证书的警告,请将自动创建的证书替换为您自己的证书或官方证书颁发机构 (CA) 签名的证书:
将
/etc/hawk/hawk.key
替换为私用密钥。将
/etc/hawk/hawk.pem
替换为 Hawk2 应当提供的证书。重启动 Hawk2 服务以重新加载新证书:
#
systemctl restart hawk-backend hawk
将文件的所有权更改为
root:haclient
并使文件可被组访问:#
chown root:haclient /etc/hawk/hawk.key /etc/hawk/hawk.pem
#
chmod 640 /etc/hawk/hawk.key /etc/hawk/hawk.pem
A.7 杂项 #
- 如何在所有群集节点上运行命令?
使用
crm cluster run
命令可完成此任务。例如:#
crm cluster run "ls -l /etc/corosync/*.conf"
INFO: [alice] -rw-r--r-- 1 root root 812 Oct 27 15:42 /etc/corosync/corosync.conf INFO: [bob] -rw-r--r-- 1 root root 812 Oct 27 15:42 /etc/corosync/corosync.conf INFO: [charlie] -rw-r--r-- 1 root root 812 Oct 27 15:42 /etc/corosync/corosync.conf默认情况下,指定命令会在群集中的所有节点上运行。或者,您也可以在某个特定节点或特定的一组节点上运行命令:
#
crm cluster run "ls -l /etc/corosync/*.conf" alice bob
- 我的群集状态是什么?
要检查群集的当前状态,请使用程序
crm_mon
或crm
status
。这将显示当前的 DC 以及当前节点已知的所有节点和资源。- 为什么群集的多个节点看不到彼此?
这可能有几个原因:
先查看配置文件
/etc/corosync/corosync.conf
。检查群集中每个节点的多播或单播地址是否相同(在包含interface
键的mcastaddr
部分中查看)。检查您的防火墙设置。
检查您的交换机是否支持多播或单播地址。
检查节点间的连接是否已断开。这通常是错误配置防火墙的结果。这也可能是发生节点分裂情况(此情况下群集会被分割)的原因。
- 为什么不能挂载 OCFS2 设备?
检查日志消息 (
sudo journalctl -n
) 中是否包含下面一行:Jan 12 09:58:55 alice pacemaker-execd: [3487]: info: RA output: [...] ERROR: Could not load ocfs2_stackglue Jan 12 16:04:22 alice modprobe: FATAL: Module ocfs2_stackglue not found.
此例中缺少了内核模块
ocfs2_stackglue.ko
。请根据安装的内核安装软件包ocfs2-kmp-pae
、ocfs2-kmp-default
或ocfs2-kmp-xen
。
A.8 群集报告 #
- 如何创建包含所有群集节点分析的报告?
在 crm 外壳中,可以使用
crm report
创建报告。此工具将会编译:群集范围内的日志文件,
软件包状态,
DLM/OCFS2 状态,
系统信息,
CIB 历史记录,
内核转储报告的分析(如果安装了 debuginfo 软件包)。
通常需要结合以下命令运行
crm report
:#
crm report -f 0:00 -n alice -n bob
该命令会提取主机 alice 和 bob 上从午夜 0 点开始的所有信息,并在当前目录中创建名为
crm_report-DATE.tar.bz2
的*.tar.bz2
存档,例如crm_report-Wed-03-Mar-2012
。如果您只需要特定时间段的信息,请使用-t
选项添加结束时间。警告:去除敏感信息crm report
工具会尝试从 CIB 和 PE 输入文件中去除所有敏感信息,但它并不是万能的。如果您还有更多敏感信息,请通过-p
选项提供其他模式(请参见手册页)。系统不会清理日志文件以及crm_mon
、ccm_tool
和crm_verify
输出。以任何方式共享数据之前,请检查存档并删除不想泄露的所有信息。
使用其他选项自定义命令执行。例如,如果除了
root
和hacluster
之外,另一个用户也拥有访问群集的权限,请使用-u
选项并指定此用户。如果存在非标准 SSH 端口,请使用-X
选项添加该端口。如果需要简化参数,请在配置文件/etc/crm/crm.conf
的report
部分设置默认值。有关详细信息,请参见crm report
的手册页。过程 A.1︰ 使用自定义 SSH 端口生成群集报告 #使用自定义 SSH 端口时,请结合使用
-X
和crm report
来修改客户端的 SSH 端口。例如,如果自定义 SSH 端口为5022
,则使用以下命令:#
crm report -X "-p 5022" [...]
要为
crm report
永久设置自定义 SSH 端口,请启动交互式 crm 外壳:#
crm options
输入以下内容:
crm(live)options#
set core.report_tool_options "-X -oPort=5022"
在
crm report
分析完所有相关日志文件并创建目录(或存档)后,请检查日志文件中有无大写的ERROR
字符串。位于报告顶层目录中的最重要的文件有:analysis.txt
比较在所有节点上都应保持一致的文件。
corosync.txt
包含 Corosync 配置文件的副本。
crm_mon.txt
包含
crm_mon
命令的输出。description.txt
包含您节点上的所有群集软件包版本。另有节点特定的
sysinfo.txt
文件。它会链接到顶层目录。可以使用此文件作为模板来描述您遇到的问题,然后将其发布到 https://github.com/ClusterLabs/crmsh/issues。
members.txt
所有节点的列表
sysinfo.txt
包含所有相关包名称及其版本的列表。此外,还有一个不同于原始 RPM 软件包的配置文件列表。
节点特定的文件将存储在以节点名称命名的子目录中。其中包含相应节点的
/etc
目录副本。
A.9 更多信息 #
有关 Linux 上的高可用性的更多信息(包括配置群集资源以及管理和自定义 High Availability 群集),请参见 https://clusterlabs.org/wiki/Documentation。