Fedora11 でPostgreSQLの複数インスタンスを作成してみた

PostgreSQLでは、1つのインスタンスに複数のDB, 1つのDBに複数のスキーマ、 1つのスキーマに複数のテーブルを作成できるが、公式マニュアルを見る限り、複数のポートを指定して複数のインスタンス ?? を立ち上げる方法は載っていなかった。
このあたりはpostgres の起動オプションできまるため、ディストリビューション側の作り込みになるらしい。

WALでバックアップを戻す際に分かったのだが、1つのインスタンスでは1組のWALログしか作成できないため、 ロールフォワードをDBごとはできなさそうだ。このため、1つのインスタンスには1つのDBとし、DBの数だけインスタンスを作成する構成があってもよいように思える。

まず、Fedora11付属のPostgreSQL で複数のインスタンスをあげられるかどうか確かめてみた。実際には意外に簡単に実現出来た。
postgresql-libs-8.3.7-1.fc11.x86_64
postgresql-server-8.3.7-1.fc11.x86_64
postgresql-8.3.7-1.fc11.x86_64


基本的にはFedora11ではPostgreSQLを起動する際には、

# /etc/init.d/postgresql start

を使うのだが、この中のpostgres の起動時に起動オプションとして、 ポートとホームディレクトリ (postgresql.conf などが置いてあるディレクトリ ) を指定できる。

中身を確認したところ、port, ディレクトリはそれぞれ、 PGPORT, PGDATA で指定でき、設定ファイルは /etc/sysconfig/postgres/postgresql で指定出来た。ただし、 postgresql はinit.d スクリプトの名前となっている。
このため、 cp -ip /etc/init./postgresql /etc/ini.d/postgresql2 などとし、 /etc/sysconfig/pgsql/postgresql2 にPGDATA, PGPORT を指定すれば、複数インスタンスを起動できることになる。

実際の作業は次の順で行った。

1. ホームディレクトリの作成

# mkdir /tmp/pgsql
# chown -R postgres.postgres /tmp/pgsql/  <== 重要: これを実施しないとinitdb が失敗した

2. init.d スクリプトの作成

# cd /etc/init.d
# cp -ip postgresql postgresql2

3. PGDATA, PGPORT の指定

# vi /etc/sysconfig/pgsql/postgresql2
PGDATA=/tmp/pgsql
PGPORT=5433

4. initdb の実施

# /etc/init.d/postgresql2 initdb

5. postgresql の起動

# /etc/init.d/postgresql2 start

これで起動できた。適当にDB等を作成してテストを行う。

$ createdb -p 5433 aaa
$ psql -p 5433 aaa

ちなみに、接続ユーザーのalias で

alias psql2='psql -p 5433'

を指定すると使いやすい。

pstreeの出力はこんな感じになった。

     ├─ntpd
     ├─oddjobd
     ├─pcscd───{pcscd}
     ├─postmaster───6*[postmaster] <== rsyslog への接続あり
     ├─postmaster───5*[postmaster]
     ├─ricci