PostgreSQL
2009年10月02日
postgresqlのupgrade
自動でDBのupgradeしてくれるわけじゃなかった。
いや、単に忘れていただけ。手動でpg_upgradeclusterを実行。
2009年04月16日
pgpool-IIをPITRでリカバリ
前回はrsyncでリカバリーをおこなったが今回はPITRを使う。
やってしまえば簡単な話なんだが、それまでにいろいろ試行錯誤。結果的にPITRのことがわかるようになった。流れは次のとおり。
- WALのアーカイブログを取るように設定
- pg_functionの設定(省略)
- pgpool.confの設定とリカバリーのスクリプトの作成
まずそれぞれのクラスターがWALのアーカイブをするように設定する。cl0,cl1/postgresql.confの設定を行う。
archive_mode = on
archive_command = 'cp -f %p archive_log/%f'
と設定する。archive_command を
test ! -f archive_log/%f && /bin/cp %p archive_log/%f'
という説明もあるのだが、これやるとエラーになってしまう。
次にpgpool関係の設定。recovery_1st_stage.shを以下のとおり。色々デバッグメッセージが出るので注意。
#!/bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -c "select pg_start_backup('pgpool-recovery')" postgr
es
echo "restore_command = 'cp -v $RECOVERY_BASEDIR/archive_log/%f %p'" > $MASTER_BASEDIR/recovery.conf
rsync -av $MASTER_BASEDIR/ $RECOVERY_BASEDIR/
rm -f $RECOVERY_BASEDIR/postmaster.pid
rm -f $MASTER_BASEDIR/recovery.conf
psql -h localhost -p $PORT -c 'select pg_stop_backup()' postgres
次にrecovery_2nd_stage.shを設定する。
#! /bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -U postgres -c 'select pg_switch_xlog()' postgres
rsync -av $MASTER_BASEDIR/archive_log/ $RECOVERY_BASEDIR/archive_lo
それぞれのファイルを$PGDATAの中に配置。
pgpool.confは次のように設定。
recovery_1st_stage_command = 'recovery_1st_stage.sh'
recovery_2nd_stage_command = 'recovery_2nd_stage.sh'
これで同じようにpcp_recovery_nodeを動かせばいい。いろいろと雑だが一応動く。
2009年04月14日
pgpool-IIをテスト
pgpool-IIでレプリケーション+オンラインリカバリーのテストをしてみた。
いまいちドキュメントがわかりにくい。書いてあることは書いてあるんだけど、なんとなくわかりにくい。
recoveryの方法はrsyncでやった。PITRはそれ自体がどうなのかよくわかってないのでパス。
構成として1台のPCにpgpoolとPostgresのクラスターを2つ用意した。
環境はpgpool-II 2.2 / PosrgreSQL 8.3
レプリケーションまでの手順
debianのpgpool-IIのバージョンが古いので自分でコンパイルしてインストールした。# pg_createcluster 8.3 cl0とやってクラスターを二つ作る。
# pg_createcluster 8.e cl1
/usr/local/etc/pgpool.confを設定。長いので関係あるとこだけ抜粋。pidの場所とかは自分でどうぞ。
replication_mode = true
replication_stop_on_mismatch = true
次がリカバリーに関係する部分
recovery_user = 'postgres'バックエンドのクラスターの定義
recovery_password = ''
recovery_1st_stage_command = 'pgpool_recovery'
recovery_2nd_stage_command = 'pgpool_recovery'
replication_timeout = 5000pcp.confの設定は省力。
backend_hostname0 = 'localhost'
backend_port0 = 5433
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/8.3/cl0'
backend_hostname1 = 'localhost'
backend_port1 = 5434
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/8.3/cl1'
/etc/postgres/8.3/cl[01]/pg_hba.conf は
host all all 127.0.0.1/32 trustとりあえずこうしておく。ここまでやってreplicationがはいるようになった。
次はオンラインリカバリー
pgpool-IIのソースのpgpool-II-2.2/sql/pgpool-recoveryに移動する。Cの拡張をいれる必要があるので、ここでmake; make installを実行。このあと各クラスターを再起動。
psql -U postgres -p 15432 -f pgpool-recovery.sql template1を実行。/var/lib/postgresql/8.3/pgpool_recoveryを作成。
#! /bin/sh/var/lib/postgresql/8.3/pgpool_remote_start
if [ $# -ne 3 ]
then
echo "pgpool_recovery datadir remote_host remote_datadir"
exit 1
fi
datadir=$1
DEST=$2
DESTDIR=$3
rsync -v -aurz --delete $datadir/global/ $DESTDIR/global/ &
rsync -v -aurz --delete $datadir/base/ $DESTDIR/base/ &
rsync -v -aurz --delete $datadir/pg_multixact/ $DESTDIR/pg_multixact/ &
rsync -v -aurz --delete $datadir/pg_subtrans/ $DESTDIR/pg_subtrans/ &
rsync -v -aurz --delete $datadir/pg_clog/ $DESTDIR/pg_clog/ &
rsync -v -aurz --delete $datadir/pg_xlog/ $DESTDIR/pg_xlog/ &
rsync -v -aurz --delete $datadir/pg_twophase/ $DESTDIR/pg_twophase/ &
wait
#! /bin/bashこのふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。
if [ $# -ne 2 ]
then
echo "pgpool_remote_start remote_host remote_datadir"
exit 1
fi
DEST=$1
DESTDIR=$2
pg_ctlcluster 8.3 $(basename $DESTDIR) start
想定手順
実際の運用はこんな手順かな。cl0を止めた、あるいは勝手に止まった想定。# pg_ctlcluster 8.3 cl0 stopてな具合です。
# /usr/local/bin/pcp_detach_node 30 localhost 9898 postgres postgres 0
# /usr/local/bin/pcp_recovery_node 30 localhost 9898 postgres postgres 0
2008年10月02日
PostgreSQLの認証をLDAPでする
むずかしい話でもなくて。
host all all 127.0.0.1/32 ldap "ldap://192.168.1.1/dc=example,dc=org;uid=;,ou=Users,dc=example,dc=org"
とpg_hba.confに書く。
ldap://ldaphost/basedn;prefix;suffixとなる。この例でユーザーがhogeならばuid=hoge,ou=Users,dc=example,dc=jpが使われる。
ちなみに認証だけなのでユーザーの作成はcreateuserで別に作っておくように。AuthenticationとAuthorizationは違うという話。
2008年05月03日
PostgreSQL 8.2 -> 8.3
PostgreSQLを8.2から8.3へアップグレード
# pg_dropcluster 8.3 main --stopでよいようだ。昔は結構面倒だった記憶もあるが…。
# pg_upgradecluster 8.2 main
2007年09月09日
postgresql-8.2へupgrade
Debianでpostgresql-8.2にupgrade。
インストールが終わったあとに次を実行する。
# pg_dropcluster 8.2 main --stop
# pg_upgradecluster 8.1 main

