Postgresql

Postgresql 9.3 熱備上的日誌傳送

  • February 21, 2015

我的設置

我剛剛在 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 段。

引用自:https://serverfault.com/questions/637129