PostgreSQL9.3の高速フェイルオーバーは本当に高速なのか?

2013.09.19

PostgreSQL9.3

試してみました。
池田です。今回はエンジニアな池田でいきたいと思います。
PostgreSQLは前職でどっぷりと浸かったオープンソースのリレーショナルデータベースですが、このたびめでたく9.3をリリース。更新できるビューのマテリアライズドビューや、CSVファイルやSQliteなどの外部蓄積データを透過的に取り込んでレコードとして扱えるラッパー機能など面白そうな実装が目白押しなのです。その中でも私が最も注目したのは1秒以内と宣伝されている高速フェイルオーバーです。
9.0から実装されたネイティブなストリーミングレプリケーション機能は素晴らしいのですが、実際に障害が発生したときに、結局マスターからデータをミラーリングし直し、うー、となってしまうことがままあったからです。

とにかくやってみようということで、手元のVMwareに使い慣れているCentOS6.4 minimum の64ビット版をインストール。割り当てるメモリは1Gでいいでしょう。ポートを5432と5433としてソケット接続、ローカルに2つのPostgreSQLインスタンスを起動する方針です。
作業を簡単に、PostgreSQLは http://yum.postgresql.org から最新のリポジトリを取得してきます。CentOSの9.3はこちらですね。

インストールします。

# rpm -ivh pgdg-centos93-9.3-1.noarch.rpm
# yum install postgresql postgresql-server postgresql-contrib

yum でインストールした後、initscript のシェル変数を置き換える各インスタンス用の設定ファイルを /etc/sysconfig/pgsql 直下に設置しておきます。ファイル名はそれぞれ、postgresql-instance1とpostgresql-instance2とします。中身はこのような感じです。


#!/bin/bash –

PGINSTANCE=`basename $0 | cut -d “-” -f 2`
PGENGINE=/usr/pgsql-9.3/bin
PGPORT=5432
PGDATA=/var/lib/pgsql/$PGINSTANCE/data
PGLOG=/var/lib/pgsql/$PGINSTANCE/pgstartup.log

分かりやすいようにinitscriptをインスタンス毎にコピー。instance1のデータベースを初期化して起動します。

# cd /etc/init.d/
# cp -a postgresql-9.3 postgresql-instance1
# cp -a postgresql-9.3 postgresql-instance2
# /etc/init.d/postgresql-instance1 initdb
# /etc/init.d/postgresql-instance1 start

pg_hba.conf にレプリケーション設定を追加します。postgresユーザーにtrustと識者には怒られそうですが、テストだからいいんです。

local all all trust
local replication postgres trust

postgresql.confはレプリケーションにまつわるパラメータのみ変更。テストだからいいんです。

#port = 5432
wal_level = hot_standby
max_wal_senders = 2

では、instance1を再起動して適当なデータをpgbenchで投入します。

# pgbench -i

オッケーです。instance2のデータをinstance1から作成しましょう。
–write-recovery-conf は今まで手動で設置していたリカバリ用ファイルを自動的に作成してくれる便利なオプションです。今回からですね。

# pg_basebackup -p 5432 -D /var/lib/pgsql/instance2 –progress –write-recovery-conf

できました。

instance2のpostgresql.confのパラメータを変更します。

port = 5433
hot_standby = on

recovery.confには復帰時にリカバリを開始するよう以下の2行を追記します。

recovery_target_timeline=’latest’
restore_command = ‘cp /var/lib/pgsql/instance1/pg_xlog/%f “%p” 2> /dev/null’

というわけで準備完了。
instance2を起動してレプリケーションを確認しましょう。instance1をシャットダウンしてinstance2をマスターへ昇格させます。

# /etc/init.d/postgresql-instance1 stop
# /etc/init.d/postgresql-instance2 promote

確かに異常な速さです。
ではinstance1にrecovery.confを設置。スレーブとして復帰させてからフェイルバックしてみます。

# /etc/init.d/postgresql-instance1 start
# /etc/init.d/postgresql-instance2 stop
# /etc/init.d/postgresql-instance1 promote

うーん、確かにこれは早いです。手間もかなり減っています。ぜひお試しください。