このエントリーをはてなブックマークに追加

Pacemaker

概要

Pacemakerは、IPアドレスやアプリケーションのフェイルオーバーを行いサービスの可用性を向上するHA(High Availability)クラスタを実現するソフトウェアです。
Heartbeatのバージョン3へのアップデートでクラスタリソースマネージャ(CRM)機能が独立しPacemakerとして分離しました。
そのためPacemaker単体ではHigh Availabilityを実現することは出来ません。
組み合わせとしてはPacemaker+Corosync、Pacemaker+Heartbeat3といった構成になります。
また将来的にはCorosyncとの組み合わせに移行していく流れらしいです。
しかしうまくプロセスが停止しないとか結構面倒なのでHeartbeatを利用します。
データベースサーバの場合はクラスタ化を実現するためにPacemakerとDRBDやGlusterFS、もしくはNFSなど共有ディスクとの組み合わせで利用することが多いです。
WEBサーバなどで利用する場合よりデータベースサーバなど2台構成で利用することが多いかもしれません。
予めリソースエージェントが多数用意されていますので自身で作成しなくてもすぐに利用可能です。
リソースエージェントとは、リソースの監視を行うためのテンプレートが設定されているスクリプトのことです。

冗長構成

基本構成は運用系と待機系で構成する1+1構成です。 複数台(N)の運用系ノードに対し待機系ノードも複数台(M)にするN+M構成を構築する事も可能です。 ここでは基本構成を設定します。

インストール

インストールは構成サーバ全てのサーバで行います。
インストール自体どのようなサービスを冗長化するのかには関係なく同じ方法です。

パッケージをインストール

Ubuntuの場合は、RedHat系と違い標準リポジトリにあるもので問題ありません。
$ sudo apt-get install pacemaker corosync cluster-glue resource-agents -y

自動起動設定のオフ

corosyncとpacemakerは自動起動になってませんので変更の必要がありません。
ここで自動起動をオフにする意味は障害が発生したノードが起動してきた場合にクラスタに自動参加しておかしな状態にならないようにする為です。
# chkconfig heartbeat off

Heartbeatの設定

heartbeatを利用するためには以下の4ファイルを設定する必要があります。
但し、最初に作成する必要があるファイルはcib.xml以外の3ファイルになります。
ファイル名 内容 概要
/etc/ha.d/ha.cf クラスタ基本設定ファイル クラスタ・ノードやハートビート通信に関する設定などを記述します。
/etc/ha.d/authkeys ハートビート認証設定ファイル ハートビート通信の認証に関する設定を記述します。
/etc/logd.cf ログ出力設定ファイル ログの出力先やデバッグレベルに関する設定を記述します。
/var/lib/heartbeat/crm/cib.xml 構成フォーマット サービス、ノードの情報が記述されるファイルです。

クラスタ基本設定ファイル(ha.cf)の設定

アクティブ・スタンバイの両ノードにクラスタ基本設定ファイル(ha.cf)を作成します。
またHeartbeat(ノード間の通信)に関するポートはiptablesの設定が必要です。
コメントは外しておいたほうが問題が発生しません。
# vi /etc/ha.d/ha.cf
pacemaker on                #Pacemakerの有効化(yesでも可)
use_logd off                #ログデーモンの利用の可否を指定
logfile /var/log/ha-log     #ログの出力先を指定(use_logd on の場合は/etc/logd.cfに記述)
debugfile /var/log/ha-debug #デバッグログの出力先を指定(use_logd on の場合は/etc/logd.cfに記述)
logfacility none            #ログをsyslogに送る際に使用するファシリティ(シスログへ出力させない場合はnoneとする)
                            #use_logd on の場合は/etc/logd.cfに記述
debug 0                     #デバッグは通常運用では0を指定する
keepalive 2                 #ノード間死活監視時間間隔(秒)
deadtime 30                 #ノードダウン検知時間(秒)
warntime 10                 #相手ホストがダウンしたと警告を出すまでの時間
initdead 120                #初期起動時、ハートビート監視を開始するまでの時間
auto_failback off           #自動フェールバックのon/off(効かないためcib.xmlでも設定は必要)
autojoin none               #ノードの自動参加
                            #none: 自動参加を無効にする。
                            #other: ha.cfに含まれない自分以外のノードに自動参加を許可する。
                            #any: ha.cfに含まれない全てのノードに(現在のノードにも)自動参加を許可する。
