AWS上のZabbixをPacemakerで冗長化 その1(RDS編)

| コメントをどうぞ

前回はAWS上のZabbixを冗長化する方法を、

● Pacemaker + RDS
● Pacemaker + DRBD
● Pacemaker + MySQLレプリケーション

の3つパターンで紹介しました。ここから3回に分けて実際に設定していきます。1回目は「Pacemaker + RDS」 を設定していきます。各冗長方式の違いは前回を参照してください。OSはCentOS6を使用します。

個人的にはこの方式が一番しっくり来ます。AWSのRDSを採用しているので実装後の運用面において効率が良いです。フェイルオーバーにかかる時間が一番長いという欠点も数分長くかかるという程度ですので。

PacemakerでZabbixを冗長化するのに用意するもの

● Pacemaker及びheartbeatのパッケージ
● ApacheのLSB
● ZabbixのLSB
● SwatchのLSB
● 上記のクラスタを制御する為のcib.xml

Apache等のメジャーなものはOCFに標準で用意されていますのでそちらを使っても結構です。ただ、ZabbixのOCFが無いのでLSBを作成する関係上ついでにApacheもLSBで作ってしまえ!統一感だせるし。という事で全部LSBにします。OCFも頑張れば作成出来ますが、圧倒的にLSBの方が作成しやすいです。(理由は後述)

LSBって?

Linux Standard Baseの略。Linuxの標準のinitスクリプトを用いて冗長化が可能なリソースエージェントです。(OCFもリソースエージェント)
OCFは専用?の書式で書いてある為作成の難易度は高いですが、LSBであれば普段Linuxを触っている方なら馴染みも深いので作成が容易です。initスクリプトで冗長化を行えるので、initスクリプトで制御しているデーモンはわざわざ作成しなくても即冗長化出来ます。(多少修正しないとならない場合もあります。)
initスクリプト経由で起動しないデーモンでもinitスクリプトで制御するようにすれば冗長化出来ますし、デーモン以外のプロセスでもinitスクリプト作成してしまえば冗長化出来きます。

というものがLSBですのでメジャーじゃないデーモンを冗長化したかったり自分でいろいろ設定してみたいという方たちにはお勧めのリソースエージェントです。OCFの方が多機能な場合が多いのですが、普段見慣れてるinitスクリプトで冗長化出来てしまうのですから。

OCFは/usr/lib/ocf/resource.dの下にありますので冗長化を行う時は確認してある場合は使う。無い場合はLSB作成する。というのが良いと思います。(OCFのリスト一覧表示コマンドをつかっても見れます。)

● 現在のOCFを表示

# ls
AoEtarget     Raid1               conntrackd        nginx
AudibleAlarm  Route               db2               oracle
CTDB          SAPDatabase         dhcpd             oralsnr
ClusterMon    SAPInstance         eDir88            pgsql
Delay         SendArp             ethmonitor        pingd
Dummy         ServeRAID           exportfs          portblock
EvmsSCC       SphinxSearchDaemon  fio               postfix
Evmsd         Squid               iSCSILogicalUnit  pound
Filesystem    Stateful            iSCSITarget       proftpd
ICP           SysInfo             ids               rsyncd
IPaddr        VIPArip             iface-bridge      rsyslog
IPaddr2       VirtualDomain       iface-vlan        scsi2reservation
IPsrcaddr     WAS                 iscsi             sfex
IPv6addr      WAS6                jboss             slapd
LVM           WinPopup            ldirectord        symlink
LinuxSCSI     Xen                 lxc               syslog-ng
MailTo        Xinetd              mysql             tomcat
ManageRAID    anything            mysql-proxy       varnish
ManageVE      apache              named             vmware
Pure-FTPd     asterisk            nfsserver         zabbixserver

・・・zabbixserver・・・? いつの間に・・・。前回ブログ書いた時点で一通りLSB作ってしまった後に気づきました。。
調べてみると2012年にzabbixserverのOCFが追加されたようです。

せっかくだから作ったLSB使って冗長化していきます。。

Pacemakterのインストール

まずは冗長化してくれるPacemakerをインストールします。バージョンによってクラスタ制御(切替など)コマンドがうまく動かないものがありますので正常動作が確認とれているバージョンを入れます。yumで入れると最新バージョンが入ってしまう為、Linux-HAからリポジトリをダウンロードしてインストールします。本ブログではAWS上のZabbixの冗長化に焦点をあてるのでPacemakerの設定方法についての説明は最小限の内容になっています。

※ Linux-HAのサイトを見ればかなり詳細レベルの説明や導入方法が見ます。

● Linux-HAのリポジトリダウンロードURL

http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Flinux-ha%2F60151%2Fpacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz

● Pacemakerのインストール(/tmpで作業します)
※ クラスタ対象のインスタンス両方に実施します。

# tar zvxf pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz
# mv pacemaker-1.0.13-1.2.el6.x86_64.repo/ /tmp/
# cd /tmp
# yum -c pacemaker.repo install heartbeat-3.0.5 pacemaker-1.0.13 pm_extras-1.3 heartbeat-devel.x86_64 -y

heartbeatの設定
※ クラスタ対象のインスタンス両方に実施します。

起動はheartbeatから行うのでheartbeatの設定をしていきます。設定ファイルのひな形をコピーして設定し、クラスタ間で通信する時の認証鍵も作成します。

● 設定のひな形コピーと鍵作成の設定

# cd /etc/ha.d
# cp /usr/share/doc/heartbeat-3.0.5/ha.cf ./
# vi authkeys
---------
auth 1
1 sha1 'パスワード'
---------
# chmod 600 authkeys

