パーソナルツール
現在位置: ホーム 日々のメモ書き Topics PostgreSQL

PostgreSQL

2009年10月02日

postgresqlのupgrade

by TANIGUCHI Takaki — last modified 2009年10月02日 16時35分
Filed Under:

自動でDBのupgradeしてくれるわけじゃなかった。

いや、単に忘れていただけ。手動でpg_upgradeclusterを実行。

2009年04月16日

pgpool-IIをPITRでリカバリ

by TANIGUCHI Takaki — last modified 2009年04月16日 22時41分
Filed Under:

前回は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をテスト

by TANIGUCHI Takaki — last modified 2009年04月14日 00時11分
Filed Under:

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 = 5000
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'
pcp.confの設定は省力。
/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

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
/var/lib/postgresql/8.3/pgpool_remote_start
#! /bin/bash
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
このふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。

想定手順

実際の運用はこんな手順かな。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でする

by TANIGUCHI Takaki — last modified 2008年10月02日 15時41分
Filed Under:

むずかしい話でもなくて。

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

by TANIGUCHI Takaki — last modified 2008年05月03日 12時06分
Filed Under:

PostgreSQLを8.2から8.3へアップグレード

随分放置していたんだが、いいかげんやろうかと思って。README.Debianを読むと…。
# pg_dropcluster 8.3 main --stop
# pg_upgradecluster 8.2 main
でよいようだ。昔は結構面倒だった記憶もあるが…。

2007年09月09日

postgresql-8.2へupgrade

by TANIGUCHI Takaki — last modified 2007年09月09日 13時47分
Filed Under:

Debianでpostgresql-8.2にupgrade。

インストールが終わったあとに次を実行する。

# pg_dropcluster 8.2 main --stop
# pg_upgradecluster 8.1 main
takaki's twitter
糸崎から下関直通がなくなったのか…。 2010年09月07日 00時52分
一日目に八代までいくか荒尾までで我慢するかで次の日に3時間も変わってくるのでは大変だな。 2010年09月07日 00時36分
米原で乗り換えに5分もかかるとかあほな予測になってるせいでおかしなプランがでてくるのか。 2010年09月07日 00時14分
そういや月曜日には在庫を確認すると言ってまだ連絡がないな。もう忘れてもらって結構だけど。 2010年09月06日 23時47分
アンケート用紙にメールは送るなと書いたはずなんだが>東エレ 2010年09月06日 15時37分
Affiliate