mcast eth0 239.10.10.1 694 1 0 #694 => port #1 ttl(サブネットのみの場合は1にする)
node stack01                #クラスタノードを指定(uname -nの結果を記述)
node stack02                #クラスタノードを指定(uname -nの結果を記述)
uuidfrom nodename           #uuidをノード名から決定する(/var/lib/heartbeat/hb_uuidがある場合は削除)
watchdog /dev/watchdog     #heartbeat自身のプロセス異常時にシステムを再起動する(yum install watchdog)

ハートビート認証設定ファイル(authkeys)の設定

こちらも両方のノードで作成します。
暗号化方式には【sha1】【md5】【crc】が使用可能です。
ここでは【sha1】を利用します。特にどれでも問題はないでしょう。
Fulltrustの部分は特に制限などはありませんが両方のノードで合わせましょう。
# vi /etc/ha.d/authkeys
auth 1
1  sha1 Fulltrust

セキュリティのためパーミッションを変更

# chmod 600 /etc/ha.d/authkeys

ログ出力設定ファイル(logd.cf)の設定

/etc/ha.d/ha.cfの設定の中で use_logd on の場合のみ記述が必要です。
そうでない場合は直接ha.cfの中に記述します。
こちらもコメントの部分は実際には設定しないほうがいいでしょう。
# vi /etc/logd.cf
logfile /var/log/ha-log     #ログの出力先を指定
debugfile /var/log/ha-debug #デバッグログの出力先を指定
logfacility none            #ログをsyslogに送る際に使用するファシリティ(シスログへ出力させない場合はnoneとする)

ファイアウォールの設定

iptablesを停止している場合は必要ありません。
クラスタ化するサービスとは別に以下の2行をiptablesに追加しサービスを再起動しておきましょう。
先に最初の設定をバックアップしておきます。
# cd /usr/local/src ; iptables-save -c > iptables.bak
# service iptables save
元に戻す場合は以下のようにすれば戻ります。
# cd /usr/local/src ; iptables-save -c > iptables.bak
# service iptables save
# iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited
# iptables -A INPUT -p igmp -j ACCEPT
# iptables -A INPUT -m addrtype --dst-type MULTICAST -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 694 -j ACCEPT
# iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
# service iptables save

停止しても問題ない場合は停止してしまいましょう。

# service iptables stop
# chkconfit iptables off

Heartbeatの起動

アクティブ・スタンバイの両ノードで起動します。

# service heartbeat start

状態確認

オプション-fAで確認します。
f オプションは,リソースの故障状態の表示を行います。
A オプションはインターコネクトLANの状態や,ネットワーク監視の状態を表示します。
# crm_mon -fA
============
Last updated: Tue Aug  9 13:30:06 2011
Stack: Heartbeat
Current DC: kensyou02.fulltrust.co.jp (e5ae8388-bd4b-4471-a1f5-88c646b8d4ee) - p
artition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ kensyou01.fulltrust.co.jp kensyou02.fulltrust.co.jp ]


Node Attributes:
* Node kensyou01.fulltrust.co.jp:
* Node kensyou02.fulltrust.co.jp:

Migration summary:
* Node kensyou01.fulltrust.co.jp:
* Node kensyou02.fulltrust.co.jp:

Rsyslogの設定

Pacemakerが出力するログのせいで他のログを確認出来なくなる場合がありますので振り分け設定を行なっておきます。
# vi /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
=> messagesにlocal1のものは出力しないようにします
*.info;mail.none;authpriv.none;cron.none;local1.none        /var/log/messages

最下行に以下を追記します。
#For Pacemaker
local1.*                                                    /var/log/cluster/corosync.log

設定の反映を行います。

# service rsyslog restart

ログローテーションの設定

Pacemakerのログもローテーションされるようにします。

# sed -i '5a\var/log/cluster/corosync.log' /etc/logrotate.d/syslog

