All Products
Search
Document Center

ApsaraDB RDS:Gunakan\ slot\ replikasi\ untuk\ menyiapkan\ pelacakan\ perubahan

Last Updated:Mar 28, 2026

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:

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_level menjadi logical. 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.

PlaceholderNilai contohDeskripsi
<instance-endpoint>pgm-*****.pgsql.singapore.rds.aliyuncs.comTitik akhir instans RDS Anda
testdbNama database uji
db_adminAkun istimewa untuk administrasi
cdc_userAkun standar untuk mengonsumsi data CDC
cdc_replication_slotNama slot replikasi

Langkah 1: Buat database uji

  1. Buka halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instans RDS Anda berada. Klik ID instans.

  2. Di panel navigasi kiri, klik Databases.

  3. Klik Create Database.

    Catatan

    Contoh ini membuat database bernama testdb. Untuk petunjuknya, lihat Buat database.

    创建测试数据库

Langkah 2: Buat akun dan konfigurasi izin

  1. Di panel navigasi kiri, klik Accounts.

  2. Klik Create Account untuk membuat dua akun: 创建用户

    • Akun istimewa bernama db_admin untuk administrasi

    • Akun standar bernama cdc_user untuk menangkap data perubahan

    Catatan

    Nama akun dalam contoh ini hanya sebagai referensi. Untuk petunjuknya, lihat Buat akun.

  3. Lakukan koneksi ke instans sebagai db_admin:

    Catatan

    Untuk menemukan titik akhir instans Anda, lihat Lihat dan ubah titik akhir serta nomor port.

    psql -h <instance-endpoint> -p 5432 -U db_admin -d testdb
  4. Berikan 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)
  5. 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.

NilaiDeskripsi
minimalMencatat hanya data yang diperlukan untuk pulih dari crash atau shutdown langsung. Tidak mendukung pemulihan berbasis WAL menggunakan backup dasar atau log WAL.
replicaMendukung arsip WAL dan replikasi, termasuk query read-only pada server standby.
logicalMenambahkan 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:

  1. Buka halaman Instances dan klik ID instans Anda.

  2. Di panel navigasi kiri, klik Parameters.

  3. Atur wal_level menjadi logical dan kirim perubahan tersebut.

Penting

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.

  1. Lakukan koneksi ke instans sebagai db_admin:

    psql -h <instance-endpoint> -p 5432 -U db_admin -d testdb
  2. Buat slot replikasi logis bernama cdc_replication_slot menggunakan plugin output test_decoding:

    Catatan

    test_decoding adalah plugin output yang disediakan oleh PostgreSQL open source. cdc_replication_slot adalah 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)
  3. 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

  1. Lakukan koneksi ke instans sebagai cdc_user:

    psql -h <instance-endpoint> -p 5432 -U cdc_user -d testdb
  2. Baca 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.

  1. Jalankan \q untuk menutup koneksi database saat ini.

  2. Jalankan perintah berikut untuk mulai mengonsumsi data perubahan:

    Catatan

    Jalankan pg_recvlogical sebagai user postgres (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:

Untuk menghapus slot replikasi menggunakan SQL:

  1. Lakukan koneksi ke instans sebagai db_admin:

    psql -h <instance-endpoint> -p 5432 -U db_admin -d testdb
  2. Daftar 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)
  3. 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