我使用 . 创建了一个双节点集群(两个节点都是 RHEL 7)pacemaker
。它用于运行自定义应用程序。我创建了以下资源并将其分配给集群:
- 应用程序数据的共享存储
- 虚拟IP
它工作得很好。
现在,我们有一个要求。目前,仅当整个服务器出现问题时才会发生故障转移。 Pacemaker 不知道活动节点上运行的应用程序的状态,并完全忽略它。我们有一个 shell 脚本,能够对应用程序运行运行状况检查,并根据应用程序的运行状况返回 true/false 值。
任何人都可以建议我如何配置pacemaker以使用此shell脚本定期检查集群活动节点上应用程序的状态,并在脚本返回错误值时启动故障转移。
我见过一些例子,在 Web 服务器集群中,人们创建了一个示例 html 页面,并使用此 ( http://127.0.0.1/samplepage.html
) 作为pacemaker 的资源来检查活动节点中 apache web 服务器的运行状况。
请指导我如何使用 shell 脚本实现类似的结果。
更新:
这是我的配置:
[root@node1 ~]# pcs status
Cluster name: webspheremq
Stack: corosync
Current DC: node1 (version 1.1.15-11.el7-e174ec8) - partition with quorum
Last updated: Wed Jun 14 20:38:48 2017 Last change: Tue Jun 13 20:04:58 2017 by root via crm_attribute on svdg-stg29
2 nodes and 3 resources configured: 2 resources DISABLED and 0 BLOCKED from being started due to failures
Online: [ node1 node2 ]
Full list of resources:
Resource Group: websphere
websphere_fs (ocf::heartbeat:Filesystem): Started node1
websphere_vip (ocf::heartbeat:IPaddr2): Started node1
FailOverScript (ocf::heartbeat:Dummy): Started node1
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
为了启动和停止应用程序,我有两个 shell 脚本。在故障转移期间,我需要stop.sh
在资源将从中移动的节点中运行,并start.sh
在集群故障转移到的节点中运行。
我做了一些实验,发现人们正在使用虚拟资源来实现这种要求(在故障转移期间执行脚本)。
这是我到目前为止所做的:
我创建了一个虚拟资源(FailOverScript
)来测试应用程序启动/停止脚本,如下所示:
[root@node1 tmp]# pcs status resources
Resource Group: websphere
websphere_fs (ocf::heartbeat:Filesystem): Started node1
websphere_vip (ocf::heartbeat:IPaddr2): Started node1
**FailOverScript (ocf::heartbeat:Dummy): Started node1**
截至目前,我在资源 FailOverScript 的启动和停止操作下包含了测试脚本。当这个虚拟资源启动和停止时,它应该分别执行脚本failoverstartscript.sh和failoverstopscript.sh。
[root@node1 heartbeat]# pwd
/usr/lib/ocf/resource.d/heartbeat
[root@node1 heartbeat]#
[root@node1 heartbeat]# grep -A5 "start()" FailOverScript
FailOverScript_start() {
FailOverScript_monitor
/usr/local/bin/failoverstartscript.sh
if [ $? = $OCF_SUCCESS ]; then
return $OCF_SUCCESS
fi
[root@node1 heartbeat]#
[root@node1 heartbeat]#
[root@node1 heartbeat]# grep -A5 "stop()" FailOverScript
FailOverScript_stop() {
FailOverScript_monitor
/usr/local/bin/failoverstopscript.sh
if [ $? = $OCF_SUCCESS ]; then
rm ${OCF_RESKEY_state}
fi
但是,当启动/停止该虚拟资源(通过手动故障转移)时,该脚本不会执行。尝试了不同的方法,但我仍然无法找出原因。需要一些帮助来查找脚本在故障转移期间不自动执行的原因。
答案1
anything
您可以考虑使用资源代理,而不是尝试修改虚拟 RA 来执行任意脚本。
# pcs resource describe ocf:heartbeat:anything
ocf:heartbeat:anything - Manages an arbitrary service
This is a generic OCF RA to manage almost anything.
Resource options:
binfile (required): The full name of the binary to be executed.
This is expected to keep running with the
same pid and not just do something and
exit.
cmdline_options: Command line options to pass to the binary
workdir: The path from where the binfile will be executed.
pidfile: File to read/write the PID from/to.
logfile: File to write STDOUT to
errlogfile: File to write STDERR to
user: User to run the command as
monitor_hook: Command to run in monitor operation
stop_timeout: In the stop operation: Seconds to wait for kill
-TERM to succeed before sending kill -SIGKILL.
Defaults to 2/3 of the stop operation timeout.
您可以将anything
代理指向您的脚本作为binfile=
参数,然后,如果您有某种方法来监视自定义应用程序,而不是检查正在运行的 pid(这是代理anything
默认执行的操作),则可以在monitor_hook
参数中进行定义。