Streaming data dari database PostgreSQL

Bagian ini berisi informasi tentang:

  • Perilaku cara Datastream menangani data yang ditarik dari database PostgreSQL sumber
  • Versi database PostgreSQL yang didukung Datastream
  • Ringkasan cara menyiapkan database PostgreSQL sumber agar data dapat di-streaming dari database tersebut ke tujuan
  • Batasan umum untuk menggunakan database PostgreSQL sebagai sumber

Perilaku

Database PostgreSQL sumber mengandalkan fitur decoding logis. Decoding logis mengekspos semua perubahan yang di-commit ke database dan memungkinkan penggunaan serta pemrosesan perubahan ini dalam format yang mudah digunakan menggunakan plugin output. Datastream menggunakan plugin pgoutput, yang merupakan plugin decoding logis PostgreSQL standar untuk PostgreSQL 10 dan yang lebih baru.

  • Semua skema atau skema tertentu dari sumber PostgreSQL tertentu, serta semua tabel dari skema atau tabel tertentu, dapat dipilih.
  • Semua data historis direplikasi.
  • Semua perubahan bahasa pengolahan data (DML), seperti penyisipan, pembaruan, dan penghapusan dari database dan tabel yang ditentukan, direplikasi.
  • Hanya perubahan yang di-commit yang direplikasi.
  • Jika Anda menentukan REPLICA IDENTITY pada tabel, Datastream akan memperlakukan kolom yang ditentukan sebagai kunci utama.
  • Datastream secara berkala mengirimkan pesan detak jantung ke database sumber. Akibatnya, peristiwa pesan decoding logis (op:"m") dimasukkan langsung ke dalam file WAL. Pesan ini diperlukan oleh Datastream untuk memastikan ketersediaan sumber dan menghitung keaktualan. Sebaiknya pertimbangkan hal ini jika penyiapan replikasi lain membaca dari database sumber yang sama.

Versi

Datastream mendukung PostgreSQL versi 10 dan yang lebih baru.

Datastream mendukung jenis database PostgreSQL berikut:

  • PostgreSQL yang dihosting sendiri
  • Cloud SQL untuk PostgreSQL
  • AlloyDB untuk PostgreSQL
  • AlloyDB Omni
  • Amazon RDS for PostgreSQL
  • Amazon Aurora PostgreSQL

Praktik terbaik

Bagian ini menjelaskan praktik terbaik yang direkomendasikan untuk mengonfigurasi sumber PostgreSQL agar dapat digunakan dengan Datastream.

Menggunakan beberapa stream untuk mencegah pemblokiran head-of-line

Untuk sumber PostgreSQL, Datastream menggunakan satu slot replikasi logis untuk seluruh aliran. Transaksi besar atau beberapa pembaruan pada satu tabel bervolume tinggi dapat menunda replikasi data untuk semua tabel lain dalam aliran yang sama.

Untuk mencegah pemblokiran head-of-line, buat aliran terpisah untuk berbagai set tabel. Misalnya, Anda dapat membuat satu aliran untuk tabel bervolume tinggi, dan aliran lainnya untuk tabel bervolume rendah. Tindakan ini mengisolasi tabel dengan churn tinggi dan mencegahnya menunda replikasi untuk tabel lain.

Rekomendasi: identifikasi tabel dengan kecepatan penulisan yang sangat tinggi (INSERT/UPDATE/DELETE) dan tempatkan tabel tersebut di aliran Datastream khusus dengan slot replikasi terpisah.

Menghindari transaksi yang berjalan lama

Transaksi yang berjalan lama dapat menyebabkan penumpukan Write-Ahead Log (WAL). Karena WAL bersifat berurutan, PostgreSQL tidak dapat menghapus WAL hingga transaksi yang panjang selesai, meskipun transaksi lain sedang digunakan. Hal ini dapat meningkatkan ukuran slot replikasi dan memperlambat decoding logis, karena perubahan dari transaksi yang berjalan lama yang tumpang-tindih dengan transaksi saat ini harus didekode berulang kali.

Rekomendasi: Di database sumber, konfigurasi parameter statement_timeout dan idle_in_transaction_session_timeout untuk menghindari transaksi yang berjalan lama. Untuk mengetahui informasi selengkapnya, lihat dokumentasi PostgreSQL.

Menggunakan pemfilteran tabel saat membuat publikasi

Jika Anda mereplikasi perubahan dari hanya beberapa tabel, pastikan Anda membuat PUBLICATION yang hanya menyertakan tabel tersebut. Jika cakupan publikasi ditetapkan ke tabel tertentu, PostgreSQL akan secara efisien mempertahankan perubahan hanya untuk tabel tersebut di slot replikasi. Hal ini membantu mengurangi ukuran slot replikasi dan meningkatkan performa decoding logis.

Mengelola slot replikasi secara proaktif

Datastream menggunakan slot replikasi logis pada instance utama PostgreSQL Anda, yang memastikan bahwa file WAL dipertahankan hingga Datastream mengonfirmasi bahwa file tersebut telah diproses. Jika streaming gagal, dijeda, atau dihapus tanpa menghapus slot replikasi, PostgreSQL akan terus mempertahankan file WAL tanpa batas waktu. Hal ini dapat memenuhi disk server database Anda dan menyebabkan penonaktifan produksi.

Rekomendasi: Siapkan pemberitahuan yang efisien dan pantau penggunaan disk WAL di server PostgreSQL sumber Anda.

Mengonfigurasi identitas replika dengan benar