● heartbeat設定ファイル編集

# vi ha.cf
---------
crm yes   ← アプリケーションレベルで制御可能にする(クラスタリソースマネージャを有効)
logfacility local1 ← ログをsyslogに送る(rsyslog.confにha-logの設定も必要)
keepalive 3
deadtime 30
deadping 40
warntime 10
initdead 60
udpport 694
node HOST-1 ← クラスタを組むインスタンス名
node HOST-2 ← クラスタを組むインスタンス名
# The cluster nodes communicate on their heartbeat lan (.68.*) interfaces
ucast eth0 XX.XX.XX.XX ← クラスタを組むインスタンスのIP(相互監視用)
ucast eth0 XX.XX.XX.XX ← クラスタを組むインスタンスのIP(相互監視用)
uuidfrom nodename ← 識別する情報UUIDをノード名から生成
---------

● syslog設定ファイル編集

# vi /etc/rsyslog.conf
---------
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
local1.*                                                /var/log/ha-log  ← 追記
---------
# /etc/init.d/rsyslogd restart

LSBの作成

LSB対応のinitスクリプトを作成します。LSB対応には以下の要件があります。

  1. start,stop,statusが実行出来る事
  2. start,stop実行時に成功した場合は「0」を返す事
  3. status実行時に正常な場合は「0」、異常な場合は「3」を返す事

Pacemakerはinitスクリプトのstart/stopを実行して戻り値で成否を判別し、status実行でリソースの状態を監視します。
大抵のinitスクリプトは特に手を加えなくてもこの動きをしてくれますのでそのまま使える場合が多いです。

※ LSBの仕様についてはLinux-HAに詳しく書いてあります。

● ApacheのLSB作成

Apacheのinitスクリプトは若干修正しないと正常動作しないので修正します。修正箇所はstatusの部分だけで行けます。

  status)
  #      status -p ${pidfile} $httpd ← コメントアウト
        status $httpd ← 追記
        RETVAL=$?

● zabbix_serverのLSB作成

こちらも若干修正が必要になります。修正後のファイルはここからダウンロードします。

● swatchのLSB作成

swatchを使う理由ですが、Multi-AZにしたRDSがフェイルオーバーするとZabbixが処理を停止してしまうがプロセスは上がったままなのでPacemakerもZabbixは正常と見えてしまいフェイルオーバーしてくれないので、swatchでZabbixのログ監視を行いRDSのフェイルオーバーを検知したらZabbixを再起動かける為に使います。

※ swatchの導入はepelリポジトリのyumで入るのであらかじめ導入しておきます。

RDSフェイルオーバー時にzabbix_serer.logに以下のログがかならず出ます(今のところ)

watchdog: database is down

swatchでこのログを検知したらzabbix_serverの再起動で監視を継続させます。

swatchはinitスクリプト経由で起動/停止するものではないので1から作成します。ここからダウンロードします。

● swatch動作用の設定
以下のswatchの設定ファイルを/etc/zabbixの下に作成します。

watchfor /watchdog: database is down/
        exec "/etc/rc.d/init.d/zabbix_server restart"

cib.xmlの作成

残りはPacemakterのクラスタ制御のcib.xml作成です。/var/lib/heartbeat/crmの下にcib.xmlの名前でファイルを作成します。ここからダウンロードします。

※ 「node id」等の作成する環境によって変わる部分は自動生成されるので初回起動時に上書きされます。
※ リソースの死活監視の間隔は10秒に設定しています。パラメーターの意味の説明はここでは省略します。公式サイトを
  参照してください。
※ スプリットブレイン対策のstonithはAWSなので実施しません。
※ 稼働系が故障した後に復旧したら自動でフェイルバックする設定となっています。

とりあえずこれで動く状態になりました。まずは動くところを見てそこから自分好みの設定に変えて運用して下さい。

heatbeat(pacemaker)の起動

まずは動かしてみます。以下のコマンドで起動します。

# /etc/init.d/heartbeat start

以下のコマンドでクラスタの状態を確認します。

# crm_mon -i1 ← 1秒間隔でステータス表示更新

Online: [ HOST-1 HOST-2 ]

 Resource Group: zabbixcluster
     apache     (lsb:httpd):    Started HOST-1
     zabbix_server      (lsb:zabbix_server):    Started HOST-1
     swatch     (lsb:swatch):   Started HOST-1

Zabbixを停止させて障害を起こしてみます。

# /etc/init.d/zabbix_server stop

Online: [ HOST-1 HOST-2 ]

 Resource Group: zabbixcluster
     apache     (lsb:httpd):    Started HOST-2
     zabbix_server      (lsb:zabbix_server):    Started HOST-2
     swatch     (lsb:swatch):   Started HOST-2

Failed actions:
    zabbix_server_monitor_10000 (node=HOST-1, call=17, rc=7, status=com
plete): not running

稼働系で障害が発生して待機系がサービスを引き継いだのがわかります。他のデーモン(apache、swatch)でも切り替わるかテストします。RDSの場合はAWSコンソールからフェイルオーバーさせてZabbixが再起動されて動き続けるのを確認します。

ELBへの登録

この状態ではインスタンス間で冗長されてはいるものの、ブラウザでのアクセスは出来ない為、動いていないのと同じような状態です。オンプレミスではVIPをつけて稼働/待機で移動させてVIPにアクセスで問題ありませんがAWSではマルチキャストを通さない為VIPではなくELBに稼働/待機を80ポートのヘルスチェックで登録する事により冗長が完成します。

次回は「Pacemaker + DRBD」 を使ってZabbixを冗長化をやってききたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>