スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PostgreSQLでストリーミングレプリケーション

追記2011/5/14 スレーブ側のpostgresql.confにhot_standbyの設定

192.168.0.1をマスター、192.168.0.2をスレーブとします。
マスターは継続的アーカイブを行い、アーカイブログはスレーブ内のディスクに保存します。
スレーブはログシッピングスタンバイサーバかつストリーミングレプリケーションとなります。
ストリーミングレプリケーションのみも可能ですが、色々と制約があるので上記のような構成にしました。
環境はUbuntu11.04でPostgreSQL9.0.4になります。

■ユーザの作成と証明書の設定
マスター、スレーブの両方で行います。
ssh-keygenでのパスフレーズは設定しません。
sudo adduser postgres
sudo su postgres
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub


catの結果をお互いのauthorized_keysに記述します。
192.168.0.1のcatの結果を192.168.0.2のauthorized_keysへ
192.168.0.2のcatの結果を192.168.0.1のauthorized_keysへ
sudo su postgres
vi ~/.ssh/authorized_keys

作成後は手動でsshでアクセスして、お互いが接続できることを確認してください。

■PostgerSQLをインストール
マスター、スレーブの両方で行います。

インストール方法は極私的PostgreSQLインストール標準の通りです。起動スクリプトまで行ってください。データ作成以降はマスターとスレーブ双方で個別に説明します。

■スレーブのアーカイブ
スレーブで行います。
アーカイブログの実際の保存場所を作成します。
sudo mkdir -p /var/pgdata/9.0/5432/archive
sudo chown -R postgres:postgres /var/pgdata

■マスターのデータ作成と設定
マスターで行います。
sudo mkdir -p /var/pgdata/9.0/5432
sudo chown -R postgres:postgres /var/pgdata
sudo -u postgres /opt/postgresql/bin/initdb -D /var/pgdata/9.0/5432/data -E UTF-8 --locale=ja_JP.UTF-8
sudo -u postgres mv /var/pgdata/9.0/5432/data/pg_xlog /var/pgdata/9.0/5432
sudo -u postgres ln -s /var/pgdata/9.0/5432/pg_xlog /var/pgdata/9.0/5432/data/pg_xlog
sudo -u postgres cp /var/pgdata/9.0/5432/data/postgresql.conf /var/pgdata/9.0/5432/postgresql.conf
sudo -u postgres cp /var/pgdata/9.0/5432/data/pg_hba.conf /var/pgdata/9.0/5432/pg_hba.conf
sudo -u postgres vi /var/pgdata/9.0/5432/postgresql.conf
listen_addresses = '*'
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/pgdata/9.0/5432/log'
log_filename = '%Y%m%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 10MB
log_line_prefix = '[%t][%p][%u][%d]'
log_min_error_statement = warning
archive_mode = on
archive_command = 'test ! -f /var/pgdata/9.0/5432/archive && cp %p /var/pgdata/9.0/5432/archive/%f'
wal_level = hot_standby
max_wal_senders = 1
sudo -u postgres vi /var/pgdata/9.0/5432/data/pg_hba.conf
host all all 192.168.0.0/24 trust
host replication postgres 192.168.0.0/24 trust
sudo -u postgres cp /var/pgdata/9.0/5432/postgresql.conf /var/pgdata/9.0/5432/data/postgresql.conf
sudo -u postgres cp /var/pgdata/9.0/5432/pg_hba.conf /var/pgdata/9.0/5432/data/pg_hba.conf

■sshfsのマウント
マスターで行います。

アーカイブログを保存するため、sshfsを使って192.168.0.1から192.168.0.2のディスクにアクセスできるように準備します。
sudo aptitude install sshfs
sudo -u postgres mkdir /home/postgres/pgdata
sudo vi /etc/rc.local
sudo -u postgres sshfs postgres@192.168.0.2:/var/pgdata /home/postgres/pgdata
sudo /etc/rc.local
sudo -u postgres ln -s /home/postgres/pgdata/9.0/5432/archive /var/pgdata/9.0/5432/archive

■マスターの起動
マスターで行います。
sudo /etc/init.d/postgresql start
sudo -u postgres /opt/postgresql/bin/createuser -s -P
/opt/postgresql/bin/createdb -U db_root test
/opt/postgresql/bin/psql -U db_root -c "create table t_test(ts timestamp with time zone); insert into t_test (ts) values (now());" test


■スレーブのデータ作成と設定
スレーブで行います。

マスターからベースバックアップを取得します。
/opt/postgresql/bin/psql -U db_root -h 192.168.0.1 -c "SELECT pg_start_backup('label')" test
sudo -u postgres rsync -aq 192.168.0.1:/var/pgdata/9.0/5432/data/ /var/pgdata/9.0/5432/data
/opt/postgresql/bin/psql -U db_root -h 192.168.0.1 -c "SELECT pg_stop_backup()" test

pg_xlogを無理矢理作ります。これが無いとスレーブの起動に失敗します。
sudo -u postgres rm /var/pgdata/9.0/5432/data/pg_xlog
sudo -u postgres mkdir /var/pgdata/9.0/5432/data/pg_xlog

設定ファイルを修正します。postgresql.confはスレーブで必要の無い変更を外します。hot_standbyを設定します。
sudo -u postgres cp /var/pgdata/9.0/5432/data/postgresql.conf /var/pgdata/9.0/5432/
sudo -u postgres vi /var/pgdata/9.0/5432/postgresql.conf
#listen_addresses = '*'
#archive_mode = on
#archive_command = 'test ! -f /var/pgdata/9.0/5432/archive && cp %p /var/pgdata/9.0/5432/archive/%f'
#wal_level = hot_standby
#max_wal_senders = 1
hot_standby = on
sudo -u postgres vi /var/pgdata/9.0/5432/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=192.168.0.1 port=5432 user=postgres'
trigger_file = '/var/pgdata/9.0/5432/trigger'
restore_command = 'cp /var/pgdata/9.0/5432/archive/%f "%p"'
sudo -u postgres cp /var/pgdata/9.0/5432/postgresql.conf /var/pgdata/9.0/5432/data/postgresql.conf
sudo -u postgres cp /var/pgdata/9.0/5432/recovery.conf /var/pgdata/9.0/5432/data/recovery.conf


■スレーブ起動
スレーブで行います。
sudo /etc/init.d/postgresql start

起動後はログを確認して問題が無いかチェックしてください。

■動作確認
t_testの内容を確認してみます。
最初に同じものが入っていることを確認し、マスターでデータをinsertしてそれがスレーブに入っているか確認します。

マスター
/opt/postgresql/bin/psql -U db_root test
select ts from t_test order by ts desc limit 1;

スレーブ
/opt/postgresql/bin/psql -U db_root test
select ts from t_test order by ts desc limit 1;

マスター
insert into t_test (ts) values (now());
select ts from t_test order by ts desc limit 1;

スレーブ
select ts from t_test order by ts desc limit 1;
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。