PostgreSQLデータベースを稼働させるために、コロシンクとペースメーカーを使用してアクティブ/パッシブ(2ノード)Linux-HAクラスターをセットアップしようとしています。 DRBDとサービスIPを介して動作します。 node1に障害が発生した場合、node2が引き継ぎます。 PGがnode2で実行され、失敗した場合も同じです。 STONITH以外はすべて正常に動作します。
ノード間には専用のHA接続(10.10.10.X)があるため、次のインターフェイス構成を使用しています。
eth0 eth1 Host
10.10.10.251 172.10.10.1 node1
10.10.10.252 172.10.10.2 node2
Stonithが有効になっていて、ssh-agentを使用してノードを強制終了するテストをしています。
crm configure property stonith-enabled=true
crm configure property stonith-action=poweroff
crm configure rsc_defaults resource-stickiness=100
crm configure property no-quorum-policy=ignore
crm configure primitive stonith_postgres stonith:external/ssh \
params hostlist="node1 node2"
crm configure clone fencing_postgres stonith_postgres
crm_mon -1
ショー:
============
Last updated: Mon Mar 19 15:21:11 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
4 Resources configured.
============
Online: [ node2 node1 ]
Full list of resources:
Master/Slave Set: ms_drbd_postgres
Masters: [ node1 ]
Slaves: [ node2 ]
Resource Group: postgres
fs_postgres (ocf::heartbeat:Filesystem): Started node1
virtual_ip_postgres (ocf::heartbeat:IPaddr2): Started node1
postgresql (ocf::heartbeat:pgsql): Started node1
Clone Set: fencing_postgres
Started: [ node2 node1 ]
問題は:eth0インターフェース間の接続を切断すると、両方のノードが強制終了されます。ノードが2つしかないため、クォーラムの問題だと思います。しかし、正しいクォーラムを計算するためだけに3番目のノードを追加したくありません。
この問題を解決するためのアイデアはありますか?
これは少し古い質問ですが、ここで提示される問題は、クラスター、特に2ノードクラスターでのフェイルオーバーがどのようにいつ機能するかについての誤解に基づいています。
要点は次のとおりです。2つのノード間の通信を無効にすることでフェイルオーバーテストを実行することはできません。そうすることで、表示されているとおりの状態になり、スプリットブレインシナリオに追加の相互STONITHが追加されます。フェンシング機能をテストする場合は、アクティブノードで単純なkillall -9 corosync
を実行します。他の方法はcrm node fence
またはstonith_admin -F
です。
クラスターの完全ではない説明(crm configure show
およびcat /etc/corosync/corosync.conf
?の出力はどこにあるか)から、メッセージング、つまりCorosync /クラスター通信に10.10.10.xxアドレスを使用しているようです。 172.10.10.xxアドレスは通常の/サービスネットワークアドレスであり、172.10.10.xxアドレスを使用して、たとえばSSHを使用して特定のノードにアクセスします。 DNSはnode1
などのノードのホスト名も172.10.10.1に解決するようです。
SSHを使用するようにSTONITHを構成しましたが、それ自体はあまり良いアイデアではありませんが、おそらく単にテストしているだけです。私自身は使用していませんが、SSH STONITHエージェントが他のノードにログインし、ssh root@node2 "shutdown -h now"
などのシャットダウンコマンドを発行すると想定しています。
ここで、ノード間のクラスター通信を切断するとどうなりますか?ノード間での通信がなくなるため、ノードは各ノードが正常であると見なしなくなります。したがって、各ノードは、それが何らかの不幸なイベントの唯一の生存者であると想定し、アクティブノードまたはプライマリノードになろうとします(またはそのままにします)。これは古典的で恐ろしい split-brainシナリオです。
これの一部は、確認することですもう1つ、明らかにそしておそらく失敗したノードが完全にダウンしていて、そこにSTONITHが入ります。両方ノードが同じゲームをプレイしています。アクティブになる(またはとどまる)ことを試み、すべてのクラスターリソースを引き継ぐこと、および他のノードを頭の中で撃ちます。
あなたはおそらく今何が起こっているのかを推測することができます。 node1
はssh root@node2 "shutdown -h now"
を実行し、node2
はssh root@node1 "shutdown -h now"
を実行します。これは、クラスター通信ネットワーク10.10.10.xxではなく、サービスネットワーク172.10.10.xxを使用します。どちらのノードも実際には正常に動作しているため、コマンドの発行やSSH接続の受信に問題はなく、両方のノードが同時にお互いを撃ちます。これにより、両方のノードが強制終了されます。
STONITHを使用しない場合、特にDRBDの場合、スプリットブレインはさらに悪い結果をもたらす可能性があり、両方のノードがプライマリになる可能性があります。データの破損が発生する可能性が高く、スプリットブレインは手動で解決する必要があります。
私は http://www.hastexo.com/resources/hints-and-kinks の資料を読むことをお勧めします。今日は「Linux HAスタック」と呼んでいます。
TL; DR:フェンシングのセットアップをテストするためにノード間のクラスター通信を切断している場合、あなたはそれを間違っています。代わりにkillall -9 corosync
、crm node fence
またはstonith_admin -F
を使用してください。クラスター通信を切断すると、スプリットブレインシナリオが発生するだけで、データが破損する可能性があります。
/etc/corosync/corosync.confのクォーラムセクションにauto_tie_breaker: 1
を追加してみてください
ATBが有効になっている場合、クラスターは最大50%のノードで同時に障害が発生する可能性があります。クラスタパーティション、または最小のノードIDを持つノードとまだ接続しているノードのセットは、クォーレートのままです。他のノードは統合されます。
Pacemakerを使用してHAクラスターを確認します。 http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/index.html
Pacemakerドキュメントの クォーラムと2ノードのクラスター の章を読んでみてください。