我无法使用 pacemaker 和 corosync 使集群正常工作。这是我的硬件配置:
- 网络:192.168.3.0/255.255.255.0
- 网关:192.168.3.1
- node1(Ubuntu Server 12.04 x64)静态IP:192.168.3.34
- node2(Ubuntu Server 12.04 x64)静态 IP:192.168.3.35
该网络位于防火墙后面。
我有两个通过 udp 与外部设备通信的资源:
- 资源1 -> udp 端口 16500
- 资源2 -> udp 端口 16501
我使用的起搏器命令:
crm configure primitive res1-srv upstart:resource1 \
op monitor interval=10s timeout=120 on-fail="restart" \
meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true
crm configure primitive res2-srv upstart:resource2 \
op monitor interval=10s timeout=120 on-fail="restart" \
meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true
resource1 和 resource2 彼此不相关,并且集群上(在 node1 或 node2 上)每个资源必须只有一个活动实例。
我创建了 2 个浮动 IP 地址,每个进程一个:
- res1-ipin-> 192.168.3.130
- res2-ipin-> 192.168.3.131
我使用以下方法完成此操作:
crm configure primitive res1-ipin ocf:heartbeat:IPaddr2 \
params ip="192.168.3.130" cidr_netmask="24" op monitor interval="10s" meta is-managed="true"
crm configure primitive res2-ipin ocf:heartbeat:IPaddr2 \
params ip="192.168.3.131" cidr_netmask="24" op monitor interval="10s" meta is-managed="true"
在防火墙上管理员配置了2条NAT规则:
- [公网 IP]:16500 --> 192.168.3.130:16500
- [公网 IP]:16501 --> 192.168.3.130:16501
我给每个人创建了一个小组:
crm configure group resource1 res1-ipin res1-srv
crm configure group resource2 res2-ipin res2-srv
因此我可以将每个资源放在不同的节点中。起搏器可以毫无问题地管理这些资源。
传入的 UDP 数据包运行完美,两个资源都可以毫无问题地处理它们。
但是,传出的 udp 数据包不会通过防火墙,因为源 ip 地址是节点的静态 ip 地址。以下是示例:
- resource1 在 node1 上运行 -> 传出 ip 地址和端口是 192.168.3.34:16500
- resource2 在 node2 上运行 -> 传出 ip 地址和端口是 192.168.3.35:16501
这两个都被防火墙拦截了。而且我没有权限在防火墙上配置新规则(我不能要求管理员配置它们,他说防火墙不允许这样做)。
我尝试使用 iptables 在每个节点上配置 NAT:
iptables -t nat -A POSTROUTING -p udp --sport 16500 -j SNAT --to-source 192.168.3.130:16500
iptables -t nat -A POSTROUTING -p udp --sport 16501 -j SNAT --to-source 192.168.3.131:16501
当我这样做时,资源 1 和资源 2 在其日志中写道它们无法发送数据包:
Client ERROR *** Terminal nro:XXX writing 1Operation not permitted
我不知道该怎么办。我还尝试添加资源 ocf:heartbeat:IPsrcaddr,但它崩溃了:
IPsrcaddr[6200]: ERROR: command 'ip route replace 192.168.3.0/24 dev eth0 src 192.168.3.130' failed
我知道使用 2 个浮动 IP 地址不会有什么好处。
如果有人能指出我做错的事情我将非常感激。
提前致谢
答案1
资源代理IPsrcaddr
应该可以完成这个任务。配置IPsrcaddr
资源如下:
# crm configure
crm(live)configure# primitive res1_srcaddr IPsrcaddr \
params ipaddress=192.168.3.130
crm(live)configure# primitive res2_srcaddr IPsrcaddr \
params ipaddress=192.168.3.131
然后进入编辑器并将新的 IPsrcaddr 资源添加到 IPaddr2 资源之后的相应组中:
crm(live)configure# edit
...snip...
group resource1 res1-ipin res1_srcaddr res1-srv
group resource2 res2-ipin res2_srcaddr res2-srv
...snip...
crm(live)configure# verify
crm(live)configure# commit
如果您仍然看到与有关的错误IPsrcaddr
,您可以尝试手动运行该命令,以更好地了解其失败的原因。
您甚至可以尝试修改IPsrcaddr
资源代理以更好地适合您的节点;这是一个相对简单的资源代理:
# vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr
答案2
尝试这个。
vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr
消除
NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^ ]*'`
并将其替换为
NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^ ]*'|head -1`