Fedora 19 上でPostgreSQL ストリーミングレプリケーションのクラスタリング


Pacemaker起動 + クラスタ設定投入

Pacemaker 1.0.x では、Heartbeat や corosync を移動すると、Pacemakerも自動で起動していましたが、1.1.9は、自動で起動しないため、明示的に起動してあげます。(両ノードで実行)

# systemctl start pacemaker.service

crm_monコマンドでPacemakaerの状態を確認します。

# crm_mon -Afr
Last updated: Mon Jul  8 09:46:27 2013
Last change: Mon Jul  8 09:46:27 2013 via crmd on 52-fe19
Stack: corosync
Current DC: 52-fe19 (402696384) - partition with quorum
Version: 1.1.9-3.fc19-781a388
2 Nodes configured, unknown expected votes
0 Resources configured.

Online: [ 52-fe19 53-fe19 ]

Full list of resources:

Node Attributes:
* Node 52-fe19:
* Node 53-fe19:

Migration summary:
* Node 53-fe19:
* Node 52-fe19:

52-fe19と53-fe19上で無事Pacemakerが起動しました。では、Pacemakerの設定を定義していきます。Fedora 19には慣れ親しんだcrmコマンドが入っていないので、pcsコマンドで設定していきます。以下のコマンドを順番に投入していきましょう。

pcs cluster cib pgsql_cfg

pcs -f pgsql_cfg property set no-quorum-policy="ignore"
pcs -f pgsql_cfg property set stonith-enabled="false"
pcs -f pgsql_cfg resource op defaults resource-stickiness="INFINITY"
pcs -f pgsql_cfg resource op defaults migration-threshold="1"

pcs -f pgsql_cfg resource create vip-master IPaddr2 \
ip="192.168.0.252" \
nic="eth0" \
cidr_netmask="24" \
op start   timeout="60s" interval="0s"  on-fail="restart" \
op monitor timeout="60s" interval="10s" on-fail="restart" \
op stop    timeout="60s" interval="0s"  on-fail="block"

pcs -f pgsql_cfg resource create vip-rep IPaddr2 \
ip="192.168.1.252" \
nic="eth1" \
cidr_netmask="24" \
meta migration-threshold="0" \
op start   timeout="60s" interval="0s"  on-fail="stop" \
op monitor timeout="60s" interval="10s" on-fail="restart" \
op stop    timeout="60s" interval="0s"  on-fail="ignore"

pcs -f pgsql_cfg resource create pgsql pgsql \
pgctl="/usr/bin/pg_ctl" \
psql="/usr/bin/psql" \
pgdata="/var/lib/pgsql/data/" \
rep_mode="sync" \
node_list="52-fe19 53-fe19" \
restore_command="cp /var/lib/pgsql/pg_archive/%f %p" \
master_ip="192.168.1.252" \
primary_conninfo_opt="keepalives_idle=60 keepalives_interval=5 keepalives_count=5" \
restart_on_promote='true' \
op start   timeout="60s" interval="0s"  on-fail="restart" \
op monitor timeout="60s" interval="10s" on-fail="restart" \
op monitor timeout="60s" interval="9s"  on-fail="restart" role="Master" \
op promote timeout="60s" interval="0s"  on-fail="restart" \
op demote  timeout="60s" interval="0s"  on-fail="stop" \
op stop    timeout="60s" interval="0s"  on-fail="block" \
op notify  timeout="60s" interval="0s"

pcs -f pgsql_cfg resource master msPostgresql pgsql \
master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

pcs -f pgsql_cfg resource group add master-group vip-master vip-rep

pcs -f pgsql_cfg constraint colocation add master-group with Master msPostgresql INFINITY
pcs -f pgsql_cfg constraint order promote msPostgresql then start master-group symmetrical=false score=INFINITY
pcs -f pgsql_cfg constraint order demote  msPostgresql then stop  master-group symmetrical=false score=0

pcs cluster push cib pgsql_cfg

どうしてもcrmコマンドで設定をしたいなら、ここにFedora 18用のcrmshのRPMパッケージがあるので、これを無理やりインストールしてみてください。私の環境では動いてくれました。なお、インストールする には、pssh, python-dateutil, python-lxml パッケージが必要になるので、yum使ってインストールしておきましょう。crmで設定したい場合は以下の設定になります。

