このマニュアルでpostgresのマスターノードとスレーブノードをインストールしました:
マスター(10.0.0.1)で:
Sudo -u postgres initdb -D /data/postgres/main
Postgresql.confを変更します。
listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 2
logging_collector = on
max_wal_senders = 5
Pg_hba.confにレプリケーションのレコードを追加します。
Host replication replica 10.0.0.2/32 md5
次にpostgresを起動します
service postgresql start
複製ユーザーを作成します。
CREATE USER replica WITH REPLICATION ENCRYPTED PASSWORD '123456';
そしてレプリケーションスロットを追加します:
SELECT pg_create_physical_replication_slot('standby_slot');
スレーブ(10.0.0.2)で:
pg_basebackup -h 10.0.0.1 -U replica -D /db/postgres/main -X s -P
Postgresql.confで状態をスタンバイに変更します。
hot_standby = on
Recovery.confを追加します。
standby_mode = 'on'
primary_conninfo = 'Host=10.0.0.1 port=5432 user=replica password=123456'
primary_slot_name = 'standby_slot'
trigger_file = 'trigger'
スタンバイを開始します。
service postgresql start
したがって、レプリケーションは正常に機能しています。データベースを作成すると、マスターとスレーブの両方に表示されます。
スレーブがダウンしてから開始すると、すべての変更がそこに反映されます。それもすべて大丈夫です。
しかし、マスターがダウンしている場合は問題があります。停止したら、スレーブでトリガーファイルを作成します。次に、スレーブに別のデータベースを作成します。これが現在プライマリです。その後、マスターを開始し、ファイルを自動的に削除し、recovery.confの名前を自動的にrecovery.doneに変更します。 OK。しかし、スレーブ(新しいプライマリ)からマスター(古いプライマリ)への変更を同期する方法は?
次の4つの手順を実行する必要があることがわかりました。
マスター:
Postgresを停止します。
service postgresql stop
スレーブで:
バックアップモードをオンにします。
SELECT pg_backup_start('backup', true);
次に、新しいデータをスレーブからマスターにrsyncします。
次に、バックアップモードをオフにします。
SELECT pg_backup_stop();
最後のステップの後、メッセージが表示されます
NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
そして、私がマスターを開始すると、ログメッセージで開始されません:
FATAL: could not locate required checkpoint record
マスターで新しいデータを取得して再びプライマリにする方法がわかりません。
したがって、将来的には、バランスとフェイルオーバーのためにpgpool2をインストールする予定ですが、このメカニズムがどのように機能するかわからないため、テストインストールは機能しませんでした。
言われているように、単に古いマスターに戻ることはできません here :
スタンバイへのフェイルオーバーが発生すると、稼働中のサーバーは1つだけになります。これは縮退状態と呼ばれます。以前のスタンバイは現在プライマリですが、以前のプライマリはダウンしており、ダウンしたままになる可能性があります。通常の操作に戻るには、スタンバイサーバーを、元のプライマリシステムが起動したとき、または3番目の、場合によっては新しいシステムに再作成する必要があります。
このためには、recovery.conf
古いマスター。これは、現在のものとほとんど同じである必要があります。接続のみが他の場所を指している必要があります。