[英]Avoiding data duplication with Logical replication ( PostgreSQL 10)
我已經使用 pcsd 配置為兩台服務器配置了冗余設置。 兩台機器都包含 Postgres 10 和邏輯復制。 以下步驟用於邏輯復制設置。
CREATE PUBLICATION my_publication FOR ALL TABLES;
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=Server1 port=5432 password=postgres user=postgres dbname=database1'
PUBLICATION my_publication WITH (copy_data = false);
經過上述步驟后,我可以看到服務在兩個系統(冗余系統)上都運行良好。 但是從日志中我可以看到以下錯誤消息。
...
2020-01-08 15:14:08.551 EET >LOG: logical replication apply worker for subscription "my_subscription" has started
2020-01-08 15:14:08.559 EET >ERROR: duplicate key value violates unique constraint "pk_xyz_instance"
2020-01-08 15:14:08.559 EET >DETAIL: Key (xyz_instance_id)=(103) already exists.
2020-01-08 15:14:08.560 EET >LOG: worker process: logical replication worker for subscription 23176 (PID 7411) exited with exit code 1
....
由於我需要 Server1 的早期數據,我將轉儲並將其恢復到其他服務器上,並使用 copy_data 為 false 以避免重復。
在每次從 Server1 到 Server2 或反之的服務切換后,這些獨特的約束違反錯誤會出現在 Server2 上(其中服務處於非活動狀態)
在使用 PostgreSQL 10.11 設置復制時,我在這里遺漏了什么嗎?
copy_data 標志沒有按我的預期工作嗎?
使用異步復制,備用數據庫在故障轉移點滯后並且一些事務丟失總是可能發生的。 如果您嘗試使用舊的主服務器(可能會提前一些事務)作為新的備用服務器,那么數據庫可能會不一致,並且可能會發生您觀察到的復制沖突。
一種解決方案是使用同步邏輯復制,但這會降低可用性,除非您有多個備用服務器。
最好是使用物理復制。 它不僅更簡單、更pg_rewind
,而且您還可以使用pg_rewind
將舊的主服務器快速轉變為新的備用服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.