EC2上でPacemakerによる2ノードHAクラスタを構築する(Corosync編)
前回はPacemaker(Heartbeat)で2ノードHAクラスタを構築しました。
前回説明したとおり、Pacemakerを使う場合、2種類の組み合わせがあります。
- Pacemaker + Heartbeat
- Pacemaker + Corosync
今回は後者のPacemaker + Corosyncの構成で、(前回と同等の)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.15.101, node:ip-172-31-15-101, az:ap-northeast-1a
IP:172.31.27.99, node:ip-172-31-27-99, az:ap-northeast-1c
インストール
あらかじめ、Pacemakerに必要な依存パッケージをインストールしておきます。
yum install OpenIPMI libtool-ltdl perl-TimeDate net-snmp openhpi
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
後片付けということで、yumレポジトリを元に戻します。
cd /etc/yum.repos.d/ rename .repo.tmp .repo *.repo.tmp
これでPacemaker(Corosync)のインストールは終わりです。
セットアップ
次に、Pacemaker+Corosyncをセットアップしていきます。
ここでEC2(VPC)特有の大事なネットワーク制約として、「マルチキャストをサポートしない」制約があります。
Pacemaker(Corosync)はクラスタ通信にUDPマルチキャスト通信を使用する設定が一般的なので、セットアップ時にはUDPマルチキャストではなくUDPユニキャストを使うように十分注意する必要があります。
Pacemaker(Corosync)のセットアップでは、下記の2つの設定ファイルを作成します。
- corosync.conf
- authkey
それぞれ見ていきましょう。
corosync.conf
設定ファイルのテンプレートがあるのでコピーしてきます。
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
※UDPユニキャストを使う設定テンプレートとして、/etc/corosync/corosync.conf.example.udpuが用意されていますので、お好みでこちらもどうぞ。
corosync.confを開いて編集します。
ここで、クラスタ通信にはUDPマルチキャストではなくUDPユニキャストを使用するよう、interfaceにmember(memberaddr)を、totemにtransport: udpuを追加して指定します。
当然、member、transportを指定せずにmcastaddr、mcastportを指定してUDPマルチキャストを使うと、EC2(VPC)上では正しく動作しないのでご注意を。
aisexec { user: root group: root } service { name: pacemaker ver: 0 } totem { (中略) interface { ringnumber: 0 (中略) member { memberaddr: 172.31.15.101 } member { memberaddr: 172.31.27.99 } bindnetaddr: 172.31.15.101 #mcastaddr: 239.255.1.1 (中略) } transport: udpu }
mcastaddrは使用しないのでコメントアウトしておきます。
ただし、mcastportはコメントアウトするとエラーになってしまうのでそのまま残しておきます。
デフォルトから上記を追加/変更するだけでOKです。
ちなみに、設定ファイルのフルバージョンはGistに置いておきました。
なお、UDPユニキャストを使う場合、UDPマルチキャストを使う場合と同じようにbindnetaddrにネットワークアドレスを指定すると、下記のようなエラーメッセージが出てTOTEMの送信に失敗するようです。
(2014/4/30 10:30追記 2つのインスタンスがそれぞれ異なるAZ、異なるSubnetに配置されている状態で、リーチできないネットワークアドレスを指定していたため通信失敗しただけでした。。ネットワーク的にリーチできるネットワークアドレスを指定するか、自身のIPアドレスを指定するとよいでしょう。)
Apr 27 23:15:05 corosync [MAIN ] Totem is unable to form a cluster because of an operating system or network fault. The most common cause of this message is that the local firewall is configured improperly.
今回は、それぞれのノードでbindnetaddrに自身のIPアドレスを設定しておきます。
authkey
下記のコマンドを実行して何度かキー入力を繰り返すと、/etc/corosync/authkeyが自動生成されます。
corosync-keygen
このファイルをもう一方のノードにもコピーしておきます。
適切なパーミッションを設定します。
chmod 0400 /etc/corosync/authkey
その他
UDP 5405, 5404の通信がノード間で互いに疎通可能となるように、セキュリティグループ、iptablesでケアしておきます。
SELinuxは無効化しておきます。
(2014/4/30 10:30追記 SELinuxはpermissiveまたはdisabledであれば問題ありません。enforcingだと正しく動作しないようです。)
以上でセットアップは終わりです。
動作確認
では、早速動作確認してみましょう。
それぞれのノードでPacemaker(Corosync)を起動します。
service corosync start
いずれかのノードでcrm_monコマンドを実行してクラスタの状態を確認します。
crm_mon -1 ============ Last updated: Tue Apr 29 04:21:30 2014 Stack: openais Current DC: ip-172-31-15-101.ap-northeast-1.compute.internal - partition with quorum Version: 1.0.13-30bb726 2 Nodes configured, 2 expected votes 0 Resources configured. ============ Online: [ ip-172-31-15-101.ap-northeast-1.compute.internal ip-172-31-27-99.ap-northeast-1.compute.internal ]
ip-172-31-15-101, ip-172-31-27-99の2つのノードからなるHAクラスタを起動できたことがわかりました。
おわりに
今回は、EC2上でPacemaker(Corosync)による2ノードHAクラスタを構築してみました。
前回のHeartbeat編と併せて、Heartbeat or Corosyncを要件に合わせてチョイスできるとよいでしょう。