pgpool-IIの簡単セットアップ機能を試してみよう(3)
自動縮退・フェイルオーバを試してみる
pgpool-IIは、PostgreSQLが動いているかどうか監視しており、もしPostgreSQLがダウンした場合には自動的に切り離して(「縮退」と言います)、クラスタ全体として運用を継続できるようにします。また、単に縮退させるだけでなく、スタンバイサーバをプライマリに昇格させたりするようなフェイルオーバ処理を実行させることもできます。
まずはpgpool-IIが現在のPostgreSQLの状態をどのように認識しているか見てみましょう。
$ psql -p 11002 test psql (9.2.4) Type "help" for help. test=# show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+----------+-------+--------+-----------+--------- 0 | /tmp | 11000 | 2 | 0.500000 | primary 1 | /tmp | 11001 | 2 | 0.500000 | standby (2 rows)
pgpool-IIはいくつかの特別なshowコマンドを理解します。"show pool_nodes"は、配下のPostgeSQLの状態を表示します。"status"のところがその状態値で、1または2なら問題なし、3ならダウン状態となります。また、"role"を見ると、node_id 0(data0にデータベースクラスタを持つPostgreSQL)はプライマリで、node_id 1(data1にデータベースクラスタを持つPostgreSQL)はスタンバイであることが分かります。
では、現在のプライマリであるdata0のPostgreSQLを落としてみましょう。
PostgreSQLがダウンしたことをpgpool-IIが検知すると、自動的にそのPostgreSQLを切り離してクラスタ全体として運用を継続できるようにします(縮退)。処理中は一旦セッションが切られるため、接続中のセッションはエラーになりますが、psqlは再度接続を試みます。
test=# show pool_nodes; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Succeeded.
縮退が終わると、フェイルオーバ用のスクリプト(ユーザが定義。今回はpgpool_setupによって設定済み)が実行されてフェイルオーバ処理が行われ、今までスタンバイだったdata1がプライマリに昇格し、プライマリはスタンバイに降格します。この段階ではまだ旧プライマリはダウン状態(3)です。
test=# show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+----------+-------+--------+-----------+--------- 0 | /tmp | 11000 | 3 | 0.500000 | standby 1 | /tmp | 11001 | 2 | 0.500000 | primary (2 rows)
その後新スタンバイはpgpool-IIの自動リカバリ機能(follow_master_command)により、自動的にリカバリされて新マスタの新しいスタンバイとして設定されてオンライン状態になり、ステータスが1へと変化します。
test=# show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+----------+-------+--------+-----------+--------- 0 | /tmp | 11000 | 1 | 0.500000 | standby 1 | /tmp | 11001 | 2 | 0.500000 | primary (2 rows)
このように、縮退、スタンバイサーバの昇格、新しいスタンバイサーバへの設定という一連の処理をpgpool-IIが自動実行することができます。ちなみに、プライマリサーバがダウンした時に単にスタンバイサーバを昇格させるだけに留め、プライマリはダウンしたままにしておくこともできます。その場合は、etc/pgpool.confの設定を変更します。
follow_master_command = '/home/t-ishii/tmp/test/etc/follow_master.sh %d %h %p %D %m %M %H %P %r %R'
を
follow_master_command = ''
として、pgpool.confを再読み込みします。再読み込みは、pgpool_reloadというスクリプトを起動するだけです。
./pgpool_reload
オンラインリカバリを試してみる
スタンバイサーバがクラッシュしてしまったとしましょう。この場合、プライマリサーバのベースバックアップを取得してスタンバイサーバをリストアするなどの作業が必要になります。pgpool-IIのオンラインリカバリ機能を使えば、コマンドを叩くだけでスタンバイサーバを復旧できます。早速試してみましょう。先ほどの続きですので、スタンバイサーバはdata0の方になっていることを忘れないで下さい。
スタンバイサーバを停止します。
$ pg_ctl -D data0 -m f stop waiting for server to shut down.... done server stopped
スタンバイサーバが停止していることを確認します。
$ psql -p 11002 test psql (9.2.4) Type "help" for help. test=# show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+----------+-------+--------+-----------+--------- 0 | /tmp | 11000 | 3 | 0.500000 | standby 1 | /tmp | 11001 | 2 | 0.500000 | primary (2 rows)
pgpool-IIの付属コマンド"pcp_recovery_node"を使ってオンラインリカバリを行います。pcp_recovery_nodeの引数は、タイムアウト時間(実際には無視されます)、pgpool-IIが動いているホスト名、pcp用のポート番号、管理アカウント名(pgpool_setupでは、pgpool_setupを起動したユーザ名に設定されます)、パスワード(管理アカウント名と同じです)、ノード番号(show pool_nodesで"node_id"の項目で表示されている番号)です。
$ pcp_recovery_node 1 localhost 11003 t-ishii t-ishii 0
オンラインリカバリでは、プライマリサーバのデータをスタンバイサーバにコピーする必要があるので、少し時間がかかります(データベースが大きくなれば、かなりの時間がかかります)。何もエラーメッセージが出なければ、リカバリ完了です。ちなみに、pcp_recovery_nodeが動いている間も、pgpool-II を経由してデータベースの更新を行なっても構いません。これが、「オンラインリカバリ」と呼ばれる所以です。
pcp_recovery_nodeが完了したら、show pool_nodesで確認します。
$ psql -p 11002 test psql (9.2.4) Type "help" for help. test=# show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+----------+-------+--------+-----------+--------- 0 | /tmp | 11000 | 2 | 0.500000 | standby 1 | /tmp | 11001 | 2 | 0.500000 | primary (2 rows)
きちんとリカバリできたようです。
pgpool_setupの他の機能
pgpool_setupでは、ストリーミングレプリケーション環境以外にも、pgpool-IIだけでレプリケーションを行う「ネイティブレプリケーションモード」にも対応しています。これは、-m 引数で指定できます。
pgpool_setup -m r
また、PostgreSQLのノード数を2以外にすることもできます(今のところ、指定できるノード数は3までですが、次のバージョンに付属するpgpool_setupでは、任意の数のノードを作ることができるようになる予定です)。
pgpool_setup -n 3
pgpool_setupでは、デフォルトで最初のPostgreSQLのポート番号を11000、2番目のPostgreSQLのポート番号を11001、pgpool-IIのポート番号を11002、pcpコマンドのポート番号を11003というように割り当てていきます。もし11000以外を最初のポート番号にする場合は、-p オプションを利用して下さい。
pgpool_setup -p 11100
最後に
pgpool_setupを使うことにより、簡単に手元のPCにクラスタ環境を構築できます。pgpool_setupを、PostgreSQLによるクラスタ環境の評価や学習、更には実用システムのプロトタイプとして活用して頂ければpgpool-IIの開発者の一人として嬉しい限りです。