2つのノード(2つの物理サーバー)を持つWebアプリケーション用にHAクラスターをセットアップしています。
master
ノード)slave
ノード)Corosync&Pacemakerを使用して、クラスターと、IPフェイルオーバーやWebサーバー(Apache)を含むいくつかのリソースエージェントを作成することができました。
Failover
リソースは一度に1つのノードにのみ存在しますpythonスクリプトを使用して、IPフェイルオーバー先を更新するためにホスティングプロバイダーにAPI呼び出しを行います
WebServer
リソースは(クローンとして)利用可能なすべてのノードに存在しますApacheの
server-status
ハンドラーを使用する標準OCFリソース
Failover
とWebServer
は、サーバーが使用可能であると見なすために、サーバー上で同時に実行する必要があるという制約があります。次に、次のようなカスタムリソースエージェントを作成します(IPフェイルオーバーの場合と同様)。
理想的には、リソースは1つのノード(master)でのみ開始され、他のすべてのノード(スレーブ)で停止されます。 )。したがって、リソースを開始すると、現在のノードがmaster
モードになり、リソースを停止すると、slave
モードになります。
これらすべての操作を簡単に実行できるスクリプトを作成しました。仕組みは次のとおりです。
ローカルノードをmasterモードにします。
# /usr/local/bin/db_failover_switch.sh master
ローカルノードをスレーブモードにします。
# /usr/local/bin/db_failover_switch.sh slave 123.45.67.89
概要は非常に簡単に理解できます。私が直面している問題は、スレーブがMySQLおよびRedisサービスをそれに応じて構成するために、明らかにマスターIPを設定する必要があることです。
フェイルオーバーの場合、私は欲しいです:
node2
から始まり、master
ノードになりますnode1
で停止します。これはslave
ノードになりますリソースを停止する(つまり、スレーブモードに設定する)には、リソースが実行されているノードのIPアドレス(ホスト名で十分)を知る必要があります。
Pacemakerがリソースエージェントに渡す動的パラメーターを設定する方法はありますか?または、リソースエージェントスクリプトからクラスター情報を直接取得して、特定のリソースを実行しているノードを知ることはできますか?
あなたのコメントを読んだ後、あなたが最初に計画したそのルートにまだ行きたいかどうかはわかりませんが、とにかく、これに対する入力はここにあります:
crm_mon --group-by-node -1
を使用すると、ノードごとにグループ化された、クラスターの現在の状態の「1回限りの」ビューを取得できます。 -1
パラメータはこれを非対話型にします。つまり、データを表示してから終了するだけです。
(編集:たぶんcrm_mon -1
を使用すると、特定のケースでの解析がより簡単になります。)
この出力を解析して、それに応じて行動することができます。
(個人的なメモ:コメントで説明したルートも同様に進みます。結局、これらは2つのデーモンであるため、2つのリソースが妥当と思われます。また、使用するリソースエージェントが存在します。すでに。頑張ってください!)