Postgresql 9.3 熱備上的日誌傳送
我的設置
我剛剛在 postgres 中第一次(9.3.5)設置了流複製,當流按預期工作時,我正在努力讓我的備用伺服器執行 archive_command,以便我可以儲存所有日誌文件。
掌握 postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 max_wal_senders = 4 wal_keep_segments = 8
備用 postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 archive_mode = on archive_command = 'test ! -f /backup/postgres_archive/constant/%f && cp %p /backup/postgres_archive/constant/%f' max_wal_senders = 3 wal_keep_segments = 8 hot_standby = on
備用recovery.conf:
standby_mode = 'on' primary_conninfo = 'host=my-host.example.com port=5432 user=replicator password=my_password sslmode=require' restore_command = 'cp /backup/postgres_archive/constant/%f %p' trigger_file = '/tmp/postgresql.trigger'
我嘗試寫入的文件夾的權限是正確的,並且當我手動執行它時 archive_command 工作正常,因為使用者 postgres 正在執行。可以肯定的是,我嘗試將存檔命令更改為簡單的觸摸(再次,作為 postgres 使用者測試良好),但它沒有任何區別。
正在工作的事情
我的數據庫仍處於相對起步階段,因此根本沒有太多負載。為此,我只是通過將隨機數據寫入測試表來模擬它。在我送出 master 之後,我可以看到更改立即出現在備用數據庫中,所以我對此很滿意。
我不太明白的一件事是 WAL 文件是備用文件,而主文件略有不同,但看起來好像一個或另一個已經配置了一個尚未開始寫入的 WAL(這不是在另一)。這正常嗎?
如果我
select pg_switch_xlog()
在主伺服器上做,然後再寫一些,主伺服器和備用伺服器似乎都會切換並開始寫入下一個/相同的 WAL 文件。所以這反映了我對正在發生的事情的理解。幫助
我對這一切有幾個問題。我已經閱讀了有關此問題的 postgres 手冊的每一頁,但在我的特定情況下我找不到任何幫助。
我嘗試找到某種獲取 postgres 的方法,以向我展示有關它在日誌文件中可能在做什麼/不做什麼的更多資訊,但它沒有提供任何有用的資訊。在調試時,我應該在配置中進行哪些更改以盡可能多地將有用的資訊寫入日誌?
就日誌歸檔何時執行而言,我猜是因為 master 有點控制哪個 WAL 文件處於活動狀態,它實際上是日誌傳送何時應該在備用伺服器上執行的觸發器。那是對的嗎?
流複製似乎都像我預期的那樣工作,但嘗試在備用數據庫上執行日誌傳送似乎甚至都沒有嘗試過。我究竟做錯了什麼?
我也剛剛遇到這個問題。這裡的關鍵其實是
archive_cleanup_command
在standby上的“recovery.conf”。備用伺服器將在archive_cleanup_command
完成處理來自主伺服器的 WAL 段時執行該命令,因此此時您知道您可以備份該 WAL 段和所有先前的段。在我的“recovery.conf”中,我有:archive_cleanup_command = '/var/lib/postgresql/wal_backup_mirror.sh "%r"'
該腳本的內容是(簡化版):
CURRENT_WAL_FILE="$1" for WAL_FILE in $(find /pg_logs/main -maxdepth 1 -type f | sort | awk "\$0 <= \"/pg_logs/main/${CURRENT_WAL_FILE}\""); do WAL_NAME=$(basename "$WAL_FILE") gzip -c "$WAL_FILE" > "/backups/wal/${WAL_NAME}.gz" #now upload the just created .gz to S3 or some other offsite storage rm -f "${WAL_FILE}" done
請注意,我在備份 WAL 段後刪除了它,以保持備用數據庫上的日誌目錄乾淨,但需要注意的是要小心級聯複製設置,因為更下游的備用數據庫可能仍然需要那些文件。
最後一點,請記住備份 WAL 段是不夠的,它必須與某種正常完整備份 (pg_basebackup) 結合使用。我們每天進行完整備份,然後根據需要全天備份 WAL 段。