PacemakerでEIPを付替えるResource Agentを書いてみた

3回目のPacemaker on AWSネタです。

今回は、AWSクラウドデザインパターンFloating IPパターンを実現するために、PacemakerでEIPを付替えるRA(Resource Agent)を書いてみました。

aws-eip-resource-agentという名前でGithubに置いておきました。
例によってバグ報告、Pull Request、大歓迎です。

ちなみに過去のPacemakerネタはこちら。

以下で詳細について説明していきます。

eip_after_fo


環境

今回使用したのは下記のインスタンスです。

  • Red Hat Enterprise Linux 6.5 (PV) 64bit (t1.micro)

Pacemakerパッケージとしては、過去2回と同様、Linux-HA Japan提供のPacemaker 1.0.13-1.2を使用しています。
他のOS、他のversionでも動作すると思いますが、テストしていません。


セットアップ

まず、クラスタを構成する各インスタンスにawscli(AWS Command Line Interface)をインストールします。
awscliのインストールにはpipが必要なので、先にpipをインストールしておきましょう。

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py

awscliをインストールします。

pip install awscli

各インスタンスからAWSにアクセスできるように、必要に応じてアクセス設定をしておきます。

aws configure

aws-eip-resource-agentのリポジトリから各インスタンスにeip resource agentをDownloadまたはCloneします。

git clone https://github.com/moomindani/aws-eip-resource-agent.git
cd aws-eip-resource-agent

eip resource agentをインストールします。

mv eip /usr/lib/ocf/resource.d/heartbeat/
chown root:root /usr/lib/ocf/resource.d/heartbeat/eip 
chmod 0755 /usr/lib/ocf/resource.d/heartbeat/eip

Pacemakerは下記の記事をもとに、あらかじめセットアップして起動しておきます。
今回はCorosyncで設定しました。

Floating IPとして使うのEIPはあらかじめマネジメントコンソールから作成しておきましょう。
ちなみに、今回は54.178.202.118でした。

Pacemakerのcrmのconfigを作成しましょう。
今回はこんな感じのcrmファイルを用意しました。

eip-sample.crm

property \
    no-quorum-policy="ignore" \
    stonith-enabled="false" \
    crmd-transition-delay="0s"

primitive eip ocf:heartbeat:eip \
    params \
        elastic_ip="54.178.202.118" \
    op start   timeout="60s" interval="0s"  on-fail="stop" \
    op monitor timeout="60s" interval="10s" on-fail="restart" \
    op stop    timeout="60s" interval="0s"  on-fail="block"

設定を反映します。

crm configure load update eip_sample.crm

動作確認

では、eip resource agentがどうなっているのか、crm_monコマンドで確認していきましょう。

# crm_mon -f1
============
Last updated: Sat May 10 05:26:41 2014
Stack: openais
Current DC: ip-172-31-8-160.ap-northeast-1.compute.internal - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ ip-172-31-0-7.ap-northeast-1.compute.internal ip-172-31-8-160.ap-northeast-1.compute.internal ]

 eip	(ocf::heartbeat:eip):	Started ip-172-31-0-7.ap-northeast-1.compute.internal

Migration summary:
* Node ip-172-31-0-7.ap-northeast-1.compute.internal: 
* Node ip-172-31-8-160.ap-northeast-1.compute.internal: 

このように、2台のクラスタノード(172.31.0.7と172.31.8.160)のうち、172.31.0.7側にEIPが付与されていることがわかります。
図にするとこんな感じです。

eip_before_fo

ちなみに、マネジメントコンソールからみてみると、こんな感じになっていました。

before failover

では、172.31.0.7側のpacemakerをdownさせ、eip resourceが172.31.8.160側にフェイルオーバーし、EIPが172.31.0.7から172.31.8.160に付け替えらることを確認します。

service corosync stop

crm_monコマンドで状態を確認します。

# crm_mon -f1
============
Last updated: Sat May 10 05:31:57 2014
Stack: openais
Current DC: ip-172-31-8-160.ap-northeast-1.compute.internal - partition WITHOUT quorum
Version: 1.0.13-30bb726
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ ip-172-31-8-160.ap-northeast-1.compute.internal ]
OFFLINE: [ ip-172-31-0-7.ap-northeast-1.compute.internal ]

 eip	(ocf::heartbeat:eip):	Started ip-172-31-8-160.ap-northeast-1.compute.internal

Migration summary:
* Node ip-172-31-8-160.ap-northeast-1.compute.internal: 

このように、172.31.8.160側にEIPが付け替えられたことがわかります。
図にするとこんな感じです。
eip_after_fo

ちなみに、マネジメントコンソールからみてみると、こんな感じになっていました。

after failover

フェイルオーバー前後のpingの結果はこんな感じでした。

# ping 54.178.202.118
64 bytes from 54.178.202.118: icmp_seq=67 ttl=51 time=19.780 ms
64 bytes from 54.178.202.118: icmp_seq=68 ttl=51 time=22.392 ms
64 bytes from 54.178.202.118: icmp_seq=69 ttl=51 time=21.749 ms
Request timeout for icmp_seq 70
Request timeout for icmp_seq 71
Request timeout for icmp_seq 72
Request timeout for icmp_seq 73
Request timeout for icmp_seq 74
64 bytes from 54.178.202.118: icmp_seq=75 ttl=50 time=19.477 ms
64 bytes from 54.178.202.118: icmp_seq=76 ttl=50 time=21.672 ms
64 bytes from 54.178.202.118: icmp_seq=77 ttl=50 time=22.597 ms
64 bytes from 54.178.202.118: icmp_seq=78 ttl=50 time=22.260 ms
64 bytes from 54.178.202.118: icmp_seq=79 ttl=50 time=22.618 ms

おわりに

EIPの付け替えはコマンドで簡単にできますが、Resource Agentの形式にすることでPacemakerからのコントロールが簡単になるかと思います。
よかったらお試しください。

参考:
Heartbeat(Pacemaker)でEIPの付け替え – suz-lab – blog

  1. 2014年 6月 3日
  2. 2014年 7月 14日

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。