property \
    no-quorum-policy="ignore" \
    stonith-enabled="false"

rsc_defaults \
    resource-stickiness="INFINITY" \
    migration-threshold="1"

ms msPostgresql pgsql \
    meta \
        master-max="1" \
        master-node-max="1" \
        clone-max="2" \
        clone-node-max="1" \
        notify="true"

group master-group \
    vip-master \
    vip-rep

primitive vip-master ocf:heartbeat:IPaddr2 \
    params \
        ip="192.168.0.252" \
        nic="eth0" \
        cidr_netmask="24" \
    op start   timeout="60s" interval="0s"  on-fail="restart" \
    op monitor timeout="60s" interval="10s" on-fail="restart" \
    op stop    timeout="60s" interval="0s"  on-fail="block"

primitive vip-rep ocf:heartbeat:IPaddr2 \
    params \
        ip="192.168.1.252" \
        nic="eth1" \
        cidr_netmask="24" \
    meta \
        migration-threshold="0" \
    op start   timeout="60s" interval="0s"  on-fail="stop" \
    op monitor timeout="60s" interval="10s" on-fail="restart" \
    op stop    timeout="60s" interval="0s"  on-fail="ignore"

primitive pgsql ocf:heartbeat:pgsql \
    params \
        pgctl="/usr/bin/pg_ctl" \
        psql="/usr/bin/psql" \
        pgdata="/var/lib/pgsql/data/" \
        rep_mode="sync" \
        node_list="52-fe19 53-fe19" \
        restore_command="cp /var/lib/pgsql/pg_archive/%f %p" \
        master_ip="192.168.1.252" \
        primary_conninfo_opt="keepalives_idle=60 keepalives_interval=5 keepalives_count=5" \
        restart_on_promote='true' \
    op start   timeout="60s" interval="0s"  on-fail="restart" \
    op monitor timeout="60s" interval="10s" on-fail="restart" \
    op monitor timeout="60s" interval="9s"  on-fail="restart" role="Master" \
    op promote timeout="60s" interval="0s"  on-fail="restart" \
    op demote  timeout="60s" interval="0s"  on-fail="stop" \
    op stop    timeout="60s" interval="0s"  on-fail="block" \
    op notify  timeout="60s" interval="0s"

colocation colocation-1 inf: master-group msPostgresql:Master
order order-1 inf: msPostgresql:promote  master-group:start symmetrical=false
order order-2 0:   msPostgresql:demote   master-group:stop  symmetrical=false

では、もう一度crm_monコマンドで状態を確認します。

# crm_mon -Afr
Last updated: Mon Jul  8 10:24:21 2013
Last change: Mon Jul  8 10:22:14 2013 via crm_attribute on 52-fe19
Stack: corosync
Current DC: 53-fe19 (419473600) - partition with quorum
Version: 1.1.9-3.fc19-781a388
2 Nodes configured, unknown expected votes
4 Resources configured.

Online: [ 52-fe19 53-fe19 ]

Full list of resources:

 Resource Group: master-group
     vip-master (ocf::heartbeat:IPaddr2):       Started 52-fe19
     vip-rep    (ocf::heartbeat:IPaddr2):       Started 52-fe19
 Master/Slave Set: msPostgresql [pgsql]
     Masters: [ 52-fe19 ]
     Slaves: [ 53-fe19 ]

Node Attributes:
* Node 52-fe19:
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST    
    + pgsql-master-baseline             : 0000000009000080
    + pgsql-status                      : PRI
* Node 53-fe19:
    + master-pgsql                      : 100
    + pgsql-data-status                 : STREAMING|SYNC
    + pgsql-status                      : HS:sync   
    + pgsql-xlog-loc                    : 00000000090000E0

Migration summary:
* Node 52-fe19:
* Node 53-fe19:

う~ん、Masterは正常に起動しましたが、Slaveのpgsql-statusが、HS:syncとHS:aloneを行ったり来たりして安定しません。。。。どうやら、Fedora 19同梱のpgsql RAのバージョンが若干古いようです。/usr/lib/ocf/resource.d/heartbeat/pgsql ファイルを少し修正してみます。901行目の、crm_monを使用している部分を修正します。(両ノードで編集)

(修正前)

crm_mon -n1 | tr -d "\t" | tr -d " " | grep -q "^${RESOURCE_NAME}:.*Master$"

