中山テック 代表の中山です。
さて、ちょっと勘違いしていたのですがpgpoolの導入により完全なるレプリケーションがセットされると思い込んでいました。
しかし、pgpoolポートでDBアクセスし、selectすると差分が出るのでレプリケーションしきれてないことが判明。
Contents
主系の設定
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!問題ありません!
まとめ
pgpoolでもpostgresqlでも可能なレプリケーション。
しっかり相互にデータを同期するのは、冗長構成としては必須の機能となっております。
もし詰まっている方がいらっしゃったら是非参考にしてください!