Apache on Pacemaker でハマる
CentOSにDRBD+Heartbeat(v3)+Pacemakerでクラスタ構成。PostgreSQLとApacheをリソース監視として組み込む。
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
ん?んん?apacheのpidファイル?
で、ふと気がついた。
そんなものどこにあるっけ?と。
で、パッケージ版のApacheのhttpd.confを見てみると確かにこのPidFileディレクティブの記述がある。
自分はパッケージ嫌いでなんでも自分でコンパイルしてしまう派なので、当然Apacheも自分でソースからコンパイル。
コンパイル版のApacheのhttpd.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を使うので、ドキュメントルートの/以下のURIがRewriteされてしまうため発生。
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
これで問題解決。