(修正後)

crm_mon -n1 | tr -d "\t" | tr -d " " | grep -q "^${RESOURCE_NAME}[(:].*[):]Master"

ようやく安定しました。
フェイルオーバできるか試してみます。52-fe19上で、PostgreSQLのプロセスをkillしてみます。

# killall -9 postgres
# crm_mon -Afr
Last updated: Mon Jul  8 11:36:23 2013
Last change: Mon Jul  8 11:36:19 2013 via crm_attribute on 53-fe19
Stack: corosync
Current DC: 52-fe19 (402696384) - partition with quorum
Version: 1.1.9-3.fc19-781a388
2 Nodes configured, unknown expected votes
4 Resources configured.

Online: [ 52-fe19 53-fe19 ]

Full list of resources:

 Master/Slave Set: msPostgresql [pgsql]
     Masters: [ 53-fe19 ]
     Stopped: [ 52-fe19 ]
 Resource Group: master-group
     vip-master (ocf::heartbeat:IPaddr2):       Started 53-fe19
     vip-rep    (ocf::heartbeat:IPaddr2):       Started 53-fe19

Node Attributes:
* Node 52-fe19:
    + master-pgsql                      : -INFINITY 
    + pgsql-data-status                 : DISCONNECT
    + pgsql-status                      : STOP
* Node 53-fe19:
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST    
    + pgsql-master-baseline             : 000000000A0000E0
    + pgsql-status                      : PRI

Migration summary:
* Node 52-fe19:
   pgsql: migration-threshold=1000000 fail-count=1000000 last-failure='Mon Jul  8 11:36:13 2013'
* Node 53-fe19:

Failed actions:
    pgsql_start_0 (node=52-fe19, call=95, rc=1, status=complete, last-rc-change=Mon Jul  8 11:36:13 2013
, queued=399ms, exec=0ms
): unknown error

無事フェイルオーバしました!
52-fe19 をSlaveとして復旧してみます。フェイルオーバするとデータの整合性が崩れている可能性があるので、52-fe19上のデータを破棄し、53-fe19からデータをコピーし、起動抑止用のロックファイルを削除します。(52-fe19上で実行)

# su - postgres
$ rm -rf /var/lib/pgsql/data/*
$ pg_basebackup -h 192.168.0.153 -U postgres -D /var/lib/pgsql/data -X stream -P
$ rm -f /var/lib/pgsql/tmp/PGSQL.lock
$ exit
# pcs resource cleanup pgsql
# crm_mon -Afr
Last updated: Mon Jul  8 11:44:21 2013
Last change: Mon Jul  8 11:44:20 2013 via crmd on 52-fe19
Stack: corosync
Current DC: 52-fe19 (402696384) - partition with quorum
Version: 1.1.9-3.fc19-781a388
2 Nodes configured, unknown expected votes
4 Resources configured.

Online: [ 52-fe19 53-fe19 ]

Full list of resources:

 Master/Slave Set: msPostgresql [pgsql]
     Masters: [ 53-fe19 ]
     Slaves: [ 52-fe19 ]
 Resource Group: master-group
     vip-master (ocf::heartbeat:IPaddr2):       Started 53-fe19
     vip-rep    (ocf::heartbeat:IPaddr2):       Started 53-fe19

Node Attributes:
* Node 52-fe19:
    + master-pgsql                      : 100
    + pgsql-data-status                 : STREAMING|SYNC
    + pgsql-status                      : HS:sync   
* Node 53-fe19:
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST    
    + pgsql-master-baseline             : 000000000A0000E0
    + pgsql-status                      : PRI

Migration summary:
* Node 52-fe19:
* Node 53-fe19:

無事復旧完了しました。

いかがでしたでしょうか?
初めてFedora 19上でPacemakerを動かしてみたので、うまくいくかどうか心配でしたが、(少し変なログが出ているものの)思ったよりも素直に動いてくれました。

本家Pacemakerコミュニティでは、そろそろPacemaker 1.1.10 がリリースされるようで、その数週間後には、安定版の2.0をリリースするという情報も流れています。Linux-HA Japanでも、メジャーバージョンアップに向けて少しづつ動いているようなので、今後の動向が楽しみですね。

Pages: 1 2

Comments are closed.