All Products
Search
Document Center

ApsaraDB RDS:Slot replikasi logis pada instans hanya baca

Last Updated:Aug 26, 2026

Anda dapat membuat slot replikasi logis lokal pada instans hanya baca sehingga subscriber hilir mengonsumsi perubahan langsung dari instans tersebut, mengurangi beban replikasi logis pada instans utama.

Prasyarat

Instans Anda harus menjalankan PostgreSQL 16 atau versi yang lebih baru dengan versi kernel minor 20260530 atau lebih baru. Jika instans Anda tidak mendukung fitur ini, lakukan peningkatan versi kernel minor. Untuk informasi selengkapnya, lihat Peningkatan versi kernel minor.

Latar Belakang

Pada PostgreSQL asli, slot replikasi logis hanya tersedia di instans utama, sehingga subscriber hilir harus terhubung ke instans utama untuk mengonsumsi perubahan. RDS PostgreSQL memperluas kemampuan ini dengan mendukung slot replikasi logis lokal pada instans hanya baca, memungkinkan subscriber terhubung ke instans hanya baca dan mengurangi beban replikasi pada instans utama. Untuk informasi selengkapnya mengenai slot replikasi logis, lihat dokumentasi resmi PostgreSQL.

Catatan penggunaan

  • Slot replikasi logis yang dibuat pada instans hanya baca merupakan slot lokal dan tidak termasuk dalam proses failover. Jika instans hanya baca dibangun ulang, slot tersebut akan hilang dan harus dibuat kembali.

  • Gunakan fitur ini hanya pada instans hanya baca yang tidak kritis untuk ketersediaan tinggi. Jika instans hanya baca menangani traffic baca untuk ketersediaan tinggi, hilangnya slot dapat mengganggu langganan hilir. Evaluasi potensi dampak terhadap bisnis.

Contoh penggunaan

Contoh berikut menggunakan instans utama (RW) dan instans hanya baca (RO) yang disinkronkan melalui replikasi streaming, mencakup tiga kasus penggunaan umum:

  • Penggunaan dasar: Buat dan konsumsi slot secara manual pada instans hanya baca menggunakan plugin test_decoding. Metode ini cocok untuk skenario yang memerlukan logika decoding kustom.

  • Berlangganan ke instans hanya baca (pembuatan slot otomatis): Ini adalah kasus penggunaan paling umum, di mana perintah CREATE SUBSCRIPTION secara otomatis membuat slot pada instans hanya baca.

  • Berlangganan ke instans hanya baca (pembuatan slot manual sebelumnya): Ini adalah kasus penggunaan lanjutan di mana Anda membuat slot secara manual sebelum membuat langganan untuk memastikan tidak ada perubahan yang hilang selama proses penyiapan.

Penggunaan dasar: Pembuatan dan konsumsi manual

Buat slot replikasi logis secara manual pada instans hanya baca dan konsumsi perubahan data dari instans utama menggunakan plugin test_decoding.

  1. Buat slot replikasi logis lokal pada instans hanya baca.

    -- [RO] Buat slot replikasi logis lokal.
    SELECT pg_create_logical_replication_slot('my_slot', 'test_decoding');
  2. Verifikasi bahwa slot telah dibuat.

    -- [RO] Verifikasi bahwa slot telah dibuat.
    SELECT slot_name, plugin FROM pg_replication_slots WHERE slot_name = 'my_slot';

    Contoh output:

     slot_name |    plugin     
    -----------+---------------
     my_slot   | test_decoding 
    (1 row)
  3. Tulis data ke instans utama.

    -- [RW] Tulis data ke instans utama.
    INSERT INTO my_table VALUES (1), (2), (3);
  4. Tunggu hingga WAL direplay pada instans hanya baca.

    Pada instans utama, kueri LSN WAL saat ini:

    -- [RW] Dapatkan LSN WAL saat ini pada instans utama.
    SELECT pg_current_wal_lsn();

    Pada instans hanya baca, kueri progres replay hingga LSN replay lebih besar dari atau sama dengan LSN WAL pada instans utama:

    -- [RO] Periksa progres replay pada instans hanya baca.
    SELECT pg_last_wal_replay_lsn();
    Catatan

    Pada PostgreSQL 15 dan versi yang lebih baru, Anda juga dapat menggunakan fungsi pg_wal_replay_wait(target_lsn) untuk menunggu replay mencapai LSN tertentu alih-alih melakukan polling.

  5. Konsumsi perubahan melalui slot pada instans hanya baca.

    -- [RO] Konsumsi perubahan melalui slot.
    SELECT * FROM pg_logical_slot_get_changes('my_slot', NULL, NULL);

    Contoh output:

        lsn    | xid |                  data
    -----------+-----+----------------------------------------
     0/XXXXXXX | 123 | table public.my_table: INSERT: ...
    (3 rows)
  6. Jika slot tidak lagi diperlukan, hapus slot tersebut.

    -- [RO] Hapus slot.
    SELECT pg_drop_replication_slot('my_slot');

