我正在尝试在 CentOS7 上以主动/主动配置为 HAProxy 设置 PCS。我以前做过主动/主动,但我不熟悉约束和依赖组。
到目前为止,一切都很好:
2 nodes configured
4 resources configured
Online: [ HOST1 HOST2 ]
Full list of resources:
Clone Set: VIPHA-clone [VIPHA] (unique)
VIPHA:0 (ocf::heartbeat:IPaddr2): Started HOST2
VIPHA:1 (ocf::heartbeat:IPaddr2): Started HOST1
Clone Set: haproxy-clone [haproxy]
Started: [ HOST2 HOST1 ]
但是,现在我想添加一个约束,即 HAPRoxy 必须正在运行,以便主机能够为该 IP 提供服务:
pcs 约束顺序为 haproxy-clone 然后是 VIPHA-clone
问题在于,除非先启动,否则 HAProxy 永远不会启动,因为它无法绑定到 IP。
我该如何设置以便:
如果健康检查(即 haproxy 进程运行)失败,pcs 是否会将主机上的 IP 脱机?
仅当健康检查(即 haproxy 进程运行)成功时,pcs 才会启动 IP?
- 如果按照上面描述的方法无法实现,请同时开始并表现为 #1
我很感激任何意见。谢谢!
答案1
我在 haproxy.cfg 中监听通配符
bind *:443
代替
bind myvip:443
这样无论节点是否具有 VIP 资源,haproxy 资源都可以一直运行。如果节点获得 VIP,haproxy 将立即对其做出响应。
明显的副作用是 haproxy 不仅监听 VIP,还监听其所有 IP 地址。
如果端口号冲突(例如我需要在另一个 IP 或 VIP 上配置不同的端口 443),我会将其定义为bind *:9443
,然后将其放在 DNAT 后面。
答案2
如果您不受 pacemaker/corosync 的约束,则可以opensvc
使用以下服务配置文件来实现您所描述的行为:
[DEFAULT]
id = 84327b87-13f6-4d32-b90a-a7fad87a8d92
nodes = server1 server2
flex_min_nodes = 2
topology = flex
orchestrate = ha
monitor_action = freezestop
[ip#vip]
ipname@server1 = 192.168.100.240
ipname@server2 = 192.168.100.241
ipdev = br0
monitor = true
[app#haproxy]
type = simple
start = /sbin/haproxy -f /etc/haproxy/haproxy.cfg
restart = 1
monitor = true
解释:
[DEFAULT
部分是全局配置设置:
id = ....
唯一的服务 ID,在服务创建时自动生成(svcmgr -s myservice create
然后svcmgr -s myservice edit config
)nodes = server1 server2
意味着我们正在运行一个 2 节点opensvc
集群flex_min_nodes = 2
告诉我们,我们希望该服务至少运行 2 个实例。在这个 2 节点集群中,每个节点将有 1 个实例。topology = flex
指定我们正在运行主动/主动服务拓扑orchestrate = ha
告诉服务必须由opensvc
守护进程自动管理monitor_action = freezestop
用于强制在关键资源发生故障时(如 haproxy 进程崩溃或终止)执行行为。如果发生这种情况,opensvc
守护进程必须做出决定。3 个可能的参数:freezestop
:本地服务实例停止,并处于冻结状态。reboot
:节点已重新启动。crash
:节点崩溃。
[ip#vip]
: 用于声明服务vip:
- 在服务启动时,将在接口上配置
server1
IP192.168.100.240
br0
- 在服务启动时,将在接口上配置
server2
IP192.168.100.241
br0
monitor = true
告诉opensvc
代理此资源至关重要(如果发生故障,则触发服务monitor_action
)
[app#haproxy]
:描述应用程序的内容:
type = simple
指定服务管理单个进程应用程序(非分叉守护进程)start = /sbin/haproxy -f /etc/haproxy/haproxy.cfg
是服务启动时运行的命令restart = 1
告诉守护进程如果资源出现故障则opensvc
尝试重新启动该资源。1
monitor = true
haproxy 是关键资源。如果它宕机了,则根据前面的参数尝试重新启动 1 次,如果失败,则触发monitor_action
由于该服务依赖于 vip,因此您没有义务绑定 *:443,而只需绑定服务 vip。
关于你关于如果 haproxy 发生故障,重新启动/stonith 的问题,只需restart = 1
在 中输入[app#haproxy]
以尝试重新启动,并monitor_action = crash
在DEFAULT
部分中输入 。这样,将尝试 1 次重新启动,如果此操作不起作用,则节点崩溃。
希望这可以帮助。