2つの個別のインスタンスがあります。どちらもUbuntu 14.04サーバーで実行されています。
どちらも以下の方法でpostgres 9.5をインストールしています。
Sudo apt-get install software-properties-common python-software-properties
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | Sudo apt-key add -
Sudo apt-get update
apt-get -y install postgresql-9.5
バージョンは9.5.10です
次に、マスターデータベースを表すインスタンスにflanders
、スタンバイを表すインスタンスにwillie
という名前を付けました
私は両方のインスタンスをpsql
でpostgresユーザーでテストしました。
バージョン2.0はpostgres 10用であるため、両方のインスタンスに omnipitr-1.3.3のtarファイル をダウンロードしました。
flanders
の/etc/postgresql/9.5/main/postgresql.conf
で、次のように設定しました。
wal_level = hot_standby
archive_mode = on
archive_command = '/var/lib/postgresql/omnipitr-1.3.3/bin/omnipitr-archive -D /var/lib/postgresql/9.5/main -l /var/log/omnipitr/archive-^Y-^m-^d.log -dr willie-postgres:/var/lib/postgresql/master_wal_archive -s /var/lib/postgresql/.omnipitr/ "%p"'
archive_timeout = 120
max_wal_senders = 2
omnipitr-archive
スクリプトは、2分ごとにwillie
を使用してpostgres
にWALファイルを正常に送信し、/var/lib/postgresql/master_wal_archive
内に残します
次に、pg_basebackup
を使用してflanders
でマスターデータベースをバックアップし、postgresを停止して2分ごとの継続的なアーカイブを停止します
flanders
で
postgres@flanders:~$ pg_basebackup -D backup -Ft -z -P -x
これにより、base.tar.gz
内に/var/lib/postgresql/backup
が作成されます
次に、rsyncを使用してベースファイルをwillie
に送信します。
service postgresql stop
を使用して、rootとしてウィリーでpostgresを停止しました。次に、postgres
ユーザーとして次を実行します。
rm -rf /var/lib/postgresql/9.5/main/*
tar -xvC /var/lib/postgresql/9.5/main -f /var/lib/postgresql/base.tar.gz
rootユーザーとして戻って、service postgresql start
を使用してpostgresをオンにしました
Postgresユーザーとpsqlとして参加し、はい、データベースデータはマスターデータベースとまったく同じミラーになりました。
ここまでは順調ですね。
ここで私は問題を抱え始めます。
Postgresを停止して/var/lib/postgresql/9.5/mainに移動し、recovery.confを作成しました
このrecovery.conf内には、次のものしかありません。
standby_mode = on
restore_command='/var/lib/postgresql/omnipitr-1.3.3/bin/omnipitr-restore -l /var/log/omnipitr/restore.log -s /var/lib/postgresql/master_wal_archive/ %f %p'
どちらから取得するか https://github.com/omniti-labs/omnipitr/blob/master/doc/omnipitr-restore.pod#minimal-setup
次に、rootユーザーに移動してpostgresを起動します。通常より時間がかかりましたが、OKサインが出ました。
次に、postgresとpsqlに行ってみました。データベースの起動に関する致命的なエラーが発生しました。
次に、postgresログファイルを確認したところ、次のようになりました。
2018-02-10 17:34:53.185 CST [3896] LOG: could not bind IPv6 socket: Cannot assign requested address
2018-02-10 17:34:53.185 CST [3896] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2018-02-10 17:34:53.197 CST [3897] LOG: database system was shut down at 2018-02-10 17:30:10 CST
2018-02-10 17:34:53.198 CST [3897] LOG: entering standby mode
2018-02-10 17:34:53.679 CST [3900] [unknown]@[unknown] LOG: incomplete startup packet
2018-02-10 17:34:54.184 CST [3903] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:54.690 CST [3906] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:55.197 CST [3909] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:55.703 CST [3912] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:56.209 CST [3915] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:56.716 CST [3918] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:57.222 CST [3921] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:57.728 CST [3924] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:58.235 CST [3927] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:58.741 CST [3930] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:59.248 CST [3933] postgres@postgres FATAL: the database system is starting up
2018-02-10 17:34:59.250 CST [3934] [unknown]@[unknown] LOG: incomplete startup packet
さて、私はhot_standby
内で/etc/postgresql/9.5/main/postgresql.conf
をオンにする必要があることに気付きました
hot_standby = on
次に、ルートとしてservice postgresql start
を実行すると、OKサインが表示されませんでしたが、
2018-02-10 18:05:15.024 CST [4127] LOG: could not bind IPv6 socket: Cannot assign requested address
2018-02-10 18:05:15.024 CST [4127] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2018-02-10 18:05:15.037 CST [4128] LOG: database system was interrupted while in recovery at 2018-02-10 18:03:55 CST
2018-02-10 18:05:15.037 CST [4128] HINT: This probably means that some data is corrupted and you will have to use the last backup for recovery.
2018-02-10 18:05:15.518 CST [4129] [unknown]@[unknown] LOG: incomplete startup packet
2018-02-10 18:05:15.924 CST [4128] LOG: entering standby mode
2018-02-10 18:05:15.924 CST [4128] LOG: database system was not properly shut down; automatic recovery in progress
2018-02-10 18:05:15.926 CST [4128] WARNING: WAL was generated with wal_level=minimal, data may be missing
2018-02-10 18:05:15.926 CST [4128] HINT: This happens if you temporarily set wal_level=minimal without taking a new base backup.
2018-02-10 18:05:15.926 CST [4128] FATAL: hot standby is not possible because wal_level was not set to "hot_standby" or higher on the master server
2018-02-10 18:05:15.926 CST [4128] HINT: Either set wal_level to "hot_standby" on the master, or turn off hot_standby here.
2018-02-10 18:05:15.927 CST [4127] LOG: startup process (PID 4128) exited with exit code 1
2018-02-10 18:05:15.927 CST [4127] LOG: aborting startup due to startup process failure
では、スタンバイサーバーを起動するときにどこで問題が発生したのでしょうか。
回答の1つで示唆されているように、recovery.conf
を/var/lib/postgresql/9.5/main
に追加して、postgresをユーザーroot
として起動しようとしました。
同じ結果。
recovery.conf
ファイルを作成する前に、データベースを起動して停止してはなりません。 recovery.confを使用せずにデータベースを起動すると、書き込み使用のために開かれるか、または試みられ、それ以上ログファイルを再生する資格がなくなります。 (なぜそれがwal_level = minimalに関する正確なエラーメッセージにつながったのか理解していませんが)。
recovery.conf
の直後にtar -x
を作成します。