Мне не удается заставить кластер работать с помощью кардиостимулятора и corosync. Вот моя конфигурация оборудования:
Эта сеть защищена брандмауэром.
У меня есть два ресурса, которые общаются с внешними устройствами через UDP:
Команда кардиостимулятора, которую я использовал:
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-адреса, по одному для каждого процесса:
Я сделал это с помощью:
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:
Я сделал группу для каждого из них:
crm configure group resource1 res1-ipin res1-srv
crm configure group resource2 res2-ipin res2-srv
Таким образом, я могу разместить каждый ресурс в разных узлах. Кардиостимулятор без проблем управляет этими ресурсами.
Входящие udp пакеты работают отлично, оба ресурса их обрабатывают без проблем.
Однако исходящие пакеты udp не проходят брандмауэр, потому что исходный IP-адрес является статическим для узла. Вот пример:
Оба они заблокированы межсетевым экраном. И у меня нет прав на настройку новых правил в брандмауэре (я не могу попросить администратора настроить их, он утверждает, что брандмауэр не позволяет этого).
Я попытался настроить NAT на каждом узле с помощью iptables:
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
Когда я это сделал, ресурсы resource1 и resource2 записывают в свои журналы, что они не могут отправить пакет:
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
Я понимаю, что использование двух плавающих IP-адресов бесполезно.
Если кто-нибудь может указать мне, что я делаю не так, буду очень признателен.
заранее спасибо
Попробуй это.
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`
В 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