Amazon LinuxでDRBDとHeartbeat 3.0.5を連動させる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

HeartbeatとPacemakerをインストールする

まずはインストールに必要なライブラリを事前にインストールします。

$ sudo vi /etc/yum.repos.d/CentOS-Base.repo
[centos-base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

$ sudo yum --enablerepo=centos-base install openhpi-libs.x86_64 -y

次にレポジトリとrpmのセットをダウンロードします。

$ sudo wget http://keihanna.dl.sourceforge.jp/linux-ha/56470/pacemaker-1.0.12-1.2.el6.x86_64.repo.tar.gz

$ sudo tar zxvf pacemaker-1.0.12-1.2.el6.x86_64.repo.tar.gz

$ sudo mv pacemaker-1.0.12-1.2.el6.x86_64.repo /tmp

$ cd /tmp/pacemaker-1.0.12-1.2.el6.x86_64.repo/

そしてインストール!

$ sudo yum -c pacemaker.repo install pacemaker.x86_64  heartbeat.x86_64 -y
...
Installed:
  heartbeat.x86_64 0:3.0.5-1.1.el6                 pacemaker.x86_64 0:1.0.12-1.el6                

Dependency Installed:
  OpenIPMI-libs.x86_64 0:2.0.16-12.7.amzn1          cluster-glue.x86_64 0:1.0.9-1.el6            
  cluster-glue-libs.x86_64 0:1.0.9-1.el6            gnutls.x86_64 0:2.8.5-4.6.amzn1              
  heartbeat-libs.x86_64 0:3.0.5-1.1.el6             libtasn1.x86_64 0:2.3-3.4.amzn1              
  libxslt.x86_64 0:1.1.26-2.6.amzn1                 pacemaker-libs.x86_64 0:1.0.12-1.el6         
  resource-agents.x86_64 0:3.9.3-1.el6             

Complete!

サクっと終わりました。

Heartbeatの設定をする

Heartbeatの設定ファイルは、/usr/share/doc/heartbeat-3.0.5にサンプルがありますのでコピーして編集します。

$ cd /usr/share/doc/heartbeat-3.0.5
$ sudo cp ha.cf /etc/ha.d/ha.cf 
$ sudo cp haresources /etc/ha.d/haresources
$ sudo cp authkeys /etc/ha.d/authkeys
$ sudo cp apphbd.cf /etc/logd.cf

ha.cfに基本的な設定を書きます。ucastには相手方(スレーブ)のIPアドレスを書きます。また、ノードとしてホスト名を列挙します。死活監視をするためのポート番号として694を指定していますので、AWS Management Console等でセキュリティグループの設定を忘れずに。

$ cd /etc/ha.d/
$ sudo vi ha.cf
crm             off
use_logd        yes
keepalive       1
deadtime        30
initdead        60
udpport         694
auto_failback   off
ucast           eth0 10.146.101.XXX
logfacility     none

node            ip-10-150-179-YYY
node            ip-10-146-101-XXX

authkeysは、rootユーザのみ修正できるようにchmodして編集します。

$ sudo vi authkeys
auth 1
1 crc

$ sudo chmod 600 authkeys

haresourcesは、リソースの設定をします。DRBDと連動する部分を書きます。自身のホスト名の後にリソースをスペース区切りで列挙してください。リソースの値は以前行ったDRBDに合わせてください。

ip-10-150-179-YYY drbddisk::drbd_res0 Filesystem::/dev/drbd0::/data::xfs

logd.cfは、ログに関する設定を記述します。

$ cd /etc/
$ sudo vi logd.cf
debug_level 0
debugfile       /var/log/apphbd.debug
logfile         /var/log/apphbd.log

サービスを起動を行ってみましょう。

$ sudo service logd start
Starting ha_logd: ok

$ sudo service heartbeat start
Starting High-Availability services: Done.

$ sudo service heartbeat status
heartbeat OK [pid 28720 et al] is running on ip-10-150-179-YYY [ip-10-150-179-YYY]...

うまく設定できたらしく起動してもエラーがでませんね。次に同じようにもう1台のインスタンスにインストールと設定をします。

Heartbeatを落としたら

さて、Heartbeatのプロセスを落としたときに、DRBDのマスター側はスレイブに切り替わるか見てみましょう。まずは、マスターとなるサーバーでDRBDをプライマリとして起動しておきます。また、マスターとスレーブの両方でHeartbeatも起動しておいてください。

フェイルオーバー前のマスター側

$ sudo service heartbeat status
heartbeat OK [pid 31987 et al] is running on ip-10-150-179-YYY [ip-10-150-179-YYY]...

$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6 
m:res        cs         ro                 ds                 p  mounted  fstype
0:drbd_res0  Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    xfs

フェイルオーバー前のスレーブ側

$ sudo service heartbeat status
heartbeat OK [pid 1189 et al] is running on ip-10-146-101-XXX [ip-10-146-101-XXX]...

$ sudo service drbd status                         
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6 
m:res        cs         ro                 ds                 p  mounted  fstype
0:drbd_res0  Connected  Secondary/Primary  UpToDate/UpToDate  C

そして、マスター側でHeartbeatを止めてみましょう!。スレーブからマスターに戻れるようにHeartbeatの起動は忘れずに。

フェイルオーバー後のマスター側

$ sudo service heartbeat stop
Stopping High-Availability services: Done.

$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6 
m:res        cs         ro                 ds                 p  mounted  fstype
0:drbd_res0  Connected  Secondary/Primary  UpToDate/UpToDate  C

$ sudo service heartbeat start
Starting High-Availability services: Done.

おお、スレーブのDRBDが昇格してプライマリとなっていますね。続けてスレーブ側で確認してみましょう。

フェイルオーバー後のスレーブ側

$ sudo service drbd status                         
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6 
m:res        cs         ro                 ds                 p  mounted  fstype
0:drbd_res0  Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    xfs

ちゃんと昇格していることを確認できました。ちなみに、リソースはHeartbeatが勝手に起動するのでchkconfigをOFFにしておくようにとのこと。んで、HeartbeatはONにしておきましょう。

$ sudo chkconfig drbd off 
$ sudo chkconfig heartbeat on

まとめ

今回は、Heartbeatを用いて何か問題があったときにマスターからスレーブに切り替える手法を学びました。特に、DRBDを組み合わせることで、同期レプリケーションされたデータを直ぐに使う事ができるようになり、より実務で使えそうになってきました。次回は、MySQLやPostgreSQLで試してみたいと思います。今日から君もオレオレRDSを作ろう!

参考資料

Amazon LinuxでDRBDを構築する

今回のお題 - heartbeat でいろんなサービスを冗長化する

DRBDとHeartbeat [2] インストールから起動まで

第2回 Pacemakerをインストールしてみよう![構築基本編]

AWS上のAsteriskサーバをHeartbeat+Pacemakerで冗長化