簡體   English   中英

使用邏輯復制(PostgreSQL 10)避免數據重復

[英]Avoiding data duplication with Logical replication ( PostgreSQL 10)

我已經使用 pcsd 配置為兩台服務器配置了冗余設置。 兩台機器都包含 Postgres 10 和邏輯復制。 以下步驟用於邏輯復制設置。

  • 使用 pg_dump 命令在 Server1 上進行 PG Dump。
  • 使用 pg_restore 使用 postgres 10 在 Server2 上恢復它。
  • 在 pg_hba.conf 和 postgres.conf 文件中進行了更改。
  • 使用以下命令設置邏輯復制。
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM