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から実装されている同期レプリケーションを試してみたいと思います。