PostgreSQLでのレプリケーションスロット設定

PostgreSQLでのレプリケーションスロット設定

スレイブが増えて、レプリケーションに失敗するスレイブがでてきた。タイトルの対応を実施。

どんなエラーが

こんなエラーがスレイブがわのログにでます。

<[2020-02-26 08:45:10.864 JST]   12118[2]> FATAL:  WAL ストリームからデータを受信できませんでした: ERROR:  要求さ れた WAL セグメント 0000000100000369XXXXXXXX はすでに削除されています

cp: `/var/lib/pgsql/wal/0000000100000369XXXXXXXX' を stat できません: そのようなファイルやディレクトリはありません
<[2020-02-26 08:45:15.872 JST]   12123[1]> LOG:  プライマリのタイムライン1の 369/1B000000からでWALストリーミングを始めます
<[2020-02-26 08:45:15.872 JST]   12123[2]> FATAL:  WAL ストリームからデータを受信できませんでした: ERROR:  要求さ れた WAL セグメント 0000000100000369XXXXXXXX はすでに削除されています

削除されていますってwalはちゃんと存在しています。

マスタ側のpostgresql.confを編集

以下の一行を追加。

max_replication_slots = 10

存在するスレイブサーバ以上の数字を指定する。
でもってpostgresql再起動。

マニュアルどおりに設定。

なんでselectで設定できるんだ?よくわからないけど、マニュアルどおりに。

postgres=# select * from pg_create_physical_replication_slot('repl_slot');
 slot_name | xlog_position
-----------+---------------
 repl_slot |
(1 行)

postgres=# select * from pg_replication_slots ;
 slot_name | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn | co
nfirmed_flush_lsn
-----------+--------+-----------+--------+----------+--------+------------+------+--------------+-------------+---
------------------
 repl_slot |        | physical  |        |          | f      |            |      |              |             |
(1 行)

スレイブの方にもちょっと設定

recovery.confに一行追加。

primary_slot_name = 'repl_slot'