PostgreSQL でレプリケーション

PostgreSQL 9.2 でレプリケーション

CentOS 7で運用しているPostgreSQLでレプリケーションをおこないました。CentOS 7なので最新ではないので需要は少ないと思いますが、その際の手順をまとめておきます

マスター側は「192.168.0.10」で、スレーブ側は「192.168.0.11」で手順を作成しています

マスター側のPostgreSQLの設定

設定ファイルを編集(pg_hba.conf)に、レプリケーションで実行するサーバーのIPアドレスを追加して通信できるようにします

# vim /var/lib/pgsql/data/pg_hba.conf

# replication
host    replication   repl_user    localhost         trust
host    replication   repl_user    192.168.0.11/32   trust

設定ファイルを編集(postgresql.conf)にレプリケーションに関する設定を追加します

# vim /var/lib/pgsql/data/postgresql.conf

listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 2
wal_keep_segments = 5
synchronous_standby_names = 'slave01'

synchronous_commit = local

パラメータの意味は以下のようになります

listen_addresses = '*’ 外部からの接続を許可
wal_level = hot_standby WALに出力される情報を「hot_standby」設定。9.6では「replica」と同じです
max_wal_senders=2 DBサーバで起動するwal_senderプロセスの最大数
wal_keep_segments=5 WAL ログファイルセグメントの最大数
synchronous_standby_names=’slave01′ 同期スタンバイとして扱うスタンバイ名
synchronous_commit=local トランザクションのコミットの完了報告のタイミング

設定を反映させるために、PostgreSQLを再起動します

# systemctl restart postgresql

再起動したら、レプリケーション用のユーザー(repl_user)を作成します

# su pgsql
$ psql postgres
postgres=# CREATE ROLE repl_user LOGIN REPLICATION PASSWORD 'パスワード';

スレーブサーバーの設定

マスター側の設定が終わったら、スレーブサーバ側の設定を行います。

PostgreSQLをインストールします

# yum install postgresql-server

既存のデータベースのディレクトリを削除してから、マスター側よりデータベースの内容をコピーします

# data領域のデータを削除
# rm -Rf /var/lib/pgsql/data/*

# データを削除したら、マスターよりコピーして所有者を変更
# pg_basebackup -h 192.168.0.10 -U repl_user -D /var/lib/pgsql/data/ --xlog --progress
# chown -R postgres:postgres  /var/lib/pgsql/data/す

スレーブ側のpostgre.conf の不要な設定を削除して、必要な設定を追加します

# vi /var/lib/pgsql/data/postgresql.conf
# レプリケーション関係
hot_standby = on

# 不要なのでコメントアウト
# synchronous_standby_names = 'slave01'

recovery.conf にレプリケーションに必要な設定を追加します

# cp /usr/share/pgsql/recovery.conf.sample /var/lib/pgsql/data/recovery.conf
# chown postgres:postgres /var/lib/pgsql/data/recovery.conf
# vim /var/lib/pgsql/data/recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=192.168.0.10 port=5432 user=repl_user password=[パスワード] application_name=slave01'

自動起動を有効にして、PostgreSQLを起動します

# systemctl enable postgresql.service
# systemctl start postgresql.service

レプリケーションができているか確認

マスター側で以下のコマンドを実行します。sync_stateがsyncとなっていればレプリケーションができています

$ psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;"
 application_name |   state   | sync_priority | sync_state
------------------+-----------+---------------+------------
 slave01          | streaming |             1 | sync

もう少し詳細にレプリケーションの情報が知りたい場合は以下になります

$ psql -x -U postgres -c 'select * from pg_stat_replication;'
-[ RECORD 1 ]----+------------------------------
pid              | 29233
usesysid         | 93439
usename          | repl_user
application_name | slave01
client_addr      | 192.168.0.11
client_hostname  | 
client_port      | 33094
backend_start    | 2021-12-05 22:58:55.916501+09
state            | streaming
sent_location    | 3/B5B294C0
write_location   | 3/B5B294C0
flush_location   | 3/B5B294C0
replay_location  | 3/B5B29410
sync_priority    | 1
sync_state       | sync

スレーブ側では、最終に同期された時間が確認できます

$ psql -U postgres -c "SELECT pg_last_xact_replay_timestamp()"
 pg_last_xact_replay_timestamp 
-------------------------------
 2021-12-09 14:00:08.236253+0

 

LinuxCentOS 7

Posted by admin