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を要件に合わせてチョイスできるとよいでしょう。

  1. 2014年 5月 27日
  2. 2014年 6月 3日

コメントを残す