PostgreSQL 13 ストリーミングレプリケーションの最小構成

スポンサーリンク

PostgreSQLはストリーミングレプリケーションと呼ばれるデータコピーの仕組みがあります。マスターサーバで生成したWALをスタンバイサーバへ転送する事で高可用性と読取に対するスケールアウトを実現できます。このページではストリーミングレプリケーションの最も単純な構成を紹介します。

動作確認構成

以下の環境で動作確認を行います。

 +----------+          +----------+
 |          |          |          |
 | centos10 +----------+ centos11 |
 | (primary)|          | (standby)|
 +----------+          +----------+
192.168.56.10/24   192.168.56.11/24

プライマリ側の設定

postgresql.conf

ストリーミングレプリケーションの構成を構築するに当たり、プライマリサーバに必要となる最低限の設定は以下の通りです。

PostgreSQL 13でデフォルトから変更する必要がある最小限のパラメタは以下の通りです。バージョンによってデフォルト設定は異なる事に留意ください。

オプション 意味
listen_addresses listen状態にするIPアドレスを指定。デフォルトでは127.0.0.1(localhost)のみ接続を許可
max_wal_senders WAL senderプロセス数を定義。接続するスタンバイサーバ以上にする必要がある
synchronous_standby_names マスターに接続するスタンバイサーバのapplication_nameを定義

postgresql.confに以下を加筆します。

synchronous_standby_namesに指定するのはホスト名でも名前解決名でもなく、スタンバイサーバ側に設定するapplication_nameです。

# vi /var/lib/pgsql/13/data/postgresql.conf 

listen_addresses = '0.0.0.0'
max_wal_senders = 10
synchronous_standby_names = 'centos11'

再起動し設定を反映させます。

systemctl restart postgresql-13.service 

0.0.0.0に対してListen状態である事を確認します。

[root@centos10 ~]# ss -ano | grep 5432
u_str              LISTEN              0                    128                                                     /tmp/.s.PGSQL.5432 25253                  * 0                                                                               
u_str              LISTEN              0                    128                                      /var/run/postgresql/.s.PGSQL.5432 25251                  * 0                                                                               
tcp                LISTEN              0                    128                                                                0.0.0.0:5432             0.0.0.0:*                                                                               
[root@centos10 ~]# 

pg_hba.conf

pg_hba.confを編集し、スタンバイサーバからの接続が可能になるように設定します。

# vi /var/lib/pgsql/13/data/pg_hba.conf

host    replication     postgres        192.168.56.11/32  trust

再起動し設定を反映させます。

systemctl restart postgresql-13.service 

スタンバイサーバ側の設定

データベースの初期同期

pg_basebackupコマンドを使用して、プライマリサーバのデータをスタンバイサーバへコピーします。この時、-Rオプションを指定すると、postgresql.auto.confにprimary_conninfoのパラメタが加筆されます。

