本節包含下列資訊:
- Datastream 處理從來源 PostgreSQL 資料庫擷取資料的方式
- Datastream 支援的 PostgreSQL 資料庫版本
- 概略瞭解如何設定來源 PostgreSQL 資料庫,以便將資料從該資料庫串流至目的地
- 使用 PostgreSQL 資料庫做為來源的已知限制
行為
來源 PostgreSQL 資料庫依賴邏輯解碼功能。邏輯解碼會公開所有已提交至資料庫的變更,並允許使用輸出外掛程式,以易於使用的格式取用及處理這些變更。Datastream 使用 pgoutput 外掛程式,這是 PostgreSQL 10 以上版本的標準 PostgreSQL 邏輯解碼外掛程式。
- 您可以選取特定 PostgreSQL 來源的所有結構定義或特定結構定義,以及結構定義中的所有資料表或特定資料表。
- 所有歷來資料都會複製。
- 系統會複製所有資料操縱語言 (DML) 變更,例如指定資料庫和資料表中的插入、更新和刪除作業。
- 系統只會複製已提交的變更。
- 如果您在資料表上定義 REPLICA IDENTITY,Datastream 會將指定的資料欄視為主鍵。
- Datastream 會定期傳送心跳訊息給來源資料庫。因此,邏輯解碼訊息事件 (
op:"m") 會直接插入 WAL 檔案。Datastream 需要這些訊息,才能確保來源可用性及計算新舊程度。如果其他複寫設定是從同一個來源資料庫讀取資料,建議您將這點納入考量。
版本
Datastream 支援 PostgreSQL 10 以上版本。
Datastream 支援下列類型的 PostgreSQL 資料庫:
- 自行託管的 PostgreSQL
- PostgreSQL 適用的 Cloud SQL
- AlloyDB for PostgreSQL
- AlloyDB Omni
- PostgreSQL 適用的 Amazon RDS
- Amazon Aurora PostgreSQL
最佳做法
本節說明設定 PostgreSQL 來源以搭配 Datastream 使用時,建議採取的最佳做法。
使用多個串流,避免發生隊頭阻塞問題
如果是 PostgreSQL 來源,Datastream 會為整個串流使用單一邏輯複製運算單元。如果高用量資料表發生大型交易或多次更新,可能會延遲同一資料串中所有其他資料表的資料複製作業。
如要避免隊列前端封鎖,請為不同資料表集建立個別的串流。舉例來說,您可以為高容量資料表建立一個串流,為低容量資料表建立另一個串流。這會隔離高流失率的資料表,避免這些資料表延遲其他資料表的複製作業。
最佳化建議:找出寫入率異常高的資料表 (INSERT/UPDATE/DELETE),並將這些資料表放在專屬的 Datastream 串流中,搭配獨立的複製時段。
避免長時間執行的交易
長時間執行的交易可能會導致預寫記錄 (WAL) 累積。由於 WAL 是循序的,因此即使其他交易正在耗用,PostgreSQL 也無法在長時間交易完成前排清 WAL。這可能會增加複製時段大小,並減緩邏輯解碼速度,因為系統必須重複解碼與目前交易重疊的長期交易變更。
建議:在來源資料庫中,設定 statement_timeout 和 idle_in_transaction_session_timeout 參數,避免長時間執行的交易。詳情請參閱 PostgreSQL 說明文件。
建立出版品時使用表格篩選功能
如果只複製少數資料表的變更,請務必建立只包含這些資料表的PUBLICATION。如果發布作業的範圍僅限特定資料表,PostgreSQL 只會有效保留這些資料表在複製運算單元中的變更。這有助於縮減複寫時段的大小,並提升邏輯解碼效能。
主動管理複製運算單元
Datastream 會在 PostgreSQL 主要執行個體上使用邏輯複製運算單元,確保 WAL 檔案會保留下來,直到 Datastream 確認檔案已處理完畢為止。如果串流失敗、暫停或刪除,但未捨棄複製時段,PostgreSQL 會無限期保留 WAL 檔案。這可能會導致資料庫伺服器磁碟空間不足,進而造成生產中斷。
建議:在來源 PostgreSQL 伺服器上設定有效的警報,並監控 WAL 磁碟用量。
正確設定副本身分
REPLICA IDENTITY 設定會告知 PostgreSQL 要將哪些資料寫入 UPDATE 和 DELETE 事件的 WAL,讓 Datastream 識別哪些資料列已變更。
如果使用 BigQuery 做為目的地,請避免將 REPLICA IDENTITY 設為 FULL。Datastream 會將記錄的資料欄做為 BigQuery MERGE 作業的邏輯鍵。如果 REPLICA IDENTITY 設為 FULL,且資料表有超過 16 個資料欄,就會超出 BigQuery 在 MERGE 作業中主鍵的 16 個資料欄限制,導致串流中斷。
建議 (依偏好順序):
- 最佳做法:使用主鍵。根據預設,
REPLICA IDENTITY DEFAULT會自動且有效率地使用現有的主鍵。 - 良好:如果沒有主鍵,請建立索引並設定
REPLICA IDENTITY USING INDEX INDEX_NAME。UNIQUE NOT NULL - 最不建議:只在沒有專屬 ID 的表格上使用
REPLICA IDENTITY FULL設定。如果複製到 BigQuery,請注意對效能的影響、16 欄的限制,以及主鍵支援的資料類型限制。
已知限制
使用 Datastream 時,如果 PostgreSQL 資料庫是來源,則有下列已知限制:
- 串流最多只能有 10,000 個資料表。
- 如果資料表超過 5 億列,除非符合下列條件,否則無法回填:
- 沒有主鍵的資料表必須有 REPLICA IDENTITY。否則,只有
INSERT事件會複製到目的地。 - 主鍵資料表的 REPLICA IDENTITY 不得設為
FULL或NOTHING。必須設為DEFAULT。 - PostgreSQL 不支援唯讀備用資源中的邏輯解碼,因此 Datastream 無法從唯讀備用資源執行個體複製資料。
- 系統無法自動偵測來源結構定義的所有變更,因此可能會發生資料損毀。下列結構定義變更可能會導致資料損毀,或無法處理下游事件:
- 捨棄資料欄。
- 在表格中間新增資料欄。
- 變更資料欄的資料類型。
- 重新排序資料欄。
- 捨棄資料表 (如果之後會重新建立資料表並新增資料,這項操作就相當實用)。
- Datastream 不支援
geometric資料類型的資料欄。 - Datastream 不支援
range資料類型的資料欄。 - Datastream 不支援不受支援的資料類型陣列、使用者定義的資料類型陣列 (包括
ENUM),或DATE、TIMESTAMP或TIMESTAMP WITH TIME ZONE資料類型陣列。系統會忽略這類資料欄。 - 如果資料列在資料表副本身分識別的資料欄中包含
TOAST值,Datastream 就不支援複製這些資料列的UPDATE事件。這類事件會遭到捨棄。 - Datastream 不支援複製包含
JSON或JSONB值的資料列,且這些值含有超過 2950 個巢狀物件。含有這類JSON或JSONB值的事件不會複製到目的地資料庫。 - Datastream 不支援複製在
NUMERIC (precision, scale)欄中包含NaN值的資料列。這類資料欄中的值會替換為NULL值。 - Datastream 不支援複製 hstore 資料類型的資料欄。這類資料欄中的值會替換為
NULL值。 - Datastream 不支援從 SQL_ASCII 編碼的來源資料庫複製非 ASCII 記錄。這類記錄會遭到捨棄。
- Datastream 不支援複製定義了資料列層級安全防護機制 (RLS) 政策的資料表。如要瞭解如何規避這項限制,請參閱「PostgreSQL 來源行為和限制」。
- Datastream 不會擷取對產生的資料欄所做的變更。
- 在資料庫上執行 PostgreSQL 主要版本升級時,Datastream 可能會停止運作或無法擷取任何新事件。建議您先捨棄複寫時段,再升級資料庫,然後重新建立複寫時段。如果串流失敗,請指定新的複製運算單元名稱來復原串流,並視需要執行回填作業,確保資料一致性。
後續步驟
- 瞭解如何設定 PostgreSQL 來源,以便搭配 Datastream 使用。