Setelan REPLICA IDENTITY memberi tahu PostgreSQL data apa yang akan ditulis ke WAL untuk peristiwa UPDATE dan DELETE, sehingga Datastream dapat mengidentifikasi baris mana yang diubah.

Jika Anda menggunakan BigQuery sebagai tujuan, hindari menyetel REPLICA IDENTITY ke FULL. Datastream menggunakan kolom yang dicatat sebagai kunci logis untuk operasi MERGE BigQuery. Jika REPLICA IDENTITY disetel ke FULL dan tabel memiliki lebih dari 16 kolom, hal ini akan melampaui batas 16 kolom BigQuery untuk kunci utama dalam operasi MERGE dan menghentikan streaming.

Rekomendasi (sesuai urutan preferensi):

  1. Terbaik: gunakan kunci utama. Setelan default REPLICA IDENTITY DEFAULT secara otomatis dan efisien menggunakan kunci utama yang ada.
  2. Baik: jika tidak ada kunci utama, buat indeks UNIQUE NOT NULL dan tetapkan REPLICA IDENTITY USING INDEX INDEX_NAME.
  3. Paling tidak direkomendasikan: hanya gunakan setelan REPLICA IDENTITY FULL pada tabel tanpa ID unik. Perhatikan dampak performa dan batas 16 kolom serta batasan jenis data yang didukung untuk kunci utama jika mereplikasi ke BigQuery.

Batasan umum

Batasan yang diketahui untuk menggunakan Datastream dengan database PostgreSQL sebagai sumber meliputi:

  • Aliran data dibatasi hingga 10.000 tabel.
  • Tabel yang memiliki lebih dari 500 juta baris tidak dapat diisi ulang kecuali jika kondisi berikut terpenuhi:
    1. Tabel memiliki indeks B-tree unik.
    2. Indeks tidak menyertakan kolom dengan jenis berikut: DOUBLE, FLOAT, MONEY, REAL, JSON, JSONB, BYTEA, TXID, XML, jenis data komposit atau jenis data geometris.
    3. Tidak ada kolom indeks yang dapat bernilai null.
    4. Semua kolom indeks dalam urutan menaik, atau semua kolom indeks dalam urutan menurun.
    5. Semua kolom indeks disertakan dalam aliran.
  • Tabel tanpa kunci utama harus memiliki REPLICA IDENTITY. Jika tidak, hanya peristiwa INSERT yang direplikasi ke tujuan.
  • Tabel dengan kunci utama tidak dapat memiliki REPLICA IDENTITY yang ditetapkan ke FULL atau NOTHING. Harus disetel ke DEFAULT.
  • Datastream tidak dapat mereplikasi dari instance replika baca, karena PostgreSQL tidak mendukung decoding logis dalam replika baca.
  • Tidak semua perubahan pada skema sumber dapat dideteksi secara otomatis, sehingga dapat menyebabkan kerusakan data. Perubahan skema berikut dapat menyebabkan kerusakan data atau kegagalan memproses peristiwa di hilir:
    • Melepas kolom.
    • Menambahkan kolom ke tengah tabel.
    • Mengubah jenis data kolom.
    • Mengurutkan ulang kolom.
    • Menghapus tabel (relevan jika tabel yang sama kemudian dibuat ulang dengan data baru yang ditambahkan).
  • Datastream tidak mendukung kolom jenis data geometric.
  • Datastream tidak mendukung kolom jenis data range.
  • Datastream tidak mendukung array jenis data yang tidak didukung, array jenis data yang ditentukan pengguna (termasuk ENUM), atau array jenis data DATE, TIMESTAMP, atau TIMESTAMP WITH TIME ZONE. Kolom tersebut diabaikan.
  • Datastream tidak mendukung replikasi peristiwa UPDATE untuk baris yang menyertakan nilai TOAST di kolom yang merupakan bagian dari identitas replika tabel. Peristiwa tersebut akan dibuang.
  • Datastream tidak mendukung replikasi baris yang menyertakan nilai JSON atau JSONB dengan lebih dari 2.950 objek bertingkat. Peristiwa yang berisi nilai JSON atau JSONB tersebut tidak direplikasi ke database tujuan.
  • Datastream tidak mendukung replikasi baris yang menyertakan nilai NaN di kolom NUMERIC (precision, scale). Nilai dalam kolom tersebut diganti dengan nilai NULL.
  • Datastream tidak mendukung replikasi kolom jenis data hstore. Nilai dalam kolom tersebut diganti dengan nilai NULL.
  • Datastream tidak mendukung replikasi rekaman non-ASCII dari database sumber yang dienkode SQL_ASCII. Data tersebut akan dibuang.
  • Datastream tidak mendukung replikasi tabel dengan kebijakan Keamanan Tingkat Baris (RLS) yang ditentukan. Untuk mengetahui informasi tentang cara melewati batasan ini, lihat Perilaku dan batasan sumber PostgreSQL.
  • Datastream tidak merekam perubahan yang dilakukan pada kolom yang dihasilkan.
  • Datastream mungkin berhenti berfungsi atau tidak merekam peristiwa baru saat upgrade versi utama PostgreSQL dilakukan pada database. Sebaiknya hapus slot replikasi sebelum upgrade, lalu upgrade database, dan buat ulang slot replikasi. Jika streaming gagal, pulihkan streaming dengan menentukan nama slot replikasi baru, dan lakukan pengisian ulang jika konsistensi data diperlukan.

Langkah berikutnya