Replikasi logis dan decoding logis di Azure Database for PostgreSQL - Server Fleksibel

BERLAKU UNTUK: Azure Database for PostgreSQL - Server Fleksibel

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

  1. Replikasi logika

    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. Decoding logis yang diimplementasikan dengan decoding konten write-ahead log (WAL).

Membandingkan replikasi logis dan decoding logis

Replikasi logis dan decoding logis memiliki beberapa kesamaan. Keduanya akan:

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 untuk replikasi logis dan decoding logis

  1. Buka halaman parameter server di portal.

  2. Atur parameter server wal_level ke logical.

  3. Jika Anda ingin menggunakan ekstensi pglogical, cari shared_preload_librariesparameter , dan azure.extensions , dan 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. Konfirmasikan bahwa instans server fleksibel Azure Database for PostgreSQL Anda memungkinkan lalu lintas jaringan dari sumber daya penghubung Anda.

  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.

Catatan

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

Menggunakan replikasi logis dan decoding logis

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

Replikasi logika asli

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

  • Penerbit adalah database server fleksibel Azure Database for PostgreSQL tempat Anda mengirim data.
  • Pelanggan adalah database server fleksibel Azure Database for PostgreSQL yang Anda kirimi 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 mengkueri tabel pada pelanggan. Anda melihat bahwa ia telah menerima data dari penerbit.

    SELECT * FROM basic;
    

    Anda bisa menambahkan lebih banyak baris ke tabel penerbit dan menampilkan perubahan pada pelanggan.

    Jika Anda tidak dapat melihat data, aktifkan hak istimewa masuk untuk azure_pg_admin dan periksa konten tabel.

    ALTER ROLE azure_pg_admin login;
    

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. Mulai sekarang, membuat langganan yang tersambung 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 acara 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 pg_create_logical_replication_slot fungsi , 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 diatur create_slot ke false untuk mencegah server fleksibel Azure Database for PostgreSQL membuat slot baru, dan menentukan nama slot yang dibuat dengan benar di langkah sebelumnya. Sebelum menjalankan perintah, ganti tempat penampung di string koneksi dengan kredensial database Anda yang sebenarnya:

-- 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 menyaksikan rekaman baru dari database sumber di database target Anda, mengonfirmasi keberhasilan penyiapan 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=myPassword');
    
  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=myPasword' );
    
  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=myPassword');
    
  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. Harap perhatikan batasan lain dari ekstensi yang tercantum di sini.

Melakukan decoding logis

Decoding logis dapat digunakan melalui protokol streaming atau antarmuka SQL.

Protokol Streaming

Mengonsumsi perubahan menggunakan protokol streaming seringkali 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. Misalnya:

    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');
    

    Output-nya 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. Hilangkan slot setelah Anda selesai menggunakannya.

    SELECT pg_drop_replication_slot('test_slot');
    

Kunjungi dokumentasi PostgreSQL untuk memahami lebih lanjut tentang decoding logis.

Pemantauan

Anda harus memantau decoding logis. Slot replikasi yang tidak digunakan harus dihilangkan. Slot bertahan pada log POSTGRES WAL dan katalog sistem yang relevan sampai perubahan telah 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 pengemasan ID transaksi. Kedua situasi ini dapat menyebabkan server menjadi tidak tersedia. Oleh karena itu, slot replikasi logis harus dikonsumsi terus menerus. Jika slot replikasi logis tidak lagi digunakan, hilangkan segera.

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

SELECT * FROM pg_replication_slots;

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

Pembatasan

  • Batasan replikasi logis berlaku seperti yang didokumentasikan di sini.

  • Slot dan failover KETERSEDIAAN TINGGI - Saat menggunakan server berkemampuan ketersediaan tinggi (HA) dengan server fleksibel Azure Database for PostgreSQL, ketahuilah bahwa slot replikasi logis tidak dipertahankan selama peristiwa failover. Untuk mempertahankan slot replikasi logis dan memastikan konsistensi data setelah failover, disarankan untuk menggunakan ekstensi Slot Failover PG. Untuk informasi selengkapnya tentang mengaktifkan ekstensi ini, silakan lihat dokumentasi.

Penting

Anda harus menghilangkan slot replikasi logis di server utama jika pelanggan yang sesuai tidak ada lagi. Jika tidak, file WAL terakumulasi di primer, mengisi penyimpanan. Misalkan ambang penyimpanan melebihi ambang 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 akumulasi file WAL dan menghindari server Anda menjadi tidak tersedia karena penyimpanan terisi situasi.