ApsaraDB RDS for PostgreSQL mendukung Change Data Capture (CDC) melalui slot replikasi logis — mekanisme bawaan PostgreSQL untuk mengalirkan perubahan tingkat baris. Panduan ini menjelaskan cara mengonfigurasi CDC pada instans RDS for PostgreSQL: mengatur parameter yang diperlukan, membuat slot replikasi, serta membaca dan mengonsumsi data perubahan secara end-to-end.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ApsaraDB RDS for PostgreSQL. Lihat Buat instans ApsaraDB RDS for PostgreSQL
Daftar putih alamat IP yang dikonfigurasi untuk mengizinkan koneksi dari klien Anda. Lihat Konfigurasi daftar putih alamat IP
psql terinstal pada klien Anda. Lihat Dokumentasi PostgreSQL: Instalasi dari kode sumber
Batasan
CDC hanya didukung pada instans utama. Instans read-only tidak didukung.
ApsaraDB RDS for PostgreSQL mendukung Logical Replication Slot Failover, sehingga failover primary/secondary tidak memengaruhi CDC.
Risiko sebelum memulai
Slot replikasi tidak melacak konsumennya. Jika klien downstream berhenti mengonsumsi atau melaporkan konsumsi secara abnormal, file Write-Ahead Log (WAL) akan terakumulasi tanpa batas. Atasi risiko berikut sebelum mengaktifkan CDC:
Kehabisan ruang disk dan penguncian instans: File WAL terakumulasi jika konsumsi dihentikan. Jika tidak ditangani, hal ini akan menghabiskan ruang disk dan mengunci instans ke mode read-only.
XID wraparound: Jika klien downstream tidak melaporkan progres konsumsi secara real time, instans menyimpan beberapa versi baris. Hal ini dapat menyebabkan transaction ID (XID) wraparound, yang juga mengunci instans ke mode read-only. Contoh log error:
HINT: Tutup transaksi yang terbuka segera untuk menghindari masalah wraparound. Anda mungkin juga perlu melakukan commit atau rollback transaksi prepared lama, atau hapus slot replikasi yang sudah tidak digunakan. WARNING: oldest xmin is far in the past.Restart instans saat perubahan parameter: Mengaktifkan CDC memerlukan pengaturan parameter
wal_levelmenjadilogical. Perubahan ini memicu restart instans. Lakukan perubahan ini selama jam sepi.
Untuk mengurangi risiko tersebut:
Konfigurasikan klien downstream agar melaporkan progres konsumsi secara real time.
Pantau ukuran log WAL dan penggunaan penyimpanan secara berkala. Lihat Lihat pemantauan lanjutan dan Kelola alert.
Hapus slot replikasi yang tidak aktif segera agar AliPG dapat membersihkan log WAL secara otomatis. Lihat Nonaktifkan fitur CDC.
Aktifkan fitur CDC
Langkah-langkah berikut menggunakan nilai contoh berikut. Ganti dengan nilai Anda sendiri.
| Placeholder | Nilai contoh | Deskripsi |
|---|---|---|
<instance-endpoint> | pgm-*****.pgsql.singapore.rds.aliyuncs.com | Titik akhir instans RDS Anda |
testdb | — | Nama database uji |
db_admin | — | Akun istimewa untuk administrasi |
cdc_user | — | Akun standar untuk mengonsumsi data CDC |
cdc_replication_slot | — | Nama slot replikasi |
Langkah 1: Buat database uji
Buka halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instans RDS Anda berada. Klik ID instans.
Di panel navigasi kiri, klik Databases.
Klik Create Database.
CatatanContoh ini membuat database bernama testdb. Untuk petunjuknya, lihat Buat database.

Langkah 2: Buat akun dan konfigurasi izin
Di panel navigasi kiri, klik Accounts.
Klik Create Account untuk membuat dua akun:

