將整個 PostgreSQL 集群複製到另一個(相同的)伺服器
我希望將 PostgreSQL 10 集群從server1複製到server2,它在相同的硬體上執行相同的 Postgres 版本。目的是負載平衡和HA。要記住的事情:
- 數據庫非常大(TB),網路非常好。我想避免使用中間文件。
- 複製實時數據庫會很酷,但如果需要,我也可以關閉集群。
我考慮過的選項:
pg_dump | psql
當然,但這需要重新創建索引,並且對於相同系統之間的完整副本來說似乎真的很慢而且效率極低。- 將server2設置為從屬流複製,等待它與server1同步,然後重新配置兩者以再次禁用複制(我不需要它)。似乎是一堆毫無意義的配置工作,有錯誤的餘地。
- 關閉集群、
rsync
所有 Postgres 文件夾和文件。有這麼多數據存在數據損壞的風險,我需要確保我得到了所有東西(大概只有數據目錄是不夠的)。- 我可以
pg_basebackup
直接通過管道以pg_receivewal
某種方式完成這項工作嗎?找不到我的案例的說明。**最好的方法是什麼?**似乎是一個很常見的情況。
要走的路是普通格式
pg_basebackup
。只要確保,
--wal-method=stream
備份將包含所有必需的 WAL 文件。然後在備份目錄上啟動伺服器,它會執行恢復並上來。
沒必要亂來
pg_receivewal
。
您的選項 1
pg_dump | psql
確實有您描述的限制。您的選項2沒有多大意義。您需要從複製開始以設置流式傳輸,並且當您擁有複製時,您就不需要流式傳輸,因為您已經有了複製。此外,您不必“重新配置兩者以再次禁用複制”。當您提升備用數據庫時,它不再是備用數據庫,不再需要重新配置。如果您在主伺服器上使用了命名插槽,則只需將其刪除即可。如果您使用臨時插槽,您甚至不需要這樣做。如果您想為自己創建額外的工作,您可以將“wal_level”降低到“minimal”,如果您想為自己創建額外的工作,您可以將“max_wal_senders”設置為 0。所以不要做那些事情。以允許未來流複製的方式配置主節點。
您在選項 3 中的擔憂也沒有任何意義。為什麼對數據進行 rsync 處理比對 TB 數據執行的任何其他操作(例如普通備份,甚至只是執行數據庫)更容易損壞?Rsync 不會竭盡全力破壞您的數據。如果您需要的不僅僅是數據目錄,那麼首先取決於系統的配置方式。你有表空間嗎?是數據目錄中的配置文件,還是其他地方。如果你做這些事情,那麼是的,你必須處理它們。當您決定放棄最簡單的配置時,這就是您註冊的內容。
在選項 4 中,“pg_basebackup”的輸出不會通過管道傳送到“pg_receivewal”。它們並非旨在以這種方式協同工作。“pg_basebackup”已經可以創建一個獨立的目錄,這是你想要的,所以你可以使用它。我想你想在你希望新伺服器所在的主機上執行,
pg_basebackup -D newdir -F plain -h prod_host.example.com
您目前如何備份數據庫?進行複製的最佳方法可能是利用您目前的備份策略。如果需要,您將如何從備份中恢復?對它的小改動應該可以讓你複製(以及測試你目前的備份策略是否有效)