Replikasi logis dan decoding logis di Azure Database for PostgreSQL

Instans server fleksibel Azure Database for PostgreSQL mendukung ekstraksi data logis dan metodologi replikasi berikut:

  1. Replikasi logis

    1. Menggunakan replikasi logika asli PostgreSQL untuk mereplikasi objek data. Replikasi logis memungkinkan kontrol halus atas replikasi data, termasuk replikasi data tingkat tabel.
    2. Menggunakan ekstensi pglogical yang menyediakan replikasi streaming logis dan lebih banyak kemampuan seperti menyalin skema awal database, dukungan untuk TRUNCATE, kemampuan untuk mereplikasi DDL, dll.
  2. Dekoding logika yang diimplementasikan dengan mendekode konten dari write-ahead log (WAL).

Bandingkan replikasi logika dan dekoding logika

Replikasi logis dan decoding logis memiliki beberapa kesamaan. Keduanya:

  • Memungkinkan Anda mereplikasi data dari Postgres.

  • Menggunakan write-ahead log (WAL) sebagai sumber perubahan.

  • Gunakan slot replikasi logis untuk mengirim data. Slot menggambarkan aliran perubahan.

  • Gunakan properti REPLICA IDENTITY sebuah tabel untuk menentukan perubahan apa yang dapat dikirim.

  • Jangan mereplikasi perubahan DDL.

Kedua teknologi tersebut memiliki perbedaan:

Replikasi logis:

  • Memungkinkan Anda menentukan tabel atau set tabel yang akan direplikasi.

Dekode logis:

  • Mengekstrak perubahan di semua tabel dalam database.

Prasyarat replikasi logis dan dekode logis

  1. Buka halaman parameter server di portal.

  2. Atur parameter server wal_level ke logical.

  3. Jika Anda ingin menggunakan ekstensi pglogical, cari parameter shared_preload_libraries dan azure.extensions, lalu pilih pglogical dari kotak daftar dropdown.

  4. Perbarui nilai parameter max_worker_processes ke minimal 16. Jika tidak, Anda mungkin mengalami masalah seperti WARNING: out of background worker slots.

  5. Simpan perubahan dan mulai ulang server untuk menerapkan perubahan.

  6. Pastikan server fleksibel Azure Database for PostgreSQL Anda dapat menerima lalu lintas jaringan dari sumber daya yang terhubung.

  7. Beri izin replikasi pada pengguna admin.

    ALTER ROLE <adminname> WITH REPLICATION;
    
  8. Anda mungkin ingin memastikan peran yang Anda gunakan memiliki hak istimewa pada skema yang Anda replikasi. Jika tidak, Anda mungkin mengalami kesalahan seperti Permission denied for schema.

Nota

Ini selalu merupakan praktik yang baik untuk memisahkan pengguna replikasi Anda dari akun admin reguler.

Gunakan replikasi logika dan dekoding logika

Menggunakan replikasi logis asli adalah cara paling sederhana untuk mereplikasi data dari instans server fleksibel Azure Database for PostgreSQL Anda. Anda dapat menggunakan antarmuka SQL atau protokol streaming untuk mengonsumsi perubahan. Anda juga dapat menggunakan antarmuka SQL untuk mengonsumsi perubahan dengan decoding logis.

Replikasi logika bawaan

Replikasi logika menggunakan istilah 'penerbit' dan 'pelanggan'.

  • Penerbit adalah instance database server fleksibel Azure Database for PostgreSQL tempat Anda mengirim data darinya.
  • Pelanggan penerima adalah database instans server fleksibel Azure Database for PostgreSQL yang Anda gunakan untuk mengirim data.

Berikut adalah beberapa contoh kode yang dapat Anda gunakan untuk mencoba replikasi logis.

  1. Sambungkan ke database penerbit. Buat tabel dan tambahkan beberapa data.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    INSERT INTO basic VALUES (1, 'apple');
    INSERT INTO basic VALUES (2, 'banana');
    
  2. Buat publikasi untuk tabel.

    CREATE PUBLICATION pub FOR TABLE basic;
    
  3. Sambungkan ke database pelanggan. Buat tabel dengan skema yang sama seperti pada penerbit.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    
  4. Buat langganan yang tersambung ke publikasi yang Anda buat sebelumnya.

    CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
    
  5. Sekarang Anda bisa melakukan kueri pada subskriptor. Anda melihat bahwa sistem telah menerima data dari penerbit.

    SELECT * FROM basic;
    

    Anda bisa menambahkan lebih banyak baris ke tabel penerbit dan melihat perubahan pada abonnemen.

    Jika Anda tidak dapat melihat data, beralihlah ke pengguna yang merupakan anggota azure_pg_admin peran dan periksa konten tabel.

Kunjungi dokumentasi PostgreSQL untuk memahami lebih lanjut tentang replikasi logis.

Menggunakan replikasi logis antar database di server yang sama