Akun istimewa bernama db_admin untuk administrasi
Akun standar bernama cdc_user untuk menangkap data perubahan
CatatanNama akun dalam contoh ini hanya sebagai referensi. Untuk petunjuknya, lihat Buat akun.
Lakukan koneksi ke instans sebagai db_admin:
CatatanUntuk menemukan titik akhir instans Anda, lihat Lihat dan ubah titik akhir serta nomor port.
psql -h <instance-endpoint> -p 5432 -U db_admin -d testdbBerikan role replication kepada cdc_user:
ALTER USER cdc_user WITH REPLICATION;Verifikasi pemberian tersebut:
SELECT rolreplication FROM pg_roles WHERE rolname='cdc_user';Output yang diharapkan:
rolreplication ---------------- t (1 row)Berikan izin SELECT pada semua tabel kepada cdc_user:
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;
Langkah 3: Atur wal_level menjadi logical
Parameter wal_level mengontrol seberapa banyak informasi yang ditulis ke log WAL. Nilai default-nya adalah replica. CDC memerlukan nilai logical, yang menambahkan informasi yang diperlukan untuk logical decoding.
| Nilai | Deskripsi |
|---|---|
minimal | Mencatat hanya data yang diperlukan untuk pulih dari crash atau shutdown langsung. Tidak mendukung pemulihan berbasis WAL menggunakan backup dasar atau log WAL. |
replica | Mendukung arsip WAL dan replikasi, termasuk query read-only pada server standby. |
logical | Menambahkan informasi yang diperlukan untuk logical decoding, di atas yang disediakan oleh replica. Diperlukan untuk CDC. |
Untuk memverifikasi nilai saat ini:
SELECT name, setting, short_desc, source
FROM pg_settings
WHERE name = 'wal_level';Output yang diharapkan:
name | setting | short_desc | source
----------+---------+---------------------------------------------------------------+--------------------
wal_level | replica | Sets the level of information written to the WAL. | configuration file
(1 row)Untuk mengubah wal_level menjadi logical:
Buka halaman Instances dan klik ID instans Anda.
Di panel navigasi kiri, klik Parameters.
Atur wal_level menjadi logical dan kirim perubahan tersebut.
Instans akan restart setelah Anda mengirim perubahan. Lakukan perubahan ini selama jam sepi untuk meminimalkan dampak. Untuk petunjuknya, lihat Ubah parameter instans ApsaraDB RDS for PostgreSQL.
Langkah 4: Buat slot replikasi logis
Tunggu hingga instans restart dan kembali ke status Running sebelum melanjutkan.
Lakukan koneksi ke instans sebagai db_admin:
psql -h <instance-endpoint> -p 5432 -U db_admin -d testdbBuat slot replikasi logis bernama
cdc_replication_slotmenggunakan plugin outputtest_decoding:Catatantest_decodingadalah plugin output yang disediakan oleh PostgreSQL open source.cdc_replication_slotadalah nama contoh — gunakan nama apa pun yang sesuai dengan kebutuhan Anda.SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');Output yang diharapkan:
pg_create_logical_replication_slot ------------------------------------ (cdc_replication_slot,1/14003428) (1 row)Verifikasi bahwa slot replikasi telah dibuat:
SELECT * FROM pg_replication_slots;Output yang diharapkan:
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase ---------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+----------- cdc_replication_slot | test_decoding | logical | 18822 | testdb | f | f | | | 22356 | 1/140033F0 | 1/14003428 | reserved | | f (1 row)
Langkah 5: Buat data uji
Jalankan pernyataan berikut untuk membuat tabel uji dan memasukkan data sampel:
CREATE TABLE public.tb_test(
id int NOT NULL PRIMARY KEY
);
ALTER TABLE public.tb_test ADD name varchar(1) NULL;
INSERT INTO public.tb_test SELECT 1, 'A';Langkah 6: Baca data perubahan dari slot replikasi
Lakukan koneksi ke instans sebagai cdc_user:
psql -h <instance-endpoint> -p 5432 -U cdc_user -d testdbBaca data perubahan dari slot replikasi tanpa mengonsumsinya:
SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);Output yang diharapkan:
lsn | xid | data -----------+-------+------------------------------------------------------------------------ 1/14003D90 | 22376 | BEGIN 22376 1/1401DDE8 | 22376 | COMMIT 22376 1/1401DDE8 | 22377 | BEGIN 22377 1/1401E100 | 22377 | COMMIT 22377 1/1401E2A8 | 22382 | BEGIN 22382 1/1401E2A8 | 22382 | table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' 1/1401E3C0 | 22382 | COMMIT 22382 (7 rows)
Langkah 7: Konsumsi data perubahan menggunakan pg_recvlogical
pg_recvlogical adalah tool logical decoding bawaan yang disertakan dengan PostgreSQL. Tool ini membaca dari slot replikasi dan memajukan posisi konsumsi sehingga data WAL yang telah dikonsumsi dapat dibersihkan.
Jalankan
\quntuk menutup koneksi database saat ini.Jalankan perintah berikut untuk mulai mengonsumsi data perubahan:
CatatanJalankan
pg_recvlogicalsebagai userpostgres(su - postgres). Jika Anda melihat-bash: pg_recvlogical: command not found, lihat FAQ.pg_recvlogical -h <instance-endpoint> -U <privileged-account> -d <database> \ --create-slot --if-not-exists --slot=cdc_replication_slot \ --plugin=test_decoding --start -f -Contoh:
pg_recvlogical -h pgm-*****.pgsql.singapore.rds.aliyuncs.com -U db_admin -d testdb \ --create-slot --if-not-exists --slot=cdc_replication_slot \ --plugin=test_decoding --start -f -Output yang diharapkan:
BEGIN 22376 COMMIT 22376 BEGIN 22377 COMMIT 22377 BEGIN 22382 table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' COMMIT 22382
Nonaktifkan fitur CDC
Slot replikasi tidak melacak konsumennya. Jika konsumsi dihentikan, log WAL akan terakumulasi dan dapat menghabiskan ruang disk, sehingga mengunci instans ke mode read-only. Hapus slot replikasi yang tidak aktif agar AliPG dapat membersihkan log WAL secara otomatis.
Hapus slot replikasi yang tidak aktif menggunakan salah satu metode berikut:
Konsol ApsaraDB RDS: Lihat Gunakan fitur manajemen log WAL.
Operasi API: Lihat DeleteSlot.
Pernyataan SQL: Ikuti langkah-langkah di bawah ini.
Untuk menghapus slot replikasi menggunakan SQL:
Lakukan koneksi ke instans sebagai db_admin:
psql -h <instance-endpoint> -p 5432 -U db_admin -d testdbDaftar slot replikasi yang tidak aktif:
SELECT slot_name, slot_type, database, active, safe_wal_size FROM pg_replication_slots WHERE active = 'f';Output yang diharapkan:
slot_name | slot_type | database | active | safe_wal_size ---------------------+-----------+----------+--------+--------------- cdc_replication_slot | logical | testdb | f | (1 row)Hapus slot replikasi:
SELECT pg_drop_replication_slot('cdc_replication_slot');
FAQ
Apa yang harus saya lakukan jika muncul pesan `pg_recvlogical: command not found`?
pg_recvlogical adalah tool logical decoding bawaan untuk PostgreSQL. Tool ini menggunakan ekstensi test_decoding default, yang disimpan di direktori contrib/test_decoding pada paket kode sumber PostgreSQL. Tool ini harus dijalankan sebagai user postgres (su - postgres). Jika perintah tidak ditemukan, kompilasi dan instal PostgreSQL dari kode sumber — tool ini berada di direktori /bin pada path instalasi. Lihat Instalasi dari kode sumber.
File WAL tetap menempati ruang disk setelah saya menghapus slot replikasi. Apa yang harus saya lakukan?
Atur wal_keep_segments ke nilai default-nya yaitu 128 untuk mengurangi jumlah file WAL yang disimpan. Lihat Ubah parameter instans ApsaraDB RDS for PostgreSQL.
Langkah selanjutnya
Logical Replication Slot Failover — pertahankan CDC tetap berjalan selama failover primary/secondary
Lihat pemantauan lanjutan — lacak ukuran log WAL dan penggunaan penyimpanan
Kelola alert — siapkan alert untuk penggunaan disk dan event penguncian instans