EC2上でPacemakerによる2ノードHAクラスタを構築する(Heartbeat編)

今回はAWS上のHAについて考えます。
AWSクラウドデザインパターンにもありますが、AWS上で最もよく使われる可用性向上のための構成は、ELBでアクセスを複数サーバに振り分けるMulti-Serverパターンでしょう。
WEBサーバ等ならこれでOKなのですが、使いたいソフトウェアによってはマッチしない場合があります。
このような場合、EC2上でHAミドルを使うことで要望を実現できたりします。

今回はAmazon EC2上で、2ノードHAクラスタを構築してみます。
HAミドルとして広く使用されているPacemakerを使用します。

Pacemakerのクラスタ制御には、HeartbeatあるいはCorosyncが使用されます。
つまり、Pacemakerを実際に使う場合、2種類の組み合わせがあります。

  • Pacemaker + Heartbeat
  • Pacemaker + Corosync

今回は前者のPacemaker + Heartbeatの構成で、2ノードHAクラスタを構築してみます。


環境

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

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

Pacemakerパッケージとしては、Linux-HA Japan提供のPacemaker 1.0.13-1.2を使用します。
(本家のパッケージでもいいですが、使い慣れてるのがこちらなので。)

2台のインスタンスのIPアドレス、ノード名はそれぞれ下記とします。
IP:172.31.21.48, node:ip-172-31-21-48
IP:172.31.21.49, node:ip-172-31-21-49


インストール

あらかじめ、Pacemakerに必要な依存パッケージをインストールしておきます。

yum install OpenIPMI libtool-ltdl perl-TimeDate net-snmp openhpi PyXML

Linux-HA Japan提供のPacemakerはローカルyumリポジトリとして使用できるのですが、
ここで他のyumリポジトリが参照できてしまうと競合してしまいます。
そこで、依存パッケージのインストールが終わったら、使わないyumリポジトリをいったん除外します。
(後で元に戻せばオールオッケーです。)

cd /etc/yum.repos.d/
rename .repo .repo.tmp *.repo

早速、Pacemakerをインストールしましょう。
Linux-HAからPacemakerパッケージをダウンロードして/tmpに配置し、下記のコマンドを実行します。

cd /tmp
tar -zxvf pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz
cd pacemaker-1.0.13-1.2.el6.x86_64.repo
yum -c pacemaker.repo install pacemaker heartbeat

後片付けということで、yumレポジトリを元に戻します。

cd /etc/yum.repos.d/
rename .repo.tmp .repo *.repo.tmp

これでPacemaker(Heartbeat)のインストールは終わりです。


セットアップ

次に、Pacemaker+Heartbeatをセットアップしていきます。
ここでEC2(VPC)特有の大事なネットワーク制約として、「マルチキャストをサポートしない」制約があります。
Pacemaker(Heartbeat)はクラスタ通信にUDPマルチキャスト通信を使用する設定が一般的なので、セットアップ時にはUDPマルチキャストではなくUDPユニキャストを使うように十分注意する必要があります。

Pacemaker(Heartbeat)のセットアップでは、下記の3つの設定ファイルを作成します。

  • ha.cf
  • authkeys
  • haresources

それぞれ見ていきましょう。

ha.cf

設定ファイルのテンプレートがあるのでコピーしてきます。

cp /usr/share/doc/heartbeat-3.0.5/ha.cf /etc/ha.d/

ha.cfを開いて編集します。
ここで、クラスタ通信にはUDPマルチキャストではなくUDPユニキャストを使用するよう、ucastディレクティブを指定します。
当然、mcastディレクティブを指定してUDPマルチキャストを使うと、EC2(VPC)上では正しく動作しないのでご注意を。
ちなみに、nodeにはuname -nで得られるノード名を指定します。
/etc/hostsで名前解決できるようにしておきましょう。

pacemaker on
ucast eth0 172.31.21.48
ucast eth0 172.31.21.49
node    ip-172-31-21-48
node    ip-172-31-21-49

デフォルトから上記を追加/変更するだけでOKです。
ちなみに、設定ファイルのフルバージョンはGistに置いておきました。

authkeys

設定ファイルのテンプレートがあるのでコピーしてきます。

cp /usr/share/doc/heartbeat-3.0.5/authkeys /etc/ha.d

authkeysを開いて編集します。
3種類の認証方法を選択可能です。今回は最も安全なsha1を選択しておきます。
ちなみに、sha1の後の文字列には2ノードで共通の文字列を指定します。(今回は動けばいいので変更しません。)

auth 2
#1 crc
2 sha1 HI!
#3 md5 Hello!

適切なパーミッションを設定します。

chmod 600 /etc/ha.d/authkeys

haresources

設定ファイルのテンプレートがあるのでコピーしてきます。

cp /usr/share/doc/heartbeat-3.0.5/haresources /etc/ha.d/

今回はHAクラスタを構築するだけで個別のリソース制御は行わないので、このファイルは変更しません。

その他

UDP 694の通信がノード間で互いに疎通可能となるように、セキュリティグループ、iptablesでケアしておきます。

以上でセットアップは終わりです。


動作確認

では、早速動作確認してみましょう。
それぞれのノードでPacemaker(Heartbeat)を起動します。

service heartbeat start

いずれかのノードでcrm_monコマンドを実行してクラスタの状態を確認します。

crm_mon -1
============
Last updated: Wed Apr 23 08:58:54 2014
Stack: Heartbeat
Current DC: ip-172-31-21-49 (a60fc438-ac7a-4c94-8f4c-21d05fe4bc6f) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ ip-172-31-21-48 ip-172-31-21-49 ]

ip-172-31-21-48, ip-172-31-21-49の2つのノードからなるHAクラスタを起動できたことがわかりました。

ちなみに、crm_monコマンドで1ノード分の情報しか出力されない場合、クラスタ通信の疎通がとれていないなど、セットアップのどこかでミスしている可能性が高いです。
ログ等から調査し、設定内容を修正することで意図したとおりに動作するかと思います。
また、Linux-HA JapanコミュニティのMLで聞いてみるのもいいかもしれません。(すごく丁寧な回答がやりとりされている印象です。)


おわりに

今回は、EC2上でPacemaker(Heartbeat)による2ノードHAクラスタを構築してみました。
可用性向上についてはAWS上のサービスだけで十分対応できる場合も多いですが、このようにHAミドルを使う選択肢も踏まえることで、アーキテクチャの自由度が上がるかと思います。

広告
  1. 2014年 4月 29日
  2. 2014年 5月 27日
  3. 2014年 6月 3日

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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