web-dev-qa-db-ja.com

2ノードのアクティブ/パッシブLinux HAペースメーカークラスターでSTONITHをセットアップする方法

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番目のノードを追加したくありません。

この問題を解決するためのアイデアはありますか?

12
MMore

これは少し古い質問ですが、ここで提示される問題は、クラスター、特に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が入ります。両方ノードが同じゲームをプレイしています。アクティブになる(またはとどまる)ことを試み、すべてのクラスターリソースを引き継ぐこと、および他のノードを頭の中で撃ちます。

あなたはおそらく今何が起こっているのかを推測することができます。 node1ssh root@node2 "shutdown -h now"を実行し、node2ssh 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 corosynccrm node fenceまたはstonith_admin -Fを使用してください。クラスター通信を切断すると、スプリットブレインシナリオが発生するだけで、データが破損する可能性があります。

21
daff

/etc/corosync/corosync.confのクォーラムセクションにauto_tie_breaker: 1を追加してみてください

ATBが有効になっている場合、クラスターは最大50%のノードで同時に障害が発生する可能性があります。クラスタパーティション、または最小のノードIDを持つノードとまだ接続しているノードのセットは、クォーレートのままです。他のノードは統合されます。

2
1mi

Pacemakerを使用してHAクラスターを確認します。 http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/index.html

0
user2028980

Pacemakerドキュメントの クォーラムと2ノードのクラスター の章を読んでみてください。

0
larsks