Saat Anda bertujuan untuk menyiapkan replikasi logis antara database yang berbeda yang berada di instans server fleksibel Azure Database for PostgreSQL yang sama, penting untuk mengikuti panduan khusus untuk menghindari pembatasan implementasi yang saat ini ada. Saat ini, membuat langganan yang terhubung ke kluster database yang sama hanya akan berhasil jika slot replikasi tidak dibuat dalam perintah yang sama; jika tidak, CREATE SUBSCRIPTION panggilan macet pada LibPQWalReceiverReceive peristiwa tunggu. Ini terjadi karena pembatasan yang ada dalam mesin Postgres, yang mungkin dihapus dalam rilis mendatang.

Untuk menyiapkan replikasi logis secara efektif antara database "sumber" dan "target" Anda di server yang sama sambil menghindari pembatasan ini, ikuti langkah-langkah yang diuraikan di bawah ini:

Pertama, buat tabel bernama "basic" dengan skema yang identik di database sumber dan target:

-- Run this on both source and target databases
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);

Selanjutnya, dalam database sumber, buat publikasi untuk tabel dan buat slot replikasi logis secara terpisah menggunakan fungsi pg_create_logical_replication_slot, yang membantu menghindari masalah gantung yang biasanya terjadi ketika slot dibuat dalam perintah yang sama dengan langganan. Anda perlu menggunakan pgoutput plugin:

-- Run this on the source database
CREATE PUBLICATION pub FOR TABLE basic;
SELECT pg_create_logical_replication_slot('myslot', 'pgoutput');

Setelah itu, dalam database target Anda, buat langganan ke publikasi yang dibuat sebelumnya, memastikan bahwa create_slot diatur ke false untuk mencegah instans server fleksibel Azure Database for PostgreSQL Anda membuat slot baru, serta menentukan nama slot yang telah dibuat dengan benar pada langkah sebelumnya. Sebelum menjalankan perintah, ganti placeholder di string koneksi dengan kredensial database yang Anda gunakan.

-- Run this on the target database
CREATE SUBSCRIPTION sub
   CONNECTION 'dbname=<source dbname> host=<server>.postgres.database.azure.com port=5432 user=<rep_user> password=<password>'
   PUBLICATION pub
   WITH (create_slot = false, slot_name='myslot');

Setelah menyiapkan replikasi logis, Anda sekarang dapat mengujinya dengan menyisipkan rekaman baru ke dalam tabel "dasar" di database sumber Anda lalu memverifikasi bahwa replikasinya ke database target Anda:

-- Run this on the source database
INSERT INTO basic SELECT 3, 'mango';

-- Run this on the target database
TABLE basic;

Jika semuanya dikonfigurasi dengan benar, Anda harus melihat catatan baru dari database sumber muncul di database target Anda, yang mengonfirmasi kesuksesan pengaturan replikasi logis.

ekstensi pglogis

