全部产品
Search
文档中心

ApsaraDB RDS:Buat slot replikasi untuk mengaktifkan fitur CDC

更新时间:Jul 06, 2025

PostgreSQL sumber terbuka memungkinkan Anda menggunakan slot replikasi untuk mengaktifkan fitur Change Data Capture (CDC). Topik ini menjelaskan cara mengaktifkan fitur CDC pada instance ApsaraDB RDS for PostgreSQL.

Prasyarat

Catatan penggunaan

  • Fitur CDC hanya dapat diaktifkan dan digunakan pada instance RDS utama. Instance RDS baca-saja tidak didukung.

  • ApsaraDB RDS for PostgreSQL mendukung fitur Logical Replication Slot Failover. Pergantian utama/sekunder tidak memengaruhi fitur CDC. Untuk informasi lebih lanjut, lihat Logical Replication Slot Failover.

  • Sebelum mengaktifkan fitur CDC pada instance RDS, Anda harus memodifikasi parameter tertentu dari instance tersebut. Modifikasi parameter mungkin memicu restart instance. Untuk mencegah dampak pada beban kerja, kami menyarankan Anda memodifikasi parameter selama jam-jam sepi.

  • Setelah mengaktifkan fitur CDC pada instance RDS, perhatikan poin-poin berikut:

    • Instance RDS memerlukan lebih banyak penyimpanan untuk log WAL. Jika konsumsi data yang ditangkap tidak normal atau berhenti, log WAL tidak akan secara otomatis dihapus. Log-log tersebut akan menumpuk dan menghabiskan ruang disk. Dalam kasus ini, instance RDS mungkin terkunci dan hanya dapat memproses permintaan baca.

    • Jika klien hilir mengonsumsi baris data dari instance RDS, klien harus dikonfigurasi untuk melaporkan konsumsi secara real-time. Jika tidak, instance RDS akan menyimpan baris data dari beberapa versi. Hal ini dapat menyebabkan transaksi ID (XID) wraparound, dan instance RDS Anda hanya dapat memproses permintaan baca. Contoh log kesalahan:

      "HINT: Tutup transaksi terbuka segera untuk menghindari masalah wraparound. Anda mungkin juga perlu melakukan commit atau rollback transaksi yang sudah dipersiapkan sebelumnya, atau hapus slot replikasi yang kedaluwarsa."
      "PERINGATAN: xmin tertua jauh di masa lalu."

    Anda dapat secara manual menghapus slot replikasi untuk memungkinkan AliPG membersihkan log WAL dan baris data versi sebelumnya secara otomatis. Untuk informasi lebih lanjut, lihat Nonaktifkan Fitur CDC.

    Catatan

    Kami menyarankan Anda memantau ukuran log WAL dan penggunaan penyimpanan pada instance RDS secara berkala serta mengonfigurasi aturan peringatan. Untuk informasi lebih lanjut, lihat Lihat Metrik Pemantauan Lanjutan dari Instance ApsaraDB RDS for PostgreSQL dan Kelola Peringatan.

Aktifkan fitur CDC

Langkah 1: Buat database uji

  1. Pergi ke halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instance RDS berada. Kemudian, temukan instance RDS dan klik ID instance tersebut.

  2. Di panel navigasi kiri halaman yang muncul, klik Databases.

  3. Di halaman yang muncul, klik Create Database.创建测试数据库

    Catatan

    Dalam contoh ini, sebuah database bernama testdb dibuat. Untuk informasi lebih lanjut, lihat Buat Database.

Langkah 2: Buat akun uji dan konfigurasikan izin

  1. Di panel navigasi kiri halaman yang muncul, klik Accounts.

  2. Di halaman yang muncul, klik Create Account untuk membuat akun istimewa bernama db_admin dan akun standar bernama cdc_user. Akun istimewa memiliki hak administratif, sedangkan akun standar digunakan untuk menangkap data perubahan.创建用户

    Catatan

    Nama pengguna akun dalam contoh ini hanya untuk referensi. Anda dapat menentukan nama pengguna sesuai dengan persyaratan bisnis Anda. Untuk informasi lebih lanjut tentang cara membuat akun, lihat Buat Akun.

  3. Hubungkan klien Anda ke instance RDS menggunakan akun db_admin.

    psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdb
    Catatan

    Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir instance RDS, lihat Lihat dan Ubah Titik Akhir dan Nomor Port.

  4. Eksekusi pernyataan berikut untuk memberikan peran replikasi kepada akun cdc_user:

    ALTER USER cdc_user WITH REPLICATION;

    Anda dapat mengeksekusi pernyataan berikut untuk menanyakan hasilnya:

    SELECT rolreplication FROM pg_roles WHERE rolname='cdc_user';

    Contoh keluaran:

     rolreplication
    ----------------
     t
    (1 row)
  5. Eksekusi pernyataan berikut untuk memberikan izin kepada akun cdc_user:

    GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;

Langkah 3: Ubah parameter instance RDS

  1. Eksekusi pernyataan berikut untuk menanyakan pengaturan parameter instance RDS:

    SELECT name,
           setting,
           short_desc,
           source
    FROM pg_settings
    WHERE name ='wal_level';

    Contoh keluaran:

             name          | setting |                               short_desc                                |       source
    -----------------------+---------+-------------------------------------------------------------------------+--------------------
     wal_level             | replica | Sets the level of information written to the WAL.                       | configuration file
    (1 rows)

    Parameter wal_level menentukan jumlah data yang dapat ditulis ke log WAL. Nilai default adalah replica. Anda hanya dapat mengonfigurasi parameter ini saat server dimulai. Nilai valid:

    • minimal: mencatat hanya data yang diperlukan untuk memulihkan instance dari kegagalan atau shutdown langsung. Pada level minimal, database tidak dapat dipulihkan menggunakan backup dasar atau log WAL.

    • replica: menulis cukup banyak data untuk mendukung arsip WAL dan replikasi, termasuk menjalankan query baca-saja pada server cadangan.

    • logical: menambahkan informasi yang diperlukan untuk mendukung decoding logis selain data yang ditulis pada level replica.

  2. Pergi ke halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instance RDS berada. Kemudian, temukan instance RDS dan klik ID instance tersebut.

  3. Di panel navigasi kiri halaman yang muncul, klik Parameters.

  4. Ubah nilai parameter wal_level menjadi logical.

    Catatan
    • Untuk informasi lebih lanjut tentang cara memodifikasi parameter instance, lihat Modifikasi Parameter Instance ApsaraDB RDS for PostgreSQL.

    • Setelah Anda memodifikasi parameter dan mengirimkan modifikasi, instance RDS akan restart. Untuk mencegah dampak pada beban kerja Anda, kami menyarankan Anda memodifikasi parameter selama jam-jam sepi.

Langkah 4: Buat slot replikasi logis

Catatan

Setelah Anda memodifikasi parameter dan mengirimkan modifikasi di Langkah 3, instance RDS akan restart agar modifikasi berlaku. Anda dapat melakukan operasi berikut ketika instance RDS dalam status Berjalan:

  1. Hubungkan klien Anda ke instance RDS menggunakan akun db_admin.

    psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdb
  2. Eksekusi pernyataan berikut untuk menggunakan test_decoding guna membuat slot replikasi bernama cdc_replication_slot:

    SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');
    Catatan
    • cdc_replication_slot hanya untuk referensi. Anda dapat menentukan nama sesuai dengan persyaratan bisnis Anda.

    • test_decoding adalah ekstensi output yang disediakan oleh PostgreSQL sumber terbuka. Anda dapat langsung menggunakan test_decoding dalam pernyataan.

    Contoh keluaran:

     pg_create_logical_replication_slot
    ------------------------------------
     (cdc_replication_slot,1/14003428)
    (1 row)

    Anda dapat mengeksekusi pernyataan berikut untuk menanyakan hasilnya:

    SELECT * FROM pg_replication_slots;

    Contoh keluaran:

          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

Eksekusi pernyataan berikut untuk membuat data uji dan mensimulasikan lingkungan produksi:

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 menggunakan klien Anda

  1. Hubungkan klien Anda ke instance RDS menggunakan akun cdc_user.

    psql -h <Titik akhir instance RDS> -p 5432 -U cdc_user -d testdb
  2. Eksekusi pernyataan berikut untuk membaca data dari slot replikasi:

    SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);

    Contoh keluaran:

        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 yang ditangkap menggunakan klien Anda

  1. Jalankan perintah \q untuk menutup koneksi database.

  2. Jalankan perintah berikut untuk mengonsumsi data yang ditangkap:

    Catatan

    Anda harus menjalankan perintah pg_recvlogical menggunakan pengguna postgres. Anda dapat menjalankan perintah su - postgres untuk beralih ke pengguna postgres. Jika pesan kesalahan -bash: pg_recvlogical: command not found ditampilkan, selesaikan masalah berdasarkan deskripsi di FAQ.

    pg_recvlogical -h <Titik akhir instance RDS> -U <Akun istimewa> -d <Database uji> --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 -

    Contoh keluaran:

    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

Jika Anda mengaktifkan fitur CDC pada instance RDS, instance RDS memerlukan lebih banyak penyimpanan untuk log WAL. Jika konsumsi data yang ditangkap tidak normal atau berhenti, log WAL tidak akan secara otomatis dihapus. Log-log tersebut akan menumpuk dan menghabiskan ruang disk. Dalam kasus ini, instance RDS mungkin terkunci dan hanya dapat memproses permintaan baca. Anda dapat secara manual menghapus slot replikasi yang tidak aktif untuk memungkinkan AliPG membersihkan log WAL secara otomatis.

Anda dapat menghapus slot replikasi yang tidak aktif di konsol ApsaraDB RDS, dengan memanggil operasi API, atau dengan mengeksekusi pernyataan SQL.

  • Konsol ApsaraDB RDS: Gunakan Fitur Manajemen Log WAL untuk Instance ApsaraDB RDS for PostgreSQL.

  • Operasi API: DeleteSlot.

  • Pernyataan SQL:

    1. Hubungkan ke instance RDS menggunakan akun db_admin.

      psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdb
    2. Eksekusi pernyataan berikut untuk melihat nama dan informasi terkait tentang slot replikasi yang tidak aktif:

      SELECT slot_name, slot_type, database, active, safe_wal_size
      FROM pg_replication_slots
      WHERE active = 'f';

      Contoh keluaran:

            slot_name       | slot_type | database | active | safe_wal_size
      ----------------------+-----------+----------+--------+---------------
       cdc_replication_slot | logical   | testdb   | f      |
      (1 row)
    3. Eksekusi pernyataan berikut untuk menghapus slot replikasi logis:

      SELECT pg_drop_replication_slot('cdc_replication_slot');

FAQ

  • Apa yang harus saya lakukan jika pesan kesalahan -bash: pg_recvlogical: command not found ditampilkan ketika klien mengonsumsi data yang ditangkap?

    pg_recvlogical adalah alat decoding logis asli untuk PostgreSQL. Alat ini menggunakan ekstensi test_decoding default. Ekstensi test_decoding disimpan di direktori contrib/test_decoding paket kode sumber PostgreSQL. Kami menyarankan Anda mengompilasi kode sumber PostgreSQL dan menginstal PostgreSQL. Kemudian, Anda dapat menemukan alat pg_recvlogical di direktori /bin jalur instalasi PostgreSQL. Untuk informasi lebih lanjut tentang cara menginstal PostgreSQL dari kode sumber, lihat Instalasi dari Kode Sumber.

  • Apa yang harus saya lakukan jika saya menghapus slot replikasi tetapi file WAL tidak secara otomatis dibersihkan dan masih menempati ruang disk?

    Anda dapat mengatur parameter wal_keep_segments ke nilai default 128 untuk mengurangi jumlah file yang disimpan. Untuk informasi lebih lanjut tentang cara memodifikasi parameter instance, lihat Modifikasi Parameter Instance ApsaraDB RDS for PostgreSQL.