18. デモ環境
PostgreSQLのインストール(両ノードで実施)
データベース作成(プライマリのみ)
Japan PostgreSQL User's Group 18
2台のCentOSにyumでPostgreSQL 10.0を導入済み
$ sudo yum install wget
$ wget https://download.postgresql.org/pub/repos/yum/testing/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
$ sudo rpm -ivh pgdg-centos10-10-2.noarch.rpm
$ sudo yum install postgresql10 postgresql10-server postgresql10-contrib postgresql10-devel
$ sudo vi /usr/lib/systemd/system/postgresql-10.service
$ su - postgres
$ vi .bash_profile
$ sudo systemctl start postgresql-10.service
$ sudo systemctl status postgresql-10.service
$ su – postgres
$ createuser -d -r -l -P demo
$ createdb -O demo demodb
# Location of database directory
# Environment=PGDATA=/var/lib/pgsql/10/data/
Environment=PGDATA=/home/postgres/data/
### edit for PostgreSQL10
export PGDATA=/home/postgres/data
export PATH=/usr/pgsql-10/bin:.:$PATH
サンプルテーブルも作成
$ psql -U demo demodb
demodb=> create table sample (a int,b text);
demodb=> insert into sample values (1,'test1');
19. プライマリ側の設定
ユーザー作成
$PGDATA/pg_hba.confの編集
Japan PostgreSQL User's Group 19
①レプリケーション用のユーザーを作成
$ createuser --replication rep_user
$ vi $PGDATA/pg_hba.conf
TYPE DB USER CIDR-ADDRESS METHOD
host replication rep_user 192.168.10.0/24 trust
host all rep_user 0.0.0.0/0 reject
20. プライマリ側の設定
$PGDATA/postgresql.confの編集
Japan PostgreSQL User's Group 20
②レプリケーション用のパラメータ設定
$ vi $PGDATA/postgresql.conf
パラメータ 設定 説明
listen_addresses * (通常はDB作成後にほぼ必須で実施)
wal_level replica レプリケーションに必要なWAL情報を生成
max_wal_senders 10 起動可能なwal senderプロセスの上限
max_replication_slots 10 作成可能なレプリケーションスロットの上限
synchronous_standby_names 任意 同期スタンバイの名前を指定
synchronous_commit on 同期レベルを指定
hot_standby on 自身がスタンバイの時に参照可能とする
hot_standby_feedback on 自身の情報をプライマリに送信
wal sender
slot ※ここまで進んだら再起動しておく
$ sudo systemctl start postgresql-10.service
21. プライマリ側の設定
$PGDATA/recovery.conf.node1の作成
Japan PostgreSQL User's Group 21
③自身がスタンバイになる際のrecovery.confを作成
$ vi $PGDATA/recovery.conf.node1
パラメータ 設定 説明
standby_mode on 起動時にスタンバイモードになる
primary_conninfo プライマリへの接続情報
primary_slot_name slot2 プライマリのレプリケーションスロット名
recovery_target_timeline latest 最新のマスターに追従する設定
wal reciever
host port user application_name
node2 5432 rep_user node1
wal sender
slot2
recovery.conf
自身がスタンバイになる際の
相手への接続情報
22. スタンバイの作成
pg_basebackupで$PGDATA配下を一括取得
Japan PostgreSQL User's Group 22
①プライマリのバックアップを取得
$ pg_basebackup -U rep_user -h <node1_ip> -p 5432 -D /home/postgres/data
$ ls -ltr $PGDATA
drwx------. 3 postgres postgres 60 Oct 28 15:44 pg_wal
drwx------. 6 postgres postgres 54 Oct 28 15:44 base
drwx------. 2 postgres postgres 4096 Oct 28 15:44 global
drwx------. 2 postgres postgres 32 Oct 28 15:44 log
-rw-------. 1 postgres postgres 22844 Oct 28 15:44 postgresql.conf
-rw-------. 1 postgres postgres 88 Oct 28 15:44 postgresql.auto.conf
-rw-rw-r--. 1 postgres postgres 169 Oct 28 15:44 recovery.conf.node1
-rw-------. 1 postgres postgres 4760 Oct 28 15:44 pg_hba.conf
pg_hba.conf
postgresql.conf
recovery.conf.node1
pg_basebackup pg_hba.conf
postgresql.conf
recovery.conf.node1 ※slot以外をコピー
23. スタンバイの作成
$PGDATA/recovery.confを作成
Japan PostgreSQL User's Group 23
②recovery.confを作成(コピーしたものを編集)
$ cp $PGDATA/recovery.conf.node1 $PGDATA/recovery.conf.node2
$ vi $PGDATA/recovery.conf.node2
$ cp $PGDATA/recovery.conf.node2 $PGDATA/recovery.conf
wal reciever
pg_hba.conf
postgresql.conf
recovery.conf.node1
パラメータ 設定 説明
standby_mode on 起動時にスタンバイモードになる
primary_conninfo プライマリへの接続情報
primary_slot_name slot1 プライマリのレプリケーションスロット名
recovery_target_timeline latest 最新のマスターに追従する設定
host port user application_name
node1 5432 rep_user node2
24. スタンバイ側の設定
プライマリでレプリケーションスロットを作成
systemctlでスタンバイを起動
Japan PostgreSQL User's Group 24
③スタンバイを起動
$ sudo systemctl start postgresql-10.service
$ su - postgres
$ ps x
11089 ? Ss 0:00 /usr/pgsql-10/bin/postmaster -D /home/postgres/data/
11093 ? Ss 0:00 postgres: startup process recovering 000000010000000000000005
11097 ? Ss 0:00 postgres: wal receiver process streaming 0/5000140
:
wal reciever
recovery.conf
wal sender
slot1
WALを送信
WALを要求
$ su - postgres
$ psql -h <node1_ip> -U postgres postgres
postgres=# select pg_create_physical_replication_slot('slot1');