Anda dapat menggunakan Datastream untuk mereplikasi data historis dan perubahan yang sedang berlangsung dari database PostgreSQL ke tujuan Anda untuk analisis real-time dan sinkronisasi database.
Untuk mempersiapkan replikasi PostgreSQL di Datastream, tinjau perilaku replikasi, versi dan jenis database yang didukung, praktik terbaik, persyaratan untuk replika baca, dan batasan umum.
Perilaku
Database PostgreSQL sumber mengandalkan fitur dekode 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, akan 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 mengirim pesan heartbeat ke database sumber saat terhubung ke instance utama. Akibatnya, peristiwa pesan decoding logis (
op:"m") disisipkan langsung ke dalam file WAL. Pesan ini diperlukan oleh Datastream untuk memastikan ketersediaan sumber dan menghitung keaktualan. Saat menggunakan replika baca sebagai sumber, Anda harus mengonfigurasi pesan heartbeat secara eksternal. Lihat Replikasi dari replika baca untuk mengetahui informasi selengkapnya. 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
Paket Gratis
Datastream memungkinkan Anda melakukan streaming dari AlloyDB untuk PostgreSQL ke BigQuery menggunakan Paket Gratis, yang menyediakan hingga 100 GiB data change data capture gratis setiap bulan. Untuk mengetahui informasi selengkapnya, lihat Harga Datastream.
Praktik terbaik
Bagian ini menjelaskan praktik terbaik yang direkomendasikan untuk mengonfigurasi sumber PostgreSQL Anda agar dapat digunakan dengan Datastream.
Menggunakan beberapa streaming untuk mencegah pemblokiran head-of-line
Untuk sumber PostgreSQL, Datastream menggunakan satu slot replikasi logis untuk seluruh aliran data. Transaksi besar atau beberapa update pada satu tabel bervolume tinggi dapat menunda replikasi data untuk semua tabel lain dalam aliran data yang sama.
Untuk mencegah pemblokiran head-of-line, buat aliran data terpisah untuk kumpulan tabel yang berbeda. Misalnya, Anda dapat membuat satu aliran data untuk tabel bervolume tinggi, dan aliran data lain untuk tabel bervolume rendah. Tindakan ini akan mengisolasi tabel churn tinggi dan mencegahnya menunda replikasi untuk tabel lain.
Rekomendasi: identifikasi tabel dengan tingkat penulisan (INSERT/UPDATE/DELETE) yang sangat tinggi dan tempatkan tabel tersebut dalam aliran Datastream khusus dengan slot replikasi terpisah.
Menghindari transaksi yang berjalan lama
Transaksi yang berjalan lama dapat menyebabkan penumpukan log WAL. Karena WAL bersifat berurutan, PostgreSQL tidak dapat menghapus file WAL lama yang diperlukan oleh slot replikasi hingga transaksi yang panjang selesai. Hal ini meningkatkan penggunaan disk WAL.
Selain itu, hal ini dapat memperlambat decoding logis. Pelambatan ini disebabkan oleh transaksi besar yang menumpahkan perubahan ke disk, yang kemudian memerlukan penyusunan ulang yang lambat dan intensif I/O saat commit, sehingga memblokir replikasi semua transaksi berikutnya.
Rekomendasi: di database sumber, konfigurasikan 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 beberapa tabel saja, pastikan Anda membuat
PUBLICATION yang hanya menyertakan tabel tersebut. Jika publikasi
dicakupkan 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 aliran data 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 pemadaman layanan 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 harus ditulis ke WAL untuk peristiwa UPDATE dan DELETE, sehingga Datastream dapat mengidentifikasi baris mana yang diubah.
Jika Anda menggunakan BigQuery sebagai tujuan, hindari menetapkan REPLICA IDENTITY ke FULL. Datastream menggunakan kolom yang dicatat ke dalam log sebagai kunci logis untuk operasi MERGE BigQuery.
Jika REPLICA IDENTITY ditetapkan ke FULL dan tabel memiliki lebih dari 16 kolom,
hal ini akan melebihi batas 16 kolom BigQuery untuk kunci utama dalam operasi MERGE
dan merusak aliran data.
Rekomendasi (berdasarkan urutan preferensi):
- Terbaik: gunakan kunci utama. Setelan default
REPLICA IDENTITY DEFAULTsecara otomatis dan efisien menggunakan kunci utama yang ada. - Baik: jika tidak ada kunci utama, buat indeks
UNIQUE NOT NULLdan tetapkanREPLICA IDENTITY USING INDEX INDEX_NAME. - Paling tidak direkomendasikan: hanya gunakan setelan
REPLICA IDENTITY FULLpada tabel tanpa ID unik. Perhatikan dampak performa dan batas 16 kolom serta batasan pada jenis data yang didukung untuk kunci utama jika mereplikasi ke BigQuery.
Replikasi dari replika baca
Datastream mendukung replikasi dari instance replika baca PostgreSQL untuk PostgreSQL versi 16 dan yang lebih baru.
Untuk mereplikasi dari replika baca, Anda harus melakukan langkah-langkah penyiapan berikut pada instance utama:
- Membuat publikasi di instance utama: Meskipun Datastream terhubung ke replika baca, publikasi yang menentukan data yang akan direplikasi harus dibuat di instance utama.
- Konfigurasi heartbeat WAL: Datastream mengandalkan pesan heartbeat WAL berkala untuk mekanisme checkpoint-nya. Saat terhubung ke instance utama, Datastream menangani pembuatan heartbeat ini. Namun, untuk replika baca, heartbeat ini harus dibuat secara eksternal.
Salah satu cara untuk menyiapkan heartbeat berkala adalah dengan membuat tugas cron di PostgreSQL menggunakan ekstensi pg_cron:
SELECT cron.schedule_in_database(
'datastream-heartbeat', -- Job name
'* * * * *', -- Every minute
$$SELECT pg_logical_emit_message(true, 'datastream', 'cdc heartbeat')$$,
'DATABASE_NAME', -- Change this to your database name
'USERNAME', -- Username to run as
true -- Enabled
);
Ganti kode berikut:
- DATABASE_NAME: Nama database yang ingin Anda buat heartbeat-nya.
- USERNAME: Nama pengguna yang akan menjalankan tugas. Biasanya
postgres.
Batasan umum
Batasan umum penggunaan Datastream dengan database PostgreSQL sebagai sumber meliputi:
- Streaming dibatasi hingga 10.000 tabel.
- PostgreSQL secara ketat menolak byte NULL (
0x00) di kolom string UTF-8. Datastream tidak menghapus byte NULL. Jika string sumber berisi byte null0x00, batch penyisipan akan gagal dan menghentikan replikasi. Sebaiknya bersihkan atau ganti karakterCHAR(0)di database sumber sebelum melakukan replikasi. - Anda tidak dapat mengonfigurasi aliran data PostgreSQL untuk memulai dari posisi terbaru.
- Tabel yang memiliki lebih dari 500 juta baris tidak dapat diisi ulang kecuali jika kondisi berikut terpenuhi:
- Tabel memiliki indeks B-tree yang unik.
- Indeks tidak menyertakan kolom dari jenis berikut:
DOUBLE,FLOAT,MONEY,REAL,JSON,JSONB,BYTEA,TXID,XML, jenis data gabungan atau jenis data geometris. - Tidak ada kolom indeks yang nullable.
- Semua kolom indeks dalam urutan menaik, atau semua kolom indeks dalam urutan menurun.
- Semua kolom indeks disertakan dalam aliran data.
- Tabel tanpa kunci utama harus memiliki REPLICA IDENTITY. Jika tidak, hanya peristiwa
INSERTyang direplikasi ke tujuan. - Tabel dengan kunci utama tidak boleh memiliki REPLICA IDENTITY yang ditetapkan ke
FULLatauNOTHING. Nilai ini harus ditetapkan keDEFAULT. - 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 downstream:
- Menghapus kolom.
- Menambahkan kolom ke bagian tengah tabel.
- Mengubah jenis data kolom.
- Menyusun ulang kolom.
- Menghapus tabel (relevan jika tabel yang sama kemudian dibuat ulang dengan data baru yang ditambahkan).
- Datastream tidak mendukung kolom jenis data
geometric, sepertiBOX,CIRCLE,LINE,LSEG,PATH,POINT, danPOLYGON. Kolom tersebut direplikasi sebagaiNULL. - Datastream tidak mendukung kolom jenis data
range. - Datastream tidak mendukung array jenis data yang tidak didukung (seperti jenis spasial), array
LTREE, array jenis data yang ditentukan pengguna (termasukENUM) atau arrayDATE,TIMESTAMP, atauTIMESTAMP WITH TIME ZONE(TIMESTAMPTZ). Datastream mengabaikan kolom tersebut selama replikasi. - Untuk aliran data yang dibuat sebelum 17 Februari 2026: Datastream tidak mendukung replikasi peristiwa UPDATE untuk baris yang menyertakan nilai TOAST di kolom yang merupakan bagian dari identitas replika tabel. Peristiwa tersebut akan dihapus. Streaming yang dibuat setelah tanggal tersebut tidak tunduk pada pengecualian ini.
- Datastream tidak mendukung replikasi baris yang menyertakan nilai
JSONatauJSONBdengan lebih dari 2.950 objek bertingkat. Peristiwa yang berisi nilaiJSONatauJSONBtersebut tidak direplikasi ke database tujuan. - Datastream tidak mendukung replikasi baris yang menyertakan nilai
NaNdi kolomNUMERIC (precision, scale). Nilai dalam kolom tersebut diganti dengan nilaiNULL. - Datastream tidak mendukung replikasi kolom jenis data hstore. Nilai dalam kolom tersebut diganti dengan nilai
NULL. - Datastream tidak mendukung replikasi data non-ASCII dari database sumber yang dienkode SQL_ASCII. Data tersebut akan dihapus.
- Datastream tidak mendukung replikasi tabel dengan kebijakan Keamanan Tingkat Baris (RLS) yang ditentukan. Untuk mengetahui informasi tentang cara mengabaikan batasan ini, lihat Perilaku dan batasan sumber PostgreSQL.
- Untuk kolom streaming dengan jenis data panjang variabel yang menggunakan The Oversized-Attribute Storage Technique (TOAST):
Jika nilai TOAST yang tidak berubah dihapus dari log WAL selama operasi
UPDATE, Datastream akan melakukan pencarian aktif di database sumber untuk mencoba memulihkan nilai yang hilang. Oleh karena itu, perubahan sementara mungkin tidak terekam dalam skenario yang melibatkan update cepat dan berturut-turut atau penghapusan cepat setelah penyisipan. Perhatikan bahwa operasiDELETEtidak memicu operasi pencarian aktif ini. Batasan untuk kolom panjang variabel yang menggunakan TOAST ini sangat relevan saat menggunakan mode tulis hanya-tambah, yang mengharapkan semua perubahan perantara dicatat. - Datastream tidak menangkap perubahan yang dilakukan pada kolom yang dihasilkan.
- Datastream mungkin berhenti berfungsi atau tidak menangkap 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 aliran data gagal, pulihkan aliran data dengan menentukan nama slot replikasi baru, dan lakukan pengisian ulang jika konsistensi data diperlukan.
- Datastream tidak mendukung replikasi tabel sistem PostgreSQL saat menggunakan alur penyiapan aliran data otomatis. Jika Anda mengedit aliran data yang dibuat menggunakan alur otomatis dan menambahkan tabel sistem, Datastream akan mengabaikan tabel ini secara otomatis, dan tidak akan mereplikasi data atau perubahan apa pun dari tabel tersebut.
Langkah berikutnya
- Pelajari cara mengonfigurasi sumber PostgreSQL untuk digunakan dengan Datastream.