Berikut adalah contoh mengonfigurasi pglogical di server database penyedia dan pelanggan. Lihat dokumentasi ekstensi pglogical, untuk rincian selengkapnya. Pastikan juga Anda telah melakukan tugas prasyarat yang tercantum di atas.

  1. Instal ekstensi pglogical dalam database di server database penyedia dan pelanggan.

    \c myDB
    CREATE EXTENSION pglogical;
    
  2. Jika pengguna replikasi selain pengguna administrasi server (yang membuat server), pastikan Anda memberikan keanggotaan dalam peran azure_pg_admin kepada pengguna dan menetapkan atribut REPLICATION dan LOGIN kepada pengguna. Lihat dokumentasi pdlogical untuk mengetahui detailnya.

    GRANT azure_pg_admin to myUser;
    ALTER ROLE myUser REPLICATION LOGIN;
    
  3. Di server database penyedia (sumber/penerbit), buat simpul penyedia.

    select pglogical.create_node( node_name := 'provider1',
    dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
    
  4. Buat set replikasi.

    select pglogical.create_replication_set('myreplicationset');
    
  5. Tambahkan semua tabel dalam database ke kumpulan replikasi.

    SELECT pglogical.replication_set_add_all_tables('myreplicationset', '{public}'::text[]);
    

    Sebagai metode alternatif, Anda juga dapat menambahkan tabel dari skema tertentu (misalnya, testUser) ke set replikasi default.

    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
    
  6. Di server database pelanggan, buat simpul pelanggan.

    select pglogical.create_node( node_name := 'subscriber1',
    dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>' );
    
  7. Buat langganan untuk memulai proses sinkronisasi dan replikasi.

    select pglogical.create_subscription (
    subscription_name := 'subscription1',
    replication_sets := array['myreplicationset'],
    provider_dsn := 'host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
    
  8. Anda kemudian dapat memverifikasi status langganan.

    SELECT subscription_name, status FROM pglogical.show_subscription_status();
    

Perhatian

Pglogical saat ini tidak mendukung replikasi DDL otomatis. Skema awal dapat disalin secara manual menggunakan pg_dump --schema-only. Pernyataan DDL dapat dijalankan pada penyedia dan pelanggan secara bersamaan menggunakan fungsi pglogical.replicate_ddl_command. Ketahui batasan lain dari ekstensi yang tercantum di sini.

Melakukan decoding logis

Decoding logis dapat diakses melalui protokol streaming atau antarmuka SQL.

Protokol Streaming

Mengonsumsi perubahan menggunakan protokol streaming umumnya lebih disukai. Anda dapat membuat konsumen/konektor Anda sendiri, atau menggunakan layanan pihak ketiga seperti Debezium.

Kunjungi dokumentasi wal2json untuk mengetahui contoh menggunakan protokol streaming dengan pg_recvlogical.

Antarmuka SQL

Dalam contoh di bawah ini, kami menggunakan antarmuka SQL dengan plugin wal2json.

  1. Buat slot.

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    
  2. Terbitkan perintah SQL. Contohnya:

    CREATE TABLE a_table (
       id varchar(40) NOT NULL,
       item varchar(40),
       PRIMARY KEY (id)
    );
    
    INSERT INTO a_table (id, item) VALUES ('id1', 'item1');
    DELETE FROM a_table WHERE id='id1';
    
  3. Konsumsi perubahan.

    SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
    

    Outputnya terlihat seperti:

    {
          "change": [
          ]
    }
    {
          "change": [
                   {
                            "kind": "insert",
                            "schema": "public",
                            "table": "a_table",
                            "columnnames": ["id", "item"],
                            "columntypes": ["character varying(40)", "character varying(40)"],
                            "columnvalues": ["id1", "item1"]
                   }
          ]
    }
    {
          "change": [
                   {
                            "kind": "delete",
                            "schema": "public",
                            "table": "a_table",
                            "oldkeys": {
                                  "keynames": ["id"],
                                  "keytypes": ["character varying(40)"],
                                  "keyvalues": ["id1"]
                            }
                   }
          ]
    }
    
  4. Lepaskan slot setelah Anda selesai menggunakannya.

    SELECT pg_drop_replication_slot('test_slot');
    

Kunjungi dokumentasi PostgreSQL untuk memahami lebih lanjut tentang decoding logis.

Monitor

Anda harus memantau decoding logis. Slot replikasi yang tidak digunakan harus dihilangkan. Slot menyimpan log Postgres WAL dan katalog-katalog sistem yang relevan sampai perubahan dibaca. Jika pelanggan atau konsumen Anda gagal atau jika dikonfigurasi dengan tidak benar, log yang tidak dikonsumsi menumpuk dan mengisi penyimpanan Anda. Selain itu, log yang tidak dikonsumsi meningkatkan risiko pembungkusan ID transaksi. Kedua situasi ini dapat menyebabkan server menjadi tidak tersedia. Oleh karena itu, slot replikasi logis harus digunakan secara berkelanjutan. Jika slot replikasi logis tidak lagi digunakan, hilangkan segera.

Kolom 'aktif' di tampilan pg_replication_slots menunjukkan apakah ada konsumen yang tersambung ke slot.

SELECT * FROM pg_replication_slots;

Atur pemberitahuan pada ID Transaksi Maksimum yang Digunakan dan metrik Storage Used untuk memberi tahu Anda saat nilai meningkat melewati ambang batas normal.

Keterbatasan

  • Batasan replikasi logis berlaku seperti yang didokumentasikan di sini.

  • Slot dan failover HA - Di PostgreSQL 16 dan yang lebih lama, saat menggunakan server berkemampuan ketersediaan tinggi (HA) dengan Azure Database for PostgreSQL, ketahuilah bahwa slot replikasi logis tidak dijaga selama peristiwa failover. Untuk mempertahankan slot replikasi logis dan memastikan konsistensi data setelah failover, disarankan untuk menggunakan ekstensi Slot Failover PG dan mengonfigurasi pengaturan pendukung seperti hot_standby_feedback = on. Untuk informasi selengkapnya tentang mengaktifkan ekstensi ini, silakan lihat dokumentasi.

Dukungan Failover untuk Slot Replikasi Logis

Untuk Versi PostgreSQL 17 ke atas, sinkronisasi slot didukung secara asli. Jika Anda mengaktifkan konfigurasi PostgreSQL yang benar (sync_replication_slots, hot_standby_feedback), slot replikasi logis dipertahankan secara otomatis setelah failover, dan tidak diperlukan ekstensi.

Penting

Anda harus menghilangkan slot replikasi logis di server utama jika pelanggan yang sesuai tidak ada lagi. Jika tidak, file WAL akan terakumulasi di server utama, memenuhi ruang penyimpanan. Server utama secara otomatis dialihkan ke mode baca-saja ketika penggunaan penyimpanan mencapai 95 persen, atau ketika kapasitas yang tersedia kurang dari 5 GiB. Misalkan ambang penyimpanan melebihi batas tertentu, dan slot replikasi logis tidak digunakan (karena pelanggan yang tidak tersedia), dalam hal ini, instans server fleksibel Azure Database for PostgreSQL secara otomatis menghilangkan slot replikasi logis yang tidak digunakan. Tindakan tersebut merilis file WAL yang terakumulasi dan menghindari server Anda menjadi tidak tersedia karena situasi penyimpanan yang terisi penuh.