rm -rf ${PGDATA}/*
pg_basebackup -R -D ${PGDATA} -h 192.168.56.10

primary_conninfo

postgresql.auto.confをテキストエディタで開きます。pg_basebackupコマンド実行によって、postgresql.auto.confが自動生成されます。この自動生成されたパラメタの末尾にapplication_nameを加筆します。

ここで加筆する値は、プライマリ側に設定したsynchronous_standby_namesと一致させる必要があります。

# vi /var/lib/pgsql/13/data/postgresql.auto.conf 

primary_conninfo = 'user=postgres <omitted> application_name=centos11'

postgresql.conf

pg_basebackupを使用すると、プライマリサーバの設定がそのままコピーされてしまいます。プライマリ固有の設定をコメントアウトします。

# vi /var/lib/pgsql/13/data/postgresql.conf

#listen_addresses = '0.0.0.0'
#max_wal_senders = 10
#synchronous_standby_names = 'centos11'

レプリケーションの開始

レプリケーション開始後のログ確認

スタンバイ側のpostgresqlを起動すると、レプリケーションが開始されます。

[root@centos11 ~]# systemctl start postgresql-13.service 
[root@centos11 ~]# 

マスターサーバ側ではスタンバイ側の接続を受け付けた旨のログが出力され、さらにwal senderプロセスが起動します。

[root@centos10 ~]# tail /var/lib/pgsql/13/data/log/postgresql-Fri.log 
2020-12-25 18:07:38.286 JST [1187] LOG:  バックグラウンドワーカ"logical replication launcher" (PID 1197)は終了コード1で終了しました
2020-12-25 18:07:38.286 JST [1192] LOG:  シャットダウンしています
2020-12-25 18:07:38.297 JST [1187] LOG:  データベースシステムはシャットダウンしました
2020-12-25 18:07:38.357 JST [1245] LOG:  PostgreSQL 13.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64-bit を起動しています
2020-12-25 18:07:38.357 JST [1245] LOG:  IPv4アドレス"0.0.0.0"、ポート5432で待ち受けています
2020-12-25 18:07:38.361 JST [1245] LOG:  Unixソケット"/var/run/postgresql/.s.PGSQL.5432"で待ち受けています
2020-12-25 18:07:38.364 JST [1245] LOG:  Unixソケット"/tmp/.s.PGSQL.5432"で待ち受けています
2020-12-25 18:07:38.369 JST [1249] LOG:  データベースシステムは 2020-12-25 18:07:38 JST にシャットダウンしました
2020-12-25 18:07:38.372 JST [1245] LOG:  データベースシステムの接続受け付け準備が整いました
2020-12-25 18:18:48.368 JST [1370] LOG:  スタンバイ"centos11"は優先度1の同期スタンバイになりました
[root@centos10 ~]#
[root@centos10 ~]# 
[root@centos10 ~]# 
[root@centos10 ~]# ps aux | grep sender
postgres    1370  0.0  0.4 498340  9092 ?        Ss   18:18   0:00 postgres: wasender postgres 192.168.56.11(40810) streaming 0/3000148
root        1391  0.0  0.0 221904  1088 pts/0    S+   18:21   0:00 grep --color=auto sender
[root@centos10 ~]# 

スタンバイサーバ側ではストリーミングが開始された旨のログが出力されます。

[root@centos11 ~]# tail /var/lib/pgsql/13/data/log/postgresql-Fri.log 
2020-12-25 18:18:48.076 JST [1378] LOG:  IPv6アドレス"::1"、ポート5432で待ち受けています
2020-12-25 18:18:48.076 JST [1378] LOG:  IPv4アドレス"127.0.0.1"、ポート5432で待ち受けています
2020-12-25 18:18:48.079 JST [1378] LOG:  Unixソケット"/var/run/postgresql/.s.PGSQL.5432"で待ち受けています
2020-12-25 18:18:48.083 JST [1378] LOG:  Unixソケット"/tmp/.s.PGSQL.5432"で待ち受けています
2020-12-25 18:18:48.086 JST [1381] LOG:  データベースシステムは中断されました: 2020-12-25 18:11:47 JST まで動作していたことは確認できます
2020-12-25 18:18:48.246 JST [1381] LOG:  スタンバイモードに入ります
2020-12-25 18:18:48.250 JST [1381] LOG:  REDOを0/2000028から開始します
2020-12-25 18:18:48.252 JST [1381] LOG:  0/2000138 でリカバリの一貫性が確保されました
2020-12-25 18:18:48.252 JST [1378] LOG:  データベースシステムはリードオンリー接続の受け付け準備ができました
2020-12-25 18:18:48.303 JST [1385] LOG:  プライマリのタイムライン1の 0/3000000からでWALストリーミングを始めます
[root@centos11 ~]# 

テストデータの投入

動作確認のため、「PostgreSQLのチュートリアル」から、DVDレンタルショップのサンプルデータベースをプライマリサーバ側にインポートします。

wget https://sp.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip
unzip dvdrental.zip
createdb dvdrental
pg_restore -d dvdrental dvdrental.tar

確かにプライマリ側のデータがスタンバイへレプリケーションされている事を確認します。

[postgres@centos11 ~]$ psql dvdrental -c "SELECT * FROM actor LIMIT 5"
 actor_id | first_name |  last_name   |      last_update       
----------+------------+--------------+------------------------
        1 | Penelope   | Guiness      | 2013-05-26 14:47:57.62
        2 | Nick       | Wahlberg     | 2013-05-26 14:47:57.62
        3 | Ed         | Chase        | 2013-05-26 14:47:57.62
        4 | Jennifer   | Davis        | 2013-05-26 14:47:57.62
        5 | Johnny     | Lollobrigida | 2013-05-26 14:47:57.62
(5 rows)

[postgres@centos11 ~]$ 
タイトルとURLをコピーしました