web-dev-qa-db-ja.com

マスターノードをスレーブに降格するときに、特定のリソースを実行しているノードのIPを取得します

セットアップ

2つのノード(2つの物理サーバー)を持つWebアプリケーション用にHAクラスターをセットアップしています。

  • node1(現在のmasterノード)
  • node2(現在のslaveノード)

Corosync&Pacemakerを使用して、クラスターと、IPフェイルオーバーやWebサーバー(Apache)を含むいくつかのリソースエージェントを作成することができました。

リソース

  • Failoverリソースは一度に1つのノードにのみ存在します

pythonスクリプトを使用して、IPフェイルオーバー先を更新するためにホスティングプロバイダーにAPI呼び出しを行います

  • WebServerリソースは(クローンとして)利用可能なすべてのノードに存在します

Apacheのserver-statusハンドラーを使用する標準OCFリソース

制約

  • FailoverWebServerは、サーバーが使用可能であると見なすために、サーバー上で同時に実行する必要があるという制約があります。

問題

次に、次のようなカスタムリソースエージェントを作成します(IPフェイルオーバーの場合と同様)。

  • 現在のスレーブノードのmysqlインスタンスをマスターノードに切り替えます
  • 現在のマスターノードのmysqlインスタンスを新しいマスターノードのスレーブノードに切り替えます
  • 基本的にRedisインスタンスについても同じことを行います

理想的には、リソースは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を設定する必要があることです。

TL; DR

フェイルオーバーの場合、私は欲しいです:

  • リソースはnode2から始まり、masterノードになります
  • リソースはnode1で停止します。これはslaveノードになります

リソースを停止する(つまり、スレーブモードに設定する)には、リソースが実行されているノードのIPアドレス(ホスト名で十分)を知る必要があります。

Pacemakerがリソースエージェントに渡す動的パラメーターを設定する方法はありますか?または、リソースエージェントスクリプトからクラスター情報を直接取得して、特定のリソースを実行しているノードを知ることはできますか?

2
Jordan Becker

あなたのコメントを読んだ後、あなたが最初に計画したそのルートにまだ行きたいかどうかはわかりませんが、とにかく、これに対する入力はここにあります:

crm_mon --group-by-node -1を使用すると、ノードごとにグループ化された、クラスターの現在の状態の「1回限りの」ビューを取得できます。 -1パラメータはこれを非対話型にします。つまり、データを表示してから終了するだけです。

編集:たぶんcrm_mon -1を使用すると、特定のケースでの解析がより簡単になります。)

この出力を解析して、それに応じて行動することができます。

(個人的なメモ:コメントで説明したルートも同様に進みます。結局、これらは2つのデーモンであるため、2つのリソースが妥当と思われます。また、使用するリソースエージェントが存在します。すでに。頑張ってください!)

1
gf_