LoginSignup
3
2

More than 5 years have passed since last update.

PostgreSQL9.5でcascading replicationを構成する

Last updated at Posted at 2017-05-30

はじめに

MySQLに続いて、PostgreSQLでも同様のレプリケーションを構成してみます。

MySQLで言うchained replicationは、PostgreSQLではcascading replicationと呼ぶようです。

すなわち
master -> slave1 -> slave2
のような構成です。

このとき、slave1はslave2にとってのmasterでもあります。

特記事項

通常のレプリケーション構築手順をslave1とslave2に実施することでcascading replicationは実現できますが、そのままだとslave1をmasterに昇格させた時、slave1->slave2のレプリケーションが停止してしまいます。

これは、slave1が昇格する際にTimeLineIDが上がり、slave2のTimeLineIDとズレてしまうためです。

これを回避するため、slaveのrecovery.confに追加の設定が必要となります。

前提

  • PostgreSQL9.5
  • ストリーミングレプリケーション(スレーブ非同期)
  • レプリケーション用ユーザ:replicator
  • 各ノードは全て192.168.1.0/24のネットワークに所属
  • Ubuntu16.04

必要な設定

共通

postgresql.conf

postgresql.conf
wal_level = hot_standby
synchronous_commit = local #スレーブ非同期
max_wal_senders = 2 #1以上、slaveの数+1
wal_keep_segments = 8 #任意

pg_hba.conf

pg_hba.conf
host    replication     replicator      192.168.1.0/24           trust #必要に応じてmd5

md5だとベースバックアップ取得時にreplicatorユーザのパスワードを要求されます。

postgresユーザによる公開鍵認証設定

詳細手順は割愛します。
全ノードpostgresユーザで公開鍵認証によるsshログインができるようにしておきます。

master

レプリケーション用ユーザ作成

psql
postgres=# create user replicator replication password 'replicator';

slave1

PostgreSQL停止

command
$ sudo service postgresql stop

ベースバックアップ

command
$ sudo su - postgres
$ mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.org
$ pg_basebackup -U replicator -h MASTER_IP -D /var/lib/postgresql/9.5/main --xlog --progress --verbose

recovery.conf作成

command
$ sudo su - postgres
$ vi /var/lib/postgresql/9.5/main/recovery.conf
recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=replicator password=replicator host= MASTER_IP'
trigger_file = '/var/lib/postgresql/9.5/main/failover'
recovery_target_timeline='latest'
restore_command = 'scp MASTER_IP:/var/lib/postgresql/9.5/main/pg_xlog/%f %p 2> /dev/null'

PostgreSQL起動

command
$ sudo service postgresql start

slave2

PostgreSQL停止

command
$ sudo service postgresql stop

ベースバックアップ

command
$ sudo su - postgres
$ mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.org
$ pg_basebackup -U replicator -h SLAVE1_IP -D /var/lib/postgresql/9.5/main --xlog --progress --verbose

recovery.conf作成

command
$ sudo su - postgres
$ vi /var/lib/postgresql/9.5/main/recovery.conf
recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=replicator password=replicator host= MASTER_IP'
trigger_file = '/var/lib/postgresql/9.5/main/failover'
recovery_target_timeline='latest'
restore_command = 'scp SLAVE1_IP:/var/lib/postgresql/9.5/main/pg_xlog/%f %p 2> /dev/null'

PostgreSQL起動

command
$ sudo service postgresql start

レプリケーション確認

master,slave1

command
$ sudo -i -u postgres psql -x -c 'SELECT * from pg_stat_replication;'
結果
state            | streaming
であればレプリケーションが正常に行なわれている

フェイルオーバ(master昇格)

recovery.confにトリガファイルを指定してあるため、このファイルを作成し、postgresqlを再起動させることでmaster昇格が可能です。

slave1 or slave2

command
$ sudo su - postgres
$ touch /var/lib/postgresql/9.5/main/failover
$ exit
$ sudo service postgresql restart 
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2