Konektor Postgres CDC membaca snapshot lengkap dari database PostgreSQL, lalu menangkap data perubahan dengan semantik pemrosesan tepat-sekali (exactly-once).
Ikhtisar
Konektor Postgres CDC mendukung kemampuan berikut:
|
Kategori |
Detail |
|
Jenis yang didukung |
Sumber SQL, sumber Flink CDC Catatan
Gunakan konektor JDBC untuk tabel sink dan tabel lookup (dimensi). |
|
Mode eksekusi |
Streaming |
|
Format data |
Tidak berlaku |
|
Metrik |
|
|
Jenis API |
SQL dan Flink CDC |
|
Pembaruan/penghapusan sink |
Tidak berlaku |
Fitur
Mulai dari VVR 8.0.6, konektor Postgres CDC terintegrasi dengan kerangka kerja snapshot inkremental. Konektor ini membaca data historis lengkap, lalu secara otomatis beralih ke pembacaan log perubahan dari WAL dengan semantik tepat-sekali.
Fitur utama:
-
Pemrosesan aliran dan batch terpadu: membaca data lengkap dan inkremental dalam satu pekerjaan.
-
Pembacaan snapshot konkuren: dapat diskalakan horizontal untuk kinerja lebih cepat.
-
Peralihan mulus dari lengkap ke inkremental: secara otomatis menskalakan turun untuk mengurangi penggunaan sumber daya.
-
Pembacaan dapat dilanjutkan: melanjutkan dari titik henti selama fase snapshot untuk stabilitas yang lebih baik.
-
Pembacaan tanpa lock: tidak memerlukan lock, sehingga tidak mengganggu operasi online.
Prasyarat
Konektor Postgres CDC membaca aliran CDC melalui replikasi logis PostgreSQL. Konektor ini mendukung ApsaraDB RDS for PostgreSQL, Amazon RDS for PostgreSQL, dan PostgreSQL yang dikelola sendiri.
Konfigurasi berbeda tergantung jenis penerapan. Konfigurasi Postgres.
Setelah dikonfigurasi, verifikasi hal berikut:
-
wal_level diatur ke
logicaluntuk mengaktifkan logical decoding. -
REPLICA IDENTITY setiap tabel yang berlangganan diatur ke
FULL, sehingga eventINSERTdanUPDATEmenyertakan nilai kolom sebelumnya demi konsistensi data.CatatanREPLICA IDENTITYadalah pengaturan tingkat tabel PostgreSQL yang mengontrol apakah eventINSERTdanUPDATEmenyertakan nilai kolom sebelumnya. REPLICA IDENTITY. -
Nilai
max_wal_sendersdanmax_replication_slotsmelebihi jumlah slot yang sedang digunakan ditambah slot yang dibutuhkan oleh pekerjaan Flink. -
Akun memiliki hak istimewa
SUPERUSER, atau memiliki izinLOGINdanREPLICATION, serta izinSELECTpada tabel yang berlangganan.
-
Jika tabel Postgres Anda berisi kolom yang di-generate, atur parameter publish_generated_columns ke
storedsaat membuat slot. Jika tidak, skema pada fase snapshot dan inkremental mungkin berbeda.
Catatan penggunaan
Fitur snapshot inkremental memerlukan VVR 8.0.6 atau versi yang lebih baru.
Slot replikasi
Pekerjaan Flink PostgreSQL CDC menggunakan slot replikasi untuk mencegah pembersihan WAL yang prematur dan memastikan konsistensi data. Slot yang dikelola dengan buruk dapat menyebabkan penggunaan disk berlebihan atau penundaan pembacaan. Praktik terbaik:
-
Bersihkan slot yang tidak digunakan segera
-
Flink tidak secara otomatis menghapus slot replikasi setelah pekerjaan berhenti atau restart secara tanpa status, untuk mencegah kehilangan data WAL.
-
Jika pekerjaan tidak akan dijalankan ulang, hapus slot replikasinya secara manual untuk membebaskan ruang disk.
CatatanManajemen siklus hidup: Perlakukan slot replikasi sebagai sumber daya tingkat pekerjaan dan kelolanya bersamaan dengan memulai dan menghentikan pekerjaan.
-
-
Hindari penggunaan ulang slot lama
-
Selalu gunakan nama slot baru. Menggunakan ulang slot lama memaksa pekerjaan membaca data WAL historis yang terakumulasi saat startup, sehingga menunda pemrosesan data baru.
-
PostgreSQL memerlukan satu slot per koneksi. Setiap pekerjaan harus menggunakan nama slot yang unik.
CatatanKonvensi penamaan: Saat menyesuaikan
slot.name, hindari nama dengan akhiran numerik sepertimy_slot_1, untuk mencegah konflik dengan slot sementara.
-
-
Perilaku slot dengan snapshot inkremental diaktifkan
-
Prasyarat: Checkpoint harus diaktifkan, dan tabel sumber harus memiliki primary key yang ditentukan.
-
Aturan pembuatan slot:
-
Snapshot inkremental dinonaktifkan: Hanya mendukung parallelism 1. Digunakan satu slot global.
-
Snapshot inkremental diaktifkan:
-
Fase snapshot: Setiap subtask sumber konkuren membuat slot sementara. Format penamaannya adalah
${slot.name}_${task_id}. -
Fase inkremental: Semua slot sementara secara otomatis dikembalikan. Hanya satu slot global yang dipertahankan.
-
-
-
Jumlah maksimum slot: Parallelism sumber + 1 (selama fase snapshot)
-
-
Sumber daya dan kinerja
-
Jika jumlah slot atau ruang disk terbatas, kurangi parallelism snapshot untuk menggunakan lebih sedikit slot sementara. Hal ini mengurangi kecepatan pembacaan snapshot.
-
Jika sink downstream mendukung penulisan idempoten, atur
scan.incremental.snapshot.backfill.skip = trueuntuk melewati backfill WAL selama fase snapshot dan mempercepat startup.Ini hanya memberikan semantik setidaknya-sekali (at-least-once) dan tidak cocok untuk komputasi stateful (agregasi atau join lookup) karena perubahan historis yang diperlukan mungkin hilang.
-
-
Saat snapshot inkremental dinonaktifkan, checkpoint tidak didukung selama fase snapshot.
Gunakan ulang langganan Postgres
Konektor Postgres CDC bergantung pada publication untuk menentukan perubahan tabel mana yang didorong ke slot. Jika beberapa pekerjaan berbagi publication yang sama, konfigurasi mereka akan ditimpa.
Penyebab
publication.autocreate.mode default adalah filtered, yang hanya mencakup tabel dalam konfigurasi konektor. Ini memodifikasi publication saat startup pekerjaan, yang dapat memengaruhi pekerjaan lain.
Solusi
-
Buat publication di PostgreSQL yang mencakup semua tabel yang dipantau, atau buat publication terpisah untuk setiap pekerjaan.
-- Buat publication bernama my_flink_pub yang mencakup semua tabel (atau tabel tertentu, buat satu publication per pekerjaan) CREATE PUBLICATION my_flink_pub FOR TABLE table_a, table_b; -- Atau lebih sederhana, sertakan semua tabel dalam database CREATE PUBLICATION my_flink_pub FOR ALL TABLES;CatatanBerlangganan ke semua tabel tidak disarankan untuk database besar karena penggunaan bandwidth dan CPU berlebihan pada kluster Flink.
-
Tambahkan konfigurasi Flink berikut:
-
debezium.publication.name = 'my_flink_pub'(Menentukan nama publication) -
debezium.publication.autocreate.mode = 'disabled'(Mencegah Flink mencoba membuat atau memodifikasi publication saat startup)
-
Hal ini memberikan isolasi penuh dan mencegah pekerjaan baru memengaruhi pekerjaan yang sudah ada.
SQL
Sintaksis
CREATE TABLE postgrescdc_source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>',
'decoding.plugin.name'= 'pgoutput',
'scan.incremental.snapshot.enabled' = 'true',
-- Melewatkan backfill dapat mempercepat pembacaan dan mengurangi penggunaan sumber daya, tetapi dapat menyebabkan duplikasi data. Aktifkan ini jika sink downstream bersifat idempoten.
'scan.incremental.snapshot.backfill.skip' = 'false',
-- Di lingkungan produksi, atur ini ke 'filtered' atau 'disabled' dan kelola publication secara manual, bukan melalui Flink.
'debezium-publication.autocreate.mode' = 'disabled'
-- Jika Anda memiliki beberapa sumber, konfigurasikan publication berbeda untuk setiap sumber.
--'debezium.publication.name' = 'my_flink_pub'
);
Opsi konektor
|
Opsi |
Deskripsi |
Tipe data |
Wajib |
Default |
Keterangan |
|
connector |
Nama konektor. |
STRING |
Ya |
– |
Nilainya harus |
|
hostname |
Alamat IP atau hostname database PostgreSQL. |
STRING |
Ya |
– |
– |
|
username |
Username untuk layanan database PostgreSQL. |
STRING |
Ya |
– |
– |
|
password |
Password untuk layanan database PostgreSQL. |
STRING |
Ya |
– |
– |
|
database-name |
Nama database PostgreSQL. |
STRING |
Ya |
– |
Nama database. |
|
schema-name |
Nama skema PostgreSQL. Mendukung regex. |
STRING |
Ya |
– |
Nama skema mendukung ekspresi reguler untuk membaca data dari beberapa skema. |
|
table-name |
Nama tabel PostgreSQL. Mendukung regex. |
STRING |
Ya |
– |
Nama tabel mendukung ekspresi reguler untuk membaca data dari beberapa tabel. |
|
port |
Nomor port. |
INTEGER |
Tidak |
5432 |
– |
|
decoding.plugin.name |
Nama plugin logical decoding PostgreSQL. |
STRING |
Tidak |
decoderbufs |
Ini ditentukan oleh plugin yang diinstal pada layanan PostgreSQL. Plugin yang didukung adalah:
|
|
slot.name |
Nama slot logical decoding. |
STRING |
Wajib untuk VVR 8.0.1 dan versi setelahnya. Opsional untuk versi sebelumnya. |
|
Atur Tidak ada nilai default untuk VVR 8.0.1+. |
|
debezium.* |
Properti dan parameter Debezium |
STRING |
Tidak |
– |
Memberikan kontrol lebih rinci atas perilaku klien Debezium. Misalnya, |
|
scan.incremental.snapshot.enabled |
Menentukan apakah snapshot inkremental diaktifkan. |
BOOLEAN |
Tidak |
false |
Catatan
|
|
scan.startup.mode |
Mode startup untuk konsumsi data. |
STRING |
Tidak |
initial |
Nilai yang valid:
|
|
changelog-mode |
Mode changelog untuk pengodean perubahan aliran. |
String |
Tidak |
all |
Mode changelog yang didukung:
|
|
heartbeat.interval.ms |
Interval pengiriman paket heartbeat. |
Duration |
Tidak |
30s |
Unitnya adalah milidetik. Konektor Postgres CDC secara aktif mengirim heartbeat ke database untuk memajukan offset slot. Saat perubahan tabel jarang terjadi, pengaturan nilai ini memastikan pembersihan log WAL secara tepat waktu. |
|
scan.incremental.snapshot.chunk.key-column |
Menentukan kolom yang digunakan sebagai kunci chunk untuk memisahkan shard selama fase snapshot. |
STRING |
Tidak |
– |
Secara default, kolom pertama dari primary key dipilih. |
|
scan.incremental.close-idle-reader.enabled |
Menentukan apakah pembaca idle ditutup setelah snapshot selesai. |
Boolean |
Tidak |
false |
Untuk mengaktifkan konfigurasi ini, atur |
|
scan.incremental.snapshot.backfill.skip |
Menentukan apakah pembacaan log dilewati selama fase snapshot. |
Boolean |
Tidak |
false |
Nilai yang valid:
|
Pemetaan tipe
Pemetaan tipe PostgreSQL ke Flink:
|
PostgreSQL CDC |
Flink |
|
SMALLINT |
SMALLINT |
|
INT2 |
|
|
SMALLSERIAL |
|
|
SERIAL2 |
|
|
INTEGER |
INT |
|
SERIAL |
|
|
BIGINT |
BIGINT |
|
BIGSERIAL |
|
|
REAL |
FLOAT |
|
FLOAT4 |
|
|
FLOAT8 |
DOUBLE |
|
DOUBLE PRECISION |
|
|
NUMERIC(p, s) |
DECIMAL(p, s) |
|
DECIMAL(p, s) |
|
|
BOOLEAN |
BOOLEAN |
|
DATE |
DATE |
|
TIME [(p)] [WITHOUT TIMEZONE] |
TIME [(p)] [WITHOUT TIMEZONE] |
|
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
|
CHAR(n) |
STRING |
|
CHARACTER(n) |
|
|
VARCHAR(n) |
|
|
CHARACTER VARYING(n) |
|
|
TEXT |
|
|
BYTEA |
BYTES |
Contoh
CREATE TABLE source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>'
);
SELECT * FROM source;
Flink CDC
VVR V11.4+ mendukung konektor PostgreSQL sebagai sumber Flink CDC.
Sintaksis
source:
type: postgres
name: PostgreSQL Source
hostname: localhost
port: 5432
username: pg_username
password: pg_password
tables: db.scm.tbl
slot.name: test_slot
scan.startup.mode: initial
server-time-zone: UTC
connect.timeout: 120s
decoding.plugin.name: decoderbufs
sink:
type: ...
Opsi konektor
|
Opsi |
Deskripsi |
Wajib |
Tipe data |
Default |
Keterangan |
|
type |
Nama konektor. |
Ya |
STRING |
– |
Harus |
|
name |
Nama sumber data. |
Tidak |
STRING |
– |
– |
|
hostname |
Nama domain atau alamat IP server database PostgreSQL. |
Ya |
STRING |
– |
– |
|
port |
Port database PostgreSQL. |
Tidak |
INTEGER |
5432 |
– |
|
username |
Username PostgreSQL. |
Ya |
STRING |
– |
– |
|
password |
Password PostgreSQL. |
Ya |
STRING |
– |
– |
|
tables |
Nama tabel yang akan ditangkap. Mendukung regex. |
Ya |
STRING |
– |
Penting
Saat ini, hanya tabel dalam database yang sama yang dapat ditangkap. Titik (.) diperlakukan sebagai pemisah untuk nama lengkap. Untuk menggunakan titik (.) dalam ekspresi reguler agar cocok dengan karakter apa pun, tambahkan backslash sebagai escape. Contoh: |
|
slot.name |
Nama slot replikasi PostgreSQL. |
Ya |
STRING |
– |
Nama harus mematuhi aturan penamaan slot replikasi PostgreSQL dan dapat berisi huruf kecil, angka, dan garis bawah. |
|
decoding.plugin.name |
Nama plugin logical decoding PostgreSQL yang diinstal di server. |
Tidak |
STRING |
|
Nilai yang valid: |
|
tables.exclude |
Tabel yang dikecualikan. Opsi ini berlaku setelah opsi |
Tidak |
STRING |
– |
Lihat opsi |
|
server-time-zone |
Zona waktu sesi server database, seperti "Asia/Shanghai". |
Tidak |
STRING |
– |
Jika tidak diatur, zona waktu default sistem ( |
|
scan.incremental.snapshot.chunk.size |
Ukuran (jumlah baris) setiap chunk dalam kerangka kerja snapshot inkremental. |
Tidak |
INTEGER |
8096 |
Saat snapshot inkremental diaktifkan, tabel dibagi menjadi beberapa chunk untuk dibaca. Data chunk di-cache di memori sebelum sepenuhnya dikonsumsi. Chunk yang lebih kecil menghasilkan jumlah total chunk yang lebih besar untuk tabel. Meskipun ini mengurangi granularitas pemulihan kesalahan, hal ini dapat menyebabkan error kehabisan memori (OOM) dan throughput keseluruhan yang lebih rendah. Oleh karena itu, Anda perlu menyeimbangkan dan mengatur ukuran chunk yang wajar. |
|
scan.snapshot.fetch.size |
Jumlah maksimum catatan yang diambil sekaligus saat membaca data lengkap tabel. |
Tidak |
INTEGER |
1024 |
– |
|
scan.startup.mode |
Mode startup untuk konsumsi data. |
Tidak |
STRING |
initial |
Nilai yang valid:
|
|
scan.incremental.close-idle-reader.enabled |
Menentukan apakah pembaca idle ditutup setelah snapshot selesai. |
Tidak |
BOOLEAN |
false |
Untuk mengaktifkan konfigurasi ini, atur |
|
scan.lsn-commit.checkpoints-num-delay |
Jumlah checkpoint yang ditunda sebelum mulai meng-commit offset LSN. |
Tidak |
INTEGER |
3 |
Offset LSN checkpoint di-commit secara bergilir untuk mencegah ketidakmampuan memulihkan dari state. |
|
connect.timeout |
Waktu maksimum konektor menunggu untuk terhubung ke server database PostgreSQL sebelum timeout. |
Tidak |
DURATION |
30s |
Nilai ini tidak boleh kurang dari 250 milidetik. |
|
connect.max-retries |
Maksimum upaya retry untuk konektor membangun koneksi. |
Tidak |
INTEGER |
3 |
– |
|
connection.pool.size |
Ukuran kolam koneksi. |
Tidak |
INTEGER |
20 |
– |
|
jdbc.properties.* |
Memungkinkan pengguna meneruskan properti URL JDBC kustom. |
Tidak |
STRING |
20 |
Pengguna dapat meneruskan properti kustom, seperti |
|
heartbeat.interval |
Interval pengiriman event heartbeat untuk melacak offset log WAL terbaru yang tersedia. |
Tidak |
DURATION |
30s |
– |
|
debezium.* |
Meneruskan properti Debezium ke Debezium Embedded Engine, yang digunakan untuk menangkap perubahan data dari server PostgreSQL. |
Tidak |
STRING |
– |
Properti konektor PostgreSQL Debezium: Dokumentasi Debezium. |
|
chunk-meta.group.size |
Ukuran metadata chunk. |
Tidak |
STRING |
1000 |
Jika metadata lebih besar dari nilai ini, metadata tersebut diteruskan dalam beberapa bagian. |
|
metadata.list |
Daftar metadata yang dapat dibaca yang diteruskan ke downstream, yang dapat digunakan di modul transform. |
Tidak |
STRING |
false |
Gunakan koma (,) sebagai pemisah. Saat ini, metadata yang tersedia adalah: |
|
scan.incremental.snapshot.unbounded-chunk-first.enabled |
Mengirimkan chunk tak terbatas terlebih dahulu selama fase pembacaan snapshot. |
Tidak |
STRING |
false |
Ini adalah fitur eksperimental. Mengaktifkannya dapat mengurangi risiko error OOM saat Pengelola Tugas menyinkronkan chunk terakhir selama fase snapshot. Kami sarankan menambahkan ini sebelum startup pertama pekerjaan. |