PostgreSQLはストリーミングレプリケーションと呼ばれるデータコピーの仕組みがあります。マスターサーバで生成したWALをスタンバイサーバへ転送する事で高可用性と読取に対するスケールアウトを実現できます。このページではストリーミングレプリケーションの最も単純な構成を紹介します。
- PostgreSQL インストール
- PostgreSQL データベースの作成
- PostgreSQL contribモジュールの使い方
- PostgreSQL パラメタの設定方法
- PostgreSQL ベンチマークツールの紹介
- PostgreSQL WAL(Write Ahead Log)の基本説明
- PostgreSQL バックアップとリストア
- PostgreSQL PITR(Point In Time Recovery)基本概念の説明
- PostgreSQL PITR(Point In Time Recovery)操作方法の説明
- PostgreSQL PITR(Point In Time Recovery)タイムライン操作
- PostgreSQL ストリーミングレプリケーションの最小構成 (いまここ)
- PostgreSQL ストリーミングレプリケーションのパラメタ説明
- PostgreSQL ストリーミングレプリケーションの障害復旧
- PostgreSQL ストリーミングレプリケーションの多段構成
- PostgreSQL ストリーミングレプリケーションのDR向け設定
- PostgreSQL ストリーミングレプリケーションのコンフリクト
- PostgreSQL 自動バキューム(AUTO VACUUM)
- PostgreSQL HOT(Heap Only Tuple)
- PostgreSQL インデックスのメンテナンス
- PostgreSQL 統計情報の更新
- PostgreSQL 実行計画
- PostgreSQL スロークエリの調査方法
動作確認構成
以下の環境で動作確認を行います。
+----------+ +----------+ | | | | | 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レンタルショップのサンプルデータベースをプライマリサーバ側にインポートします。
createdb dvdrental 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 ~]$