Langganan dengan pembuatan slot otomatis

Pada kasus penggunaan umum ini, subscriber hilir terhubung langsung ke instans hanya baca, dan perintah CREATE SUBSCRIPTION secara otomatis membuat slot pada instans tersebut.

  1. Buat tabel dan publikasi pada instans utama.

    -- [RW] Buat tabel dan publikasi pada instans utama.
    CREATE TABLE tab_rep (id int PRIMARY KEY, data text);
    CREATE PUBLICATION my_pub FOR TABLE tab_rep;
  2. Tunggu hingga WAL direplay pada instans hanya baca untuk memastikan publikasi terlihat. Untuk petunjuknya, lihat Langkah 4 pada bagian Penggunaan dasar.

  3. Buat struktur tabel yang sama pada subscriber hilir.

    -- [Subscriber] Buat struktur tabel pada instans subscriber.
    CREATE TABLE tab_rep (id int PRIMARY KEY, data text);
  4. Pada subscriber hilir, buat langganan yang terhubung ke instans hanya baca.

    -- [Subscriber] Buat langganan yang terhubung ke instans hanya baca.
    -- Langganan ini secara otomatis membuat slot bernama 'my_sub' pada instans hanya baca.
    CREATE SUBSCRIPTION my_sub
        CONNECTION 'host=<RO_HOST> port=<RO_PORT> dbname=postgres'
        PUBLICATION my_pub
        WITH (copy_data = off);
    Catatan

    Aksi ini secara otomatis membuat slot replikasi logis pada instans hanya baca. Slot ini bersifat lokal pada instans hanya baca, tidak termasuk dalam failover, dan akan hilang jika instans dibangun ulang.

  5. Tulis data ke instans utama dan verifikasi sinkronisasi.

    -- [RW] Tulis data ke instans utama.
    INSERT INTO tab_rep VALUES (1, 'hello'), (2, 'world');

    Aliran data: instans utama → (replikasi streaming/WAL) → instans hanya baca → (replikasi logis) → subscriber hilir.

    -- [Subscriber] Verifikasi bahwa data telah tersinkronisasi.
    SELECT * FROM tab_rep;

    Contoh output:

     id | data
    ----+-------
      1 | hello
      2 | world
    (2 rows)
  6. Jika langganan tidak lagi diperlukan, hapus langganan tersebut pada subscriber hilir. Aksi ini secara otomatis menghapus slot dari instans hanya baca.

    -- [Subscriber] Hapus langganan. Hal ini secara otomatis menghapus slot pada instans hanya baca.
    DROP SUBSCRIPTION my_sub;

Langganan dengan pembuatan slot manual sebelumnya

Untuk memastikan tidak ada perubahan yang hilang selama penyiapan, Anda dapat membuat slot secara manual sebelum membuat langganan.

  1. Buat slot secara manual pada instans hanya baca.

    -- [RO] Buat slot secara manual pada instans hanya baca.
    SELECT pg_create_logical_replication_slot('my_sub', 'pgoutput');
  2. Pada subscriber hilir, buat langganan yang menggunakan slot yang sudah ada.

    -- [Subscriber] Buat langganan dan gunakan slot yang sudah ada.
    CREATE SUBSCRIPTION my_sub
        CONNECTION 'host=<RO_HOST> port=<RO_PORT> dbname=postgres'
        PUBLICATION my_pub
        WITH (copy_data = off, create_slot = false);
    Catatan

    Mengatur create_slot = false menginstruksikan perintah CREATE SUBSCRIPTION untuk menggunakan slot yang sudah ada pada instans hanya baca alih-alih membuat slot baru. Langkah-langkah selanjutnya sama seperti pada bagian Berlangganan ke instans hanya baca (pembuatan slot otomatis).