PostgreSQL9.1ためしてみた【インストール編】

昨日(2011/11/13)、島根県松江市で行われた島根オープンソースカンファレンスに参加してきました。その中で、日本PostgreSQLユーザ会の三谷 篤さんによる「PostgreSQL 9.1の同期レプリケーション機能を使う」を聴いて、久々にPostgreSQL熱が上がったので早速9.1を入れて遊んでみる事にしました。

久々にといっても仕事では普段からPostgreSQL(まだ8系ですが...)を使っているのですが、最近は家ではMySQLを使う事が多くなってて"PostgreSQLで遊ぶ"ということを久しくやっていませんでした。
世の中の流れ的にもMySQLが紹介される事が増えてますが、同じオープンソースPostgreSQLも素晴らしい安定性と速度を持ったリレーショナルデータベースだと感じています。
かつてはバキューム(削除されたデータ領域の掃除とか)を手動でやらなければならなかったり面倒な部分もあり、またMySQLのような簡単に使えるレプリケーションを自前では備えていない事もあって段々とMySQLにユーザを取られた感がありましたが、個人的には長く使っているPostgreSQLに愛着があります。

というわけで今回はPostgreSQL9.1のインストールと簡単な設定。次回から非同期、同期レプリケーションをやってみてその記録をここに残したいと思います。

インストール
さて、今回はMac向けのパッケージ管理システムhomebrew(MacOSX用のパッケージ管理システムの一種)を使ってインストールしてみます。

なお、PostgreSQLはソースからインストールするのも比較的簡単です。今回はまだ不慣れなhomebrewに慣れる意味でそっちを使ってみました:-)

$sudo brew update
$sudo brew install postgresql

てやったら"Cowardly refusing to `sudo brew install'"などと叱られたので、以下を実行します。叱られなかったら不要です。

sudo chown -R root:wheel /usr/local/

なお、私の環境では/usr/bin以下にPostgreSQL9.0のコマンドが入っていました。タイムスタンプが2011/10/22で、丁度その頃にMacOSXをLionにアップグレードしてるので、アップグレード時に自動的に入れられたのかな?
とにかく環境が2つあると混乱の元なので、リネームしておきます。

$ sudo mv psql psql90
$ sudo mv pg_config pg_config90
$ sudo mv pg_dump pg_dump90
$ sudo mv pg_dumpall pg_dumpall90
$ sudo mv pg_restore pg_restor90
$ sudo mv pg_upgrade pg_upgrade90


データ保存場所を生成して起動
インストール完了したらデータの保存先を作ります。私は/usr/local/var/pgsql以下につくることにしました。このへんは各自で自由に決めていいです。
また、エンコーディングは今まではEUC_JPにしていましたが、もうUTF8の時代だしって思ってUTF8にしてみました。

sudo mkdir -p  /usr/local/var/pgsql
sudo chown postgres:postgres /usr/local/var/pgsql/
sudo -u postgres initdb --no-locale --encoding=UTF8 -D /usr/local/var/pgsql/data
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    postgres -D /usr/local/var/pgsql/data
or
    pg_ctl -D /usr/local/var/pgsql/data -l logfile start

上記のようなメッセージが表示されたら成功です。

起動は以下で

$ sudo -u postgres pg_ctl -D /usr/local/var/pgsql/data start

停止はこれ

$ sudo -u postgres pg_ctl -D /usr/local/var/pgsql/data stop

起動しているPostgreSQLに接続するには以下のコマンドで。

$ psql -U postgres template1

template1はデータベース名です。初期状態で接続出来るデータベースはtemplate1しかないので、とりあえずの接続テストにはこれを使えばいいでしょう。

psql (9.1.1)
Type "help" for help.

template1=#

上記のように表示されたら接続に成功しています。なお、PostgreSQLはデフォルトで5432番ポートを使用します。別のポートで接続を受け付けている場合は"-p ポート番号" を上記コマンドに追加すると接続出来ます。

その他のコマンドは以下の通り

データベース(例:database_name)の新規作成

createdb -U postgres database_name

データベース(例:database_name)の削除

dropdb -U postgres database_name


接続許可の設定
PostgreSQLは初期状態ではlocalhostからの接続のみ受け付けます。しかし実際の運用ではアプリケーションサーバやWebサーバとは別のホスト上で動かすでしょうから、それらのホストからの接続を受け付けるようにしなければなりません。
そのための設定ファイルは各クラスタのデータディレクトリ内にあります。

sudo vi /usr/local/var/pgsql/data/postgresql.conf

この設定ファイルの中に以下のような行があります。

#listen_addresses = 'localhost'

初期設定はコメント状態になっていますので行頭の#を消して"localhost"を"*"にします。

listen_addresses = '*'

のように変更してPostgreSQLを再起動すると全てのネットワークインタフェースで接続を待機するようになります。もし複数NICを持っていたりIPエイリアスで複数IPアドレスを持っているマシンで、特定のIPアドレスでのみ接続を許可したい場合はここにそのIPアドレスを書く事になります。

また、各ホストからの接続ユーザはおなじディレクトリ内のpg_hba.confで設定されています。デフォルトではローカルからのpostgresユーザによる接続のみ許可してあります。
そしてこのファイルにある"ホスト名 replication"で始まる行はレプリケーションするスレーブからの接続許可の設定だそうです。これについてはまた後ほど...

さて、PostgreSQLにはデフォルトでpostgresというユーザが居ますが実際のサービス運用の際には別ユーザを作ってそのユーザの権限で接続する事になると思います。

ユーザ"hoge"をパスワード"hogepassword"で登録するにはPostgreSQLに接続後に以下のようにします。

create user hoge with password 'hogepassword';

ちなみにデフォルト設定ではローカルホストからの接続は完全に許可されているので、一応パスワードなど設定してみましたが実際にはローカルからの接続に限りパスワード無しで接続出来ます。

$ psql -U hoge template1

他のホストから接続するには先ほどのpg_hba.confにエントリを追加する必要があります。

sudo vi /usr/local/var/pgsql/data/pg_hba.conf

pg_hba.conf中には以下のように書式がコメントとして書いてあります。

# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

例として先ほどのhogeユーザが同一ネットワークからのみ接続出来るようにするにはpg_hba.confに以下を追加します。

host    all             hoge            samenet                     md5

また、hogeユーザに全てのネットワークからの接続を許可するには

host    all             shin            all                     md5

さらに192.168.0.0/24のネットワークからの接続のみ許可するには

host    all             shin            192.168.0.0/24                     md5

また、192.168.0.20のホストからの接続のみ許可するには

host    all             shin            192.168.0.20/32                     md5

として保存した後にPostgreSQLを再起動します。

24とか32の意味が分からない方はこちらをどうぞ。

これで他のホストから繋ごうとするとパスワードを聞いてきます。
例として192.168.0.101で動作するPostgreSQLに他ホストから繋ぐ場合

psql -U shin -h 192.168.0.101 template1
Password for user hoge:(ここでパスワードを入力) 
psql (9.1.1)
Type "help" for help.

とりあえず今回はここまで。次回から非同期レプリケーションおよび9.1から実装されている同期レプリケーションを試してみたいと思います。