リソースの設定

参加ノードのどこか1つのサーバで設定を行えば全ノードに反映されます。
CRMコマンドを利用しますがcrmと入力するとcrmシェルを利用することが出来ます。
また途中でshowとうつと現状設定途中のコンフィグ確認が可能です。
あっていればcommitとすると設定が反映されます。

参加ノード全体の設定

  1. no-quorum-policy 3サーバ以上の構成の場合のクラスタ参加サーバが過半数に満たない場合の動作ポリシー

    2サーバの場合はignoreを設定

  2. stonith-enabled 監視対象ノードの異常を検出したときに強制的にそのノードをダウンさせる機能

  3. resource-stickiness リソース移動を固定する優先度

  4. migration-threshold 故障を検知した際に同一サーバでリソースの再起動を試みる回数

STONITHは利用しない、またスプリットブレインが発生してもなにもしない

# crm configure property no-quorum-policy="ignore" stonith-enabled="false"

自動的にフェイルバックはしない、またリソースの再起動は1度だけ試みる

# crm configure rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"

リソースの切り替えに関する待機時間を長めに指定する

# crm configure property default-action-timeout="240" default-resource-stickiness="200"

ゲートウェイに対するPING監視を設定する

# crm configure primitive res_ping ocf:pacemaker:ping             \
                                   params name="default_ping_set" \
                                   host_list="192.168.10.1"       \
                                   multiplier="100"               \
                                   dampen="1"                     \
                                   op monitor interval="10s"

仮想IPの設定

IPアドレスは環境に合わせてください。
ここでは192.168.10.200を設定しています。
IPaddr2の場合はifconfigではIPアドレスは確認できません。
ip addr showなどとして確認しましょう。
リソース名はvipとしています。後でこのリソースをグループ化する場合などはvipを利用します。
# crm configure primitive vip ocf:heartbeat:IPaddr2 params \
                   ip="192.168.10.200"                     \
                   nic="eth0"                              \
                   cidr_netmask="24"                       \
                   op monitor interval="10s" timeout="30s" \
                   op start interval="0" timeout="60s"    \
                   op stop  interval="0" timeout="60s"
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:8c:5c:dd brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.60/24 brd 192.168.10.255 scope global eth0
    inet 192.168.10.200/24 brd 192.168.10.255 scope global secondary eth0
    inet6 2001:c90:8223:951:5054:ff:fe8c:5cdd/64 scope global dynamic
       valid_lft 2591802sec preferred_lft 604602sec
    inet6 fe80::5054:ff:fe8c:5cdd/64 scope link
       valid_lft forever preferred_lft forever

Apacheのクラスタ化

クラスタ化といっても簡易的に行うために共有ディスクなどは利用しません。
全ノードにApacheをインストールしておきます。
用意されているスクリプトはApacheのserver-statusを利用していますのでApacheの設定でserver-statusをオンにします。
# yum install httpd -y
# sed -i '921,926s/^#//' /etc/httpd/conf/httpd.conf
# sed -i '925s@.example.com@127.0.0.1 192.168.10.0/24@' /etc/httpd/conf/httpd.conf
Apacheのリソース監視設定をPacemakerに追加
このコマンドはクラスタの一つだけで問題ありません。
# crm configure primitive httpd ocf:heartbeat:apache params \
  configfile="/etc/httpd/conf/httpd.conf" \
  port="80"                               \
  op start interval="0" timeout="60s"     \
  op monitor interval="5s" timeout="20s"  \
  op stop interval="0" timeout="60s"
仮想IPアドレスとApacheのリソースをグループ化します。
グループ化を行うことでグループ内のリソースが同じサーバで稼働することになります。
# crm configure group webserver vip httpd
再度設定を確認してみます。
# crm_mon -fA

間違えた場合などは以下のようにすればコンフィグを削除できます。

# crm node standby stack01
# crm configure delete httpd
# crm node online stack01
# crm node standby stack02
# crm node online stack02
# crm_mon -1

設定のクリア

設定をクリアする場合は設定ファイルを一度全て削除すれば可能です。

# service corosync stop
# \rm -f /var/lib/heartbeat/crm/*
# service corosync start