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
Sebuah instance RDS telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instance ApsaraDB RDS for PostgreSQL.
Daftar putih alamat IP dikonfigurasi untuk mengizinkan permintaan dari klien ke instance RDS. Untuk informasi lebih lanjut, lihat Konfigurasikan Daftar Putih Alamat IP.
psql diinstal pada klien Anda. Untuk informasi lebih lanjut, lihat Dokumentasi Resmi PostgreSQL.
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.
CatatanKami 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
Pergi ke halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instance RDS berada. Kemudian, temukan instance RDS dan klik ID instance tersebut.
Di panel navigasi kiri halaman yang muncul, klik Databases.
Di halaman yang muncul, klik Create Database.
CatatanDalam contoh ini, sebuah database bernama testdb dibuat. Untuk informasi lebih lanjut, lihat Buat Database.
Langkah 2: Buat akun uji dan konfigurasikan izin
Di panel navigasi kiri halaman yang muncul, klik Accounts.
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.
CatatanNama 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.
Hubungkan klien Anda ke instance RDS menggunakan akun db_admin.
psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdbCatatanUntuk informasi lebih lanjut tentang cara mendapatkan titik akhir instance RDS, lihat Lihat dan Ubah Titik Akhir dan Nomor Port.
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)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
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.
Pergi ke halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instance RDS berada. Kemudian, temukan instance RDS dan klik ID instance tersebut.
Di panel navigasi kiri halaman yang muncul, klik Parameters.
Ubah nilai parameter wal_level menjadi logical.
CatatanUntuk 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
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:
Hubungkan klien Anda ke instance RDS menggunakan akun db_admin.
psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdbEksekusi pernyataan berikut untuk menggunakan
test_decodingguna membuat slot replikasi bernamacdc_replication_slot:SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');Catatancdc_replication_slothanya untuk referensi. Anda dapat menentukan nama sesuai dengan persyaratan bisnis Anda.test_decodingadalah 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
Hubungkan klien Anda ke instance RDS menggunakan akun cdc_user.
psql -h <Titik akhir instance RDS> -p 5432 -U cdc_user -d testdbEksekusi 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
Jalankan perintah
\quntuk menutup koneksi database.Jalankan perintah berikut untuk mengonsumsi data yang ditangkap:
CatatanAnda harus menjalankan perintah
pg_recvlogicalmenggunakan pengguna postgres. Anda dapat menjalankan perintah su - postgres untuk beralih ke pengguna postgres. Jika pesan kesalahan-bash: pg_recvlogical: command not foundditampilkan, 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:
Hubungkan ke instance RDS menggunakan akun db_admin.
psql -h <Titik akhir instance RDS> -p 5432 -U db_admin -d testdbEksekusi 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)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 foundditampilkan 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_segmentske nilai default128untuk mengurangi jumlah file yang disimpan. Untuk informasi lebih lanjut tentang cara memodifikasi parameter instance, lihat Modifikasi Parameter Instance ApsaraDB RDS for PostgreSQL.