Ikeda->Weblog();

Ikedaの徒然雑記。

[メモ] PostgreSQL 7.4でpgpool-IIのリカバリ機能を使う~設定編

| 0件のコメント

[メモ] 7.4でpgpool-IIのリカバリ機能を使う~設定編ほんっとにメモです^^;

pgpool-II 公式ページのドキュメント
によると、行うべきことは

  1. pgpoolの設定
  2. C言語関数のインストール
  3. リカバリスクリプトの配置
 

の3点。

 


pgpoolの設定

 

pgpool.confの以下の値を設定します。
  • backend_data_directory
    バックエンドのデータディレクトリ($PGDATA)。
  • recovery_user
    リカバリに使用するユーザID。
  • recovery_password
    ログインパスワード。
  • recovery_1st_stage_command
  • recovery_2nd_stage_command
    pgpoolでは2つのステージに分けてオンラインリカバリが行われます。ここにそれぞれのステージで実行すべきコマンドを指定します。
 

C言語関数のインストール

 

リカバリを実施するためのC言語関数を全ノードの template1 データベースにインストール。関数のソースコードはpgpool-IIに付属されています。

んがしかし。

Makefile で “pg_config ––pgxs” が実行されるのですが、7.4.xに付属するpg_configコマンドには「––pgxs」オプションがありませんのでエラーになってしまいます。

 

しかしご安心を。pgpool-generalメーリングリストのアーカイブに対処法がありました!^^

 
  1. PostgreSQLのソースコードを展開し、configure & make まで済ませておきます。
  2. pgpool に付属の pgpool-recovery を、ディレクトリごと PostgreSQLソースの contrib 下にコピー。

    cp -r pgpool-recovery ../../postgresql-7.4.xx/contrib 

  3. contrib配下にコピーしたpgpool-recoveryにあるMakefileを下記の内容に修正します。

    subdir = contrib/pgpool-recovery
    top_builddir = ../..
    include $(top_builddir)/src/Makefile.global 

    MODULE_big    := pgpool-recovery
    SRCS        += pgpool-recovery.c
    OBJS        := $(SRCS:.c=.o)
    DATA_built    := pgpool-recovery.sql

    PG_CPPFLAGS    :=
    SHLIB_LINK     :=

    include $(top_srcdir)/contrib/contrib-global.mk

  4. make & make install
  5. pgpool-recovery 配下に作成されたpgpool-recovery.sqlをtemplate1データベースに対して実行します。

    psql -f pgpool-recovery.sql template1 

リカバリスクリプトの配置

 

実際にデータを同期させたり、postmasterを再起動させるためのスクリプトを作成し全ノードに配置します。pgpoolのソースにサンプルスクリプトが同梱(-x.x.x/sample以下)されていますので、有難く頂戴しておきましょう。

この時、PITR機能を使う方法と、rsyncによる方法があります。PITRを使うほうがリカバリにかかる時間も短くて済むのですが、7.4以前にはPITR機能そのものが実装されていません。従って嫌でもrsync等のリモートファイルコピーを使ったリカバリを選択せざるを得ませんね^^;

sampleの中に pgpool_recovery というスクリプトがあります。これがマスタノードからリカバリ対象ノードへデータを物理的にコピーしてくれるスクリプトです。内部ではrsyncを起動していますので、そのまま使う場合は予めパスフレーズ無しでsshログインできるよう設定しておく必要があります。

rsyncリカバリの場合、1st・2nd共に同じスクリプトを指定すること、だそうです。つまりはこんな感じ。

recovery_1st_stage_command = ‘pgpool_recovery’
recovery_2nd_stage_command = ‘pgpool_recovery’ 

 

あ、スクリプトは全て$PGDATA下に配置する必要があります。

また、複数のホストにpgpoolを配置してレプリケーションさせている場合、複数pgpoolを稼動させたままではオンラインリカバリの実行はできません(というか正しく動作しません、と注意書きがあります)。これは、どこか1つのpgpoolがリカバリのリクエストを出しているにも関わらず、他のpgpoolから更新クエリが飛んだりするとデータの同期が取れなくなってしまうからだそうです。

僕の場合は1インスタンスのみ稼動させるのでこの制限にはひっかかりませんが、例えばWeb/APサーバ側にpgpoolを設置しているような場合は、必ずどれか1つのpgpoolを残して他をshutdown しリカバリを行う必要があります。

 

と、あくまで自分の覚書なのでうまくまとまっていませんが、どなたかのお役に少しでも立てれば幸いです。
これから実際に設定を行いますので、気づいたことや経過報告はまた後日。

コメントを残す