Apache on Pacemaker でハマる

CentOSにDRBD+Heartbeat(v3)+Pacemakerでクラスタ構成。PostgreSQLApacheをリソース監視として組み込む。

crmのコマンドはさっぱり分からないまま、
とりあえずLinuxHAにアップされてる動画を皿のように見て、
設定もそのまま丸写ししてみる。

primitive drbd_pg ocf:linbit:drbd \
        params drbd_resource="r0" \
        op start interval="0s" timeout="240s" on-fail="restart" \
        op monitor interval="11s" timeout="60s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" role="Master" \
        op stop interval="0s" timeout="100s" on-fail="block"

primitive ip_pg ocf:heartbeat:IPaddr \
        params ip="192.168.0.180" \
                nic="eth0" \
                cidr_netmask="27" \
        op start interval="0s" timeout="90s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="100s" on-fail="block"

primitive pingd ocf:pacemaker:pingd \
        params \
                name="default_ping_set" \
                host_list="192.168.0.1" \
                multiplier="100" \
                dampen="0" \
        meta \
                migration-threshold="10" \
        op start interval="0s" timeout="90s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="100s" on-fail="block"

primitive fs_pg ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/var2" fstype="ext3" \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="block"

primitive postgresql ocf:heartbeat:pgsql \
        params pgctl="/usr/local/pgsql/bin/pg_ctl" \
        start_opt="-p 5432 -h 127.0.0.1" \
        psql="/usr/local/pgsql/bin/psql" \
        pgdata="/var2/pgsql/data" \
        pgdba="postgres" \
        pgport="5432" \
        pgdb="template1" \
        op start interval="0s" timeout="120s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="120s" on-fail="block"

primitive apache ocf:heartbeat:apache \
        params configfile="/usr/local/apache/conf/httpd.conf" port="80" \
        op start interval="0s" timeout="40s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="block"

group group_pg fs_pg ip_pg postgresql apache

ms ms_drbd_pg drbd_pg \        
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

clone clnPingd pingd \
        meta clone-max="2" clone-node-max="1"

location group_pg-location group_pg \
        rule 200: #uname eq ns1 \
        rule 100: #uname eq ns2 \
        rule -INFINITY: defined default_ping_set and default_ping_set lt 100

location master-location ms_drbd_pg \
        rule 200: #uname eq ns1 \
        rule 100: #uname eq ns2 \
        rule role=master -INFINITY: defined default_ping_set and default_ping_set lt 100

colocation pg_on_drbd inf: group_pg ms_drbd_pg:Master
colocation clnPingd-colocation 1000: group_pg clnPingd
order order_pg_after_drbd inf: ms_drbd_pg:promote group_pg:start

property $id="cib-bootstrap-options" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        no-quorum-policy="ignore" \
        stonith-enabled="false" \
        startup-fencing="false" \
        dc-deadtime="20s"

rsc_defaults $id="rsc-options" \
        resource-stickiness="INFINITY" \
        migration-threshold="1"

これを設定ファイルとして、/etc/ha.d/setting.txt に保存。
crmコマンドでこのファイルをloadして設定。
heartbeat起動。

#> crm configure
crm(live)configure# load replace /etc/ha.d/setting.txt
crm(live)configure# commit
#> service heartbeat start

これでDRBDのマウント、仮想IPの設定、PostgreSQLの起動までは成功。
が、Apacheの起動だけがどうしてもできない。crm_mon で見ると、

Failed actions:
apache_start_0 (node=ns1, call=9, rc=1, status=complete): unknown error apache_start_0
 (node=ns2, call=5, rc=1, status=complete): unknown error 

なんてエラーが。

google先生にいろいろなキーワードで検索するも、どうやら日本国内ではまだまだHeartbeat v3 + Pacemaker の
事例はあまりないようで、参考になる情報が見つからない。

なので、英語ページも片っ端から開いて見るも、出てくるのはhttpd.confに

ExtendedStatus On

<Location /server-status>
SetHandler server-status

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

を書け、と。「俺はそれでうまくいった!」そんなことばかり。
「それでも動かんのじゃ!ボケ」と夜中の4時につぶやきながら、
仕方ないのでOCFのapacheスクリプトを眺めてみる。

/usr/lib/ocf/resource.d/heartbeat/apache

  1. httpd.confを読み込み
  2. apacheのpidファイルからプロセス番号を読んで
  3. そのプロセスが無ければ「落ちた」ということになって・・・・

ん?んん?apacheのpidファイル?

で、ふと気がついた。
そんなものどこにあるっけ?と。

PidFileディレクティブ

で、パッケージ版のApachehttpd.confを見てみると確かにこのPidFileディレクティブの記述がある。
自分はパッケージ嫌いでなんでも自分でコンパイルしてしまう派なので、当然Apacheも自分でソースからコンパイル
コンパイル版のApachehttpd.confには、このPidFileディレクティブがデフォルトでは無い罠。(*補足1)

ってことで、あとは話は簡単。httpd.confに1行追加。

PidFile /var/run/httpd.pid

で、heartbeatを再起動。。。。しばらく待つ。。。

apache     (ocf::heartbeat:apache):        Started ns1

キター。と、朝の5時に叫ぶ。

*補足1
コンパイル版のApacheではデフォルトでは、httpd.confからextra/httpd-mpm.conf がincludeされていないために
PidFileが指定されていないだけでした。これをincludeしてやればOKだと思われます。

*補足2
PHPフレームワークCakePHPを入れると、再びPacemakerのApche起動に失敗するようになった。
CakePHPの構造上、RewriteEngineを使うので、ドキュメントルートの/以下のURIRewriteされてしまうため発生。
Pacemakerから/server-status/server-statusとなるように、crmの設定を変更。

primitive apache ocf:heartbeat:apache \
        params configfile="/usr/local/apache/conf/httpd.conf" port="80" \
        statusurl="http://localhost/server-status/server-status" \ ←追加
        op start interval="0s" timeout="90s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="300s" on-fail="block"

httpd.confを変更

ExtendedStatus On

<Location /server-status/server-status>
SetHandler server-status

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

/server-status/ に.htaccessを置く

RewriteEngine off


これで問題解決。