HeartBeatとElastic IPを使用した冗長化構成をテストする

記事タイトルとURLをコピーする

こんちには! インフラエンジニアの柳瀬です! AWSにはElastic Load BalancerやRDSのMulti-AZなど冗長化を構成する上で便利な機能が盛り込まれています。
今回は英語版のフォーラムで紹介されているElastic IPとHeartBeatを使用した冗長化を試してみました。 今回テストを行った環境は以下の通りです。

  • Ubuntu 10.04 LTS
  • HeartBeat 3.0.3

それでは環境を用意しましょう。これから記載する設定はHAを構成するノードそれぞれで行ってください。
まずはそれぞれのUbuntuにHost名を定義します。

$ vi /etc/hostname
  1 heartbeat01

次にHeartBeatをインストールして設定を行います。

$ sudo apt-get install heartbeat

$ sudo vi /etc/ha.d/ha.cf
  1 logfile         /var/log/heartbeat.log
  2 node            heartbeat01 heartbeat02
  3 keepalive       1
  4 deadtime        10
  5 ucast           eth0 10.150.170.180 #internal IP of the peer
  6 auto_failback   no

$ sudo i /etc/ha.d/haresources
  1 heartbeat01 elastic-ip

$ sudo vi /etc/ha.d/authkeys
  1 auth 1
  2 1 sha1 yourpassword

Elastic IPの付け替えのスクリプトに使用しているツールをインストールします。

$ curl https://raw.github.com/timkay/aws/master/aws -o aws
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 76826  100 76826    0     0  43721      0  0:00:01  0:00:01 --:--:-- 80869

$ sudo mv ./aws /usr/local/bin/
$ chmod +x /usr/local/bin/aws

$ vi .awssecret
  1 YOURACCESSID
  2 YOURSECRETACCESSKEY

$ chmod 600 .awssecret
$ sudo cp .awssecret /root/

$ aws describe-addresses --region ap-northeast-1
+---------------+------------+
|   publicIp    | instanceId |
+---------------+------------+
| 111.12.123.12 | i-xxxxxxxx |
| 111.21.210.21 |            |
+---------------+------------+

最後にElastic IPのつけかえを行っているスクリプトを用意します。
※例では東京リージョンを指定していますが、こちらはそれぞれの環境で変更してください

$ sudo vi /etc/init.d/elastic-ip
  1 #!/bin/bash
  2
  3
  4 MY_ID="i-6efaef6f" # different for each node
  5 ELASTIC_IP="176.32.87.217"
  6 REGION="ap-northeast-1"
  7
  8 case $1 in
  9     start)
 10         aws associate-address "$ELASTIC_IP" -i "$MY_ID" --region "$REGION" > /dev/null
 11         echo $0 started
 12         ;;
 13     stop)
 14     aws disassociate-address "$ELASTIC_IP" --region "$REGION" > /dev/null
 15         echo $0 stopped
 16         ;;
 17     status)
 18     aws describe-addresses --region "$REGION" | grep "$ELASTIC_IP" | grep "$MY_ID" > /dev/null
 19     # grep will return true if this ip is mapped to this instance
 20     [ $? -eq 0 ] && echo $0 OK || echo $0 FAIL
 21     ;;
 22 esac

$ chmod +x /etc/init.d/elastic-ip

最後にHeartBeatを実行して準備完了です。

$ sudo /etc/init.d/heartbeat start

動作確認として以下のようにHeartBeat01のHeartBeatを停止してみると、無事にElastic IPが02に移動しています。

$ sudo /etc/init.d/heartbeat stop

これはあくまでHeartBeatを使用してElastic IPを付け替えるだけなので実際にはデータはS3に外出ししたり、lsyncdなどのツールでサーバ間で同期をとるなどの設計が必要です。
今回は通常のEC2インスタンスで実験を行いましたが、ローカルIPが固定出来てElastic Load Balancerが使えないVPCとかではニーズがありそうですね。