openGauss 釋出訂閱

奔跑的数据库發表於2024-03-30

釋出訂閱

可獲得性

本特性自openGauss 3.0.0版本開始引入。

特性簡介

釋出訂閱基於邏輯複製實現,其中有一個或者更多訂閱者訂閱一個釋出者節點上的一個或者更多釋出。訂閱者從它們所訂閱的釋出拉取資料。實現叢集間的資料實時同步。

客戶價值

釋出訂閱的典型使用場景是:

  • 在一個資料庫或者一個資料庫的子集中發生更改時,把增量的改變傳送給訂閱者。

  • 在更改到達訂閱者時引發觸發器。

  • 把多個資料庫聯合到單一資料庫中(例如用於分析目的)。

特性描述

釋出者上的更改會被實時傳送給訂閱者。訂閱者以與釋出者相同的順序應用那些資料,這樣在一個訂閱中能夠保證釋出的事務一致性。這種資料複製的方法有時候也被稱為事務性複製。

訂閱者資料庫的行為與任何其他openGauss例項相同,並且可以被用作其他資料庫的釋出者,只需要定義它自己的釋出。當訂閱者被應用當作只讀時,單一的訂閱中不會有衝突。在另一方面,如果應用或者對相同表集合的訂閱者執行了其他的寫動作,衝突可能會發生。

特性增強

3.1.0版本對該特性做了以下增強。

  • 支援gs_probackup備份釋出端的邏輯複製槽,使得釋出端使用gs_probackup備份恢復後複製槽不丟失,保證釋出訂閱的連線正常。

  • 支援釋出訂閱同步基礎資料。當在建立釋出訂閱關係之前,釋出端的表中已存在資料,這部分基礎資料在建立訂閱之後會同步到訂閱端。

  • 支援以二進位制格式傳送資料。釋出端和訂閱端之間傳輸資料可以使用二進位制的格式進行傳輸,而不是隻能使用文字格式進行傳輸。

  • 支援釋出端主備切換不斷開。釋出端發生主備切換後,訂閱端能夠自動連線到新的釋出端主機,而無需手動修改訂閱端的連線資訊。

5.1.0版本對該特性做了以下增強。

  • 支援釋出訂閱衝突自主解決。當訂閱端同步資料時遇到主鍵或唯一鍵衝突時,資料庫透過引數配置進行報錯、保留本地或者應用遠端。

特性約束

釋出訂閱基於邏輯複製實現,繼承所有邏輯複製的限制,同時釋出訂閱還有下列額外的限制或者缺失的功能。

  • 資料庫模式和DDL命令不會被複制。初始模式可以手工使用gs_dump --schema-only進行複製。後續的模式改變需要手工保持同步。

  • 序列資料不被複制。後臺由序列支撐的serial或者標識列中的資料當然將被作為表的一部分複製,但是序列本身在訂閱者上仍將顯示開始值。如果訂閱者被用作一個只讀資料庫,那麼這通常不會是什麼問題。不過,如果訂閱者資料庫預期有某種轉換或者容錯,那麼序列需要被更新到最後的值,要麼透過從釋出者複製當前資料的防範(也許使用gs_dump),要麼從表本身決定一個足夠高的值。

  • 只有表支援複製,包括分割槽表。試圖複製其他型別的關係,例如檢視、物化檢視或外部表,將會導致錯誤。

  • 同一資料庫內的多個訂閱不應當訂閱內容重複的釋出(指釋出相同的表),否則會產生資料重複或者主鍵衝突。

  • 如果被髮布的表中包含不支援btree/hash索引的資料型別(如地理型別等),那麼該表需要有主鍵,才能成功的複製UPDATE/DELETE操作到訂閱端。否則複製會失敗,同時訂閱端會出現“FATAL: could not identify an equality operator for type xx”的日誌。

依賴關係

釋出訂閱依賴邏輯複製功能。

相關文章