PostgreSQLのレプリケーションセット~pg_stat_replicationの確認まで~
システムに欠かせないミドルウェアの世界

中山テック 代表の中山です。

さて、ちょっと勘違いしていたのですがpgpoolの導入により完全なるレプリケーションがセットされると思い込んでいました。

しかし、pgpoolポートでDBアクセスし、selectすると差分が出るのでレプリケーションしきれてないことが判明。

参考サイト







  • VMware × CentOS関連索引

PostgreSQLを止める

systemctl stop postgresql-15

トランザクションが入ってこないように一旦止めます。

再起動はどのみち必要なのもありますが・・・

postgresql.confの編集

vi /var/lib/pgsql/15/data/postgresql.conf

◆下記の設定を行う

synchronous_commit = on # フェイルオーバーを意識する場合はlocalでも。どちらかが落ちると動かなくなる(WAL完全同期のため)ので注意
synchronous_standby_names = '*' # 全て受け入れる
hot_standby = on
wal_keep_size = 480
archive_mode = always
archive_command = 'cp "%p" "/var/lib/pgsql/15/archivedir/%f"'
archive_cleanup_command = '/usr/pgsql-15/bin/pg_archivecleanup /var/lib/pgsql/15/archivedir %r'
primary_conninfo = 'user=repl passfile=''/home/postgres/.pgpass'' channel_binding=prefer host=192.168.230.128 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any' # hostはPRIMARY側のIPを指定

「synchronous_standby_names」はapplication名を指定することもできます。

今回は*でStanbyモードのPostgreSQLを全指定という形です。

PostgreSQLをスタート

systemctl start postgresql-15.service

作業量はそこまでありません。

理解するまでが大変な内容です・・・

副系の設定

PostgreSQLを止める

systemctl stop postgresql-15

主系と同様なので細かい説明は割愛。

pg_basebackupで主系からdataをコピー

mv /var/lib/pgsql/15/data /var/lib/pgsql/15/data_20240301
mkdir data
chown -R postgres:postgres data
chmod 700 data
sudo su - postgres

pg_basebackup -R -D /var/lib/pgsql/15/data/ -U repl -h 192.168.230.128

※事前にreplユーザの登録が必要です

systemctl start postgresql-15.service

副系は「pg_basebackup」でdata配下にデータを配置して一旦同期を取ります。

postgresql.confの修正

# 下記の項目をコメントアウト

#listen_addresses = '*'
#max_wal_senders = 10
#synchronous_commit = on

レプリケーション確認

============ 主系の起動ログ ============

 postgresql-15.service - PostgreSQL 15 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
   Active: active (running) since 火 2024-03-12 16:51:45 JST; 21s ago
     Docs: https://www.postgresql.org/docs/15/static/
  Process: 8465 ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 8471 (postmaster)
    Tasks: 9
   CGroup: /system.slice/postgresql-15.service
           tq8471 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
           tq8473 postgres: logger
           tq8474 postgres: checkpointer
           tq8475 postgres: background writer
           tq8481 postgres: archiver last was 0000000D.history
           tq8491 postgres: walwriter
           tq8492 postgres: autovacuum launcher
           tq8493 postgres: logical replication launcher
           mq8506 postgres: walsender repl 192.168.230.129(56582) streaming 0/9F0000D8

============ 副系の起動ログ ============
 postgresql-15.service - PostgreSQL 15 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2024-03-13 01:51:56 JST; 3s ago
     Docs: https://www.postgresql.org/docs/15/static/
  Process: 5936 ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 5944 (postmaster)
    Tasks: 7
   CGroup: /system.slice/postgresql-15.service
           tq5944 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
           tq5946 postgres: logger
           tq5947 postgres: checkpointer
           tq5948 postgres: background writer
           tq5949 postgres: startup recovering 0000000D000000000000009F
           tq5954 postgres: archiver last was 0000000D.history
           mq5970 postgres: walreceiver streaming 0/9F0000D8

起動時、主系は「walsender~」と出ていること。

副系は「walreceiver~」と出ていれば同期を取る体制が整ったことになります。

このようにシンクロされていればOKです!

※postgresユーザで「psql -x -c "select * from pg_stat_replication"」と入力すると見やすいです

walsender側(主系)で確認しましょう。

試す

◆主系
select * from login_table ;

         mail_address         |   password
------------------------------+--------------
 a_nakayama@nakayama-tech.com | nakayamatest
 nakayamatech2017@gmail.com   | riben731
 nakayama                     | nakayama
 aho1496                      | riben731
(4 行)

◆副系

nakayama=# select * from login_table ;
         mail_address         |   password
------------------------------+--------------
 a_nakayama@nakayama-tech.com | nakayamatest
 nakayamatech2017@gmail.com   | riben731
 nakayama                     | nakayama
 aho1496                      | riben731
(4 行)

pg_basebackupでデータを同期したので当然同じです。

ではinsertで追加してみましょう。

insert into login_table values ('aaaaaa','bbbbbb');
INSERT 0 1

ほいでは結果を確認します。

◆主系
select * from login_table ;
         mail_address         |   password
------------------------------+--------------
 a_nakayama@nakayama-tech.com | nakayamatest
 nakayamatech2017@gmail.com   | riben731
 nakayama                     | nakayama
 aho1496                      | riben731
 aaaaaa                       | bbbbbb
(5 行)

◆副系
select * from login_table ;
         mail_address         |   password
------------------------------+--------------
 a_nakayama@nakayama-tech.com | nakayamatest
 nakayamatech2017@gmail.com   | riben731
 nakayama                     | nakayama
 aho1496                      | riben731
 aaaaaa                       | bbbbbb
(5 行)

OK!問題ありません!



まとめ

※中山テックに掲載しているゲーム画像の著作権、商標権、その他知的財産権は、当該コンテンツの提供元に帰属します


おすすめの記事