Menggunakan pglogical untuk menyinkronkan data di seluruh instans - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan pglogical untuk menyinkronkan data di seluruh instans

Semua versi Aurora PostgreSQL yang tersedia saat ini mendukung ekstensi pglogical. Ekstensi pglogical mendahului fitur replikasi logis yang mirip secara fungsional yang diperkenalkan oleh PostgreSQL di versi 10. Untuk informasi selengkapnya, lihat Menggunakan replikasi logis PostgreSQL dengan Aurora.

Ekstensi pglogical ini mendukung replikasi logis antara dua atau lebih klaster DB Aurora PostgreSQL. Ini juga mendukung replikasi antara versi PostgreSQL yang berbeda, dan antara basis data yang berjalan pada instans RDS for PostgreSQL DB dan klaster DB Aurora PostgreSQL. Ekstensi pglogical menggunakan model berlangganan penerbitan untuk mereplikasi perubahan pada tabel dan objek lain, seperti urutan, dari penerbit ke pelanggan. Itu bergantung pada slot replikasi untuk memastikan bahwa perubahan disinkronkan dari simpul penerbit ke simpul pelanggan, didefinisikan sebagai berikut.

  • Simpul penerbit adalah klaster DB Aurora PostgreSQL yang merupakan sumber data yang akan direplikas ke simpul lain. Simpul penerbit mendefinisikan tabel yang akan direplikasi dalam kumpulan publikasi.

  • Simpul pelanggan adalah klaster DB Aurora PostgreSQL yang menerima pembaruan WAL dari penerbit. Pelanggan membuat langganan untuk terhubung ke penerbit dan mendapatkan data WAL yang diterjemahkan. Ketika pelanggan membuat langganan, slot replikasi dibuat pada simpul penerbit.

Berikut ini, Anda dapat menemukan informasi tentang cara mengatur ekstensi pglogical.

Persyaratan dan batasan untuk ekstensi pglogis

Semua rilis Aurora PostgreSQL yang tersedia saat ini untuk mendukung ekstensi pglogical.

Baik simpul penerbit maupun simpul pelanggan harus disiapkan untuk replikasi logis.

Tabel yang ingin Anda replikasi dari pelanggan ke penerbit harus memiliki nama yang sama dan skema yang sama. Tabel ini juga harus berisi kolom yang sama, dan kolom harus menggunakan tipe data yang sama. Tabel penerbit dan pelanggan harus memiliki kunci primer yang sama. Kami menyarankan Anda hanya menggunakan PRIMARY KEY sebagai kendala unik.

Tabel pada simpul pelanggan dapat memiliki kendala yang lebih permisif daripada yang ada di simpul penerbit untuk kendala CHECK dan kendala NOT NULL.

Ekstensi pglogical ini menyediakan fitur seperti replikasi dua arah yang tidak didukung oleh fitur replikasi logis yang dibangun ke dalam PostgreSQL (versi 10 dan lebih tinggi). Untuk informasi lebih lanjut, lihat PostgreSQL bi-directional replication using pglogical.

Menyiapkan ekstensi pglogical

Untuk menyiapkan ekstensi pglogical pada klaster DB Aurora PostgreSQL, Anda menambahkan pglogical ke pustaka bersama pada grup parameter klaster DB khusus untuk klaster DB Aurora PostgreSQL. Anda juga perlu mengatur nilai parameter rds.logical_replication ke 1, untuk mengaktifkan penguraian kode logis. Akhirnya, Anda membuat ekstensi di basis data. Anda dapat menggunakan AWS Management Console atau AWS CLI untuk tugas-tugas ini.

Anda harus memiliki izin sebagai peran rds_superuser untuk melakukan tugas-tugas ini.

Langkah-langkah berikut mengasumsikan bahwa klaster DB Aurora PostgreSQL Anda dikaitkan dengan grup parameter kluster DB khusus. Untuk informasi cara membuat grup grup parameter klaster DB, lihat Menggunakan grup parameter.

Menyiapkan ekstensi pglogical
  1. Masuk ke AWS Management Console lalu buka konsol Amazon RDS di https://console.aws.amazon.com/rds/.

  2. Di panel navigasi, pilih Instans penulis klaster DB Aurora PostgreSQL Anda.

  3. Buka tab Konfigurasi untuk instans penulis klaster DB Aurora PostgreSQL. Di antara detail Instans, temukan tautan Grup parameter.

  4. Pilih tautan untuk membuka parameter kustom yang terkait dengan klaster DB Aurora PostgreSQL.

  5. Di kolom pencarian Parameter, ketik shared_pre untuk menemukan parameter shared_preload_libraries.

  6. Pilih Edit parameter untuk mengakses nilai properti.

  7. Tambahkan pglogical ke daftar di kolom Nilai. Gunakan koma untuk memisahkan item dalam daftar nilai.

    Gambar parameter shared_preload_libraries dengan pglogical ditambahkan.
  8. Temukan parameter rds.logical_replication dan atur ke 1, untuk mengaktifkan replikasi logis.

  9. Boot ulang instans penulis klaster DB Aurora PostgreSQL sehingga perubahan Anda akan berlaku.

  10. Ketika instans tersedia, Anda dapat menggunakan psql (atau pgAdmin) untuk terhubung ke instans penulis klaster DB Aurora PostgreSQL Anda.

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  11. Untuk memverifikasi bahwa pglogical diinisialisasi, jalankan perintah berikut.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pglogical (1 row)
  12. Verifikasi pengaturan yang memungkinkan penguraian kode logis, sebagai berikut.

    SHOW wal_level; wal_level ----------- logical (1 row)
  13. Buat ekstensi, sebagai berikut.

    CREATE EXTENSION pglogical; EXTENSION CREATED
  14. Pilih Simpan perubahan

  15. Buka konsol Amazon RDS di https://console.aws.amazon.com/rds/.

  16. Pilih instans penulis klaster DB Aurora PostgreSQL dari daftar Basis Data untuk memilihnya, lalu pilih Boot ulang dari menu Tindakan.

Menyiapkan ekstensi pglogical

Untuk mengatur pglogical menggunakanAWS CLI, Anda memanggil modify-db-parameter-groupoperasi untuk memodifikasi parameter tertentu dalam grup parameter kustom Anda seperti yang ditunjukkan dalam prosedur berikut.

  1. Gunakan perintah AWS CLI berikut untuk menambah pglogical ke parameter shared_preload_libraries.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pglogical,ApplyMethod=pending-reboot" \ --region aws-region
  2. Gunakan perintah AWS CLI berikut untuk mengatur rds.logical_replication ke 1 untuk mengaktifkan kemampuan penguraian kode logis untuk instans penulis dari klaster DB Aurora PostgreSQL.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.logical_replication,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  3. Gunakan AWS CLI perintah berikut untuk melakukan boot ulang instans penulis klaster DB Aurora PostgreSQL sehingga pustaka pglogical dapat diinisialisasi.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  4. Ketika instans tersedia, gunakan psql untuk terhubung ke instans penulis klaster DB Aurora PostgreSQL Anda.

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  5. Buat ekstensi, sebagai berikut.

    CREATE EXTENSION pglogical; EXTENSION CREATED
  6. Boot ulang instans penulis Aurora PostgreSQL DB klaster instans PostgreSQL DB menggunakan perintah berikut. AWS CLI

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region

Menyiapkan replikasi logis untuk klaster DB Aurora PostgreSQL

Prosedur berikut menunjukkan cara memulai replikasi logis antara dua klaster DB Aurora PostgreSQL. Langkah-langkah mengasumsikan bahwa sumber (penerbit) dan target (pelanggan) memiliki ekstensi pglogical yang disiapkan seperti yang dijelaskan dalam Menyiapkan ekstensi pglogical.

Untuk membuat simpul penerbit dan menentukan tabel untuk direplikasi

Langkah-langkah ini mengasumsikan bahwa klaster DB Aurora PostgreSQL memiliki instans penulis dengan basis data yang memiliki satu atau beberapa tabel yang ingin direplikasi ke simpul lain. Anda perlu membuat ulang struktur tabel dari penerbit pada pelanggan, jadi pertama-tama, dapatkan struktur tabel jika perlu. Anda dapat melakukannya dengan menggunakan \d tablename metacommand psq1 dan kemudian membuat tabel yang sama pada instans pelanggan. Prosedur berikut membuat tabel contoh pada penerbit (sumber) untuk tujuan demonstrasi.

  1. Gunakan psql untuk terhubung ke instans yang memiliki tabel yang ingin Anda gunakan sebagai sumber untuk pelanggan.

    psql --host=source-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb

    Jika Anda tidak memiliki tabel yang ingin Anda tiru, Anda dapat membuat tabel contoh sebagai berikut.

    1. Buat contoh tabel menggunakan pernyataan SQL berikut.

      CREATE TABLE docs_lab_table (a int PRIMARY KEY);
    2. Mengisi tabel dengan data yang dihasilkan dengan menggunakan pernyataan SQL berikut.

      INSERT INTO docs_lab_table VALUES (generate_series(1,5000)); INSERT 0 5000
    3. Verifikasi bahwa data ada dalam tabel dengan menggunakan pernyataan SQL berikut.

      SELECT count(*) FROM docs_lab_table;
  2. Identifikasi klaster DB Aurora PostgreSQL ini sebagai simpul penerbit, sebagai berikut.

    SELECT pglogical.create_node( node_name := 'docs_lab_provider', dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 dbname=labdb'); create_node ------------- 3410995529 (1 row)
  3. Tambahkan tabel yang ingin Anda replikasi ke set replikasi default. Untuk informasi set replikasi selengkapnya, lihat Replication sets dalam dokumentasi pglogical.

    SELECT pglogical.replication_set_add_table('default', 'docs_lab_table', 'true', NULL, NULL); replication_set_add_table --------------------------- t (1 row)

Penyiapan simpul penerbit selesai. Anda sekarang dapat menyiapkan simpul pelanggan untuk menerima pembaruan dari penerbit.

Untuk menyiapkan simpul pelanggan dan membuat langganan untuk menerima pembaruan

Langkah-langkah ini mengasumsikan bahwa klaster DB Aurora PostgreSQL telah disiapkan dengan ekstensi pglogical. Untuk informasi selengkapnya, lihat Menyiapkan ekstensi pglogical.

  1. Gunakan psql untuk terhubung ke instans yang ingin Anda terima pembaruan dari penerbit.

    psql --host=target-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. Pada pelanggan klaster DB Aurora PostgreSQL, , buat tabel yang sama yang ada pada penerbit. Untuk contoh ini, tabelnya adalah docs_lab_table. Anda dapat membuat tabel sebagai berikut.

    CREATE TABLE docs_lab_table (a int PRIMARY KEY);
  3. Verifikasi bahwa tabel ini kosong.

    SELECT count(*) FROM docs_lab_table; count ------- 0 (1 row)
  4. Identifikasi klaster DB Aurora PostgreSQL ini sebagai simpul pelanggan, sebagai berikut.

    SELECT pglogical.create_node( node_name := 'docs_lab_target', dsn := 'host=target-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=********'); create_node ------------- 2182738256 (1 row)
  5. Buat langganan.

    SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=*******', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' ); create_subscription --------------------- 1038357190 (1 row)

    Ketika Anda menyelesaikan langkah ini, data dari tabel pada penerbit dibuat dalam tabel pada pelanggan. Anda dapat memverifikasi bahwa ini telah terjadi dengan menggunakan query SQL berikut.

    SELECT count(*) FROM docs_lab_table; count ------- 5000 (1 row)

Dari titik ini ke depan, perubahan yang dilakukan pada tabel pada penerbit direplikasi ke tabel pada pelanggan.

Membangun kembali replikasi logis setelah peningkatan besar

Sebelum Anda dapat melakukan peningkatan versi utama dari klaster DB Aurora PostgreSQL yang disiapkan sebagai simpul penerbit untuk replikasi logis, Anda harus menghapus semua slot replikasi, bahkan yang tidak aktif. Kami menyarankan Anda untuk mengalihkan sementara transaksi basis data dari simpul penerbit, menghapus sementara slot replikasi, meningkatkan klaster Aurora PostgreSQL, dan kemudian membangun kembali dan memulai ulang replikasi.

Slot replikasi hanya dihosting di simpul penerbit. Simpul pelanggan Aurora PostgreSQL dalam skenario replikasi logis tidak memiliki slot untuk dihapus sementara. Proses meningkatkan versi utama Aurora PostgreSQL mendukung peningkatan pelanggan ke versi utama baru PostgreSQL independen dari simpul penerbit. Namun, proses peningkatan memang mengganggu proses replikasi dan mengganggu sinkronisasi data WAL antara simpul penerbit dan simpul pelanggan. Anda perlu membangun kembali replikasi logis antara penerbit dan pelanggan setelah meningkatkan penerbit, pelanggan, atau keduanya. Prosedur berikut menunjukkan kepada Anda cara menentukan bahwa replikasi telah terganggu dan cara mengatasi masalah tersebut.

Menentukan bahwa replikasi logis telah terganggu

Anda dapat menentukan bahwa proses replikasi telah terganggu dengan menanyakan simpul penerbit atau simpul pelanggan, sebagai berikut.

Untuk memeriksa simpul penerbit
  • Gunakan psql untuk terhubung ke simpul penerbit, dan kemudian kueri fungsi pg_replication_slots. Perhatikan nilai di kolom aktif. Biasanya, ini akan kembali t (benar), menunjukkan bahwa replikasi aktif. Jika kueri kembali f (salah), ini merupakan indikasi bahwa replikasi ke pelanggan telah berhenti.

    SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots; slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_labcb4fa94_docs_lab3de412c | pglogical_output | logical | f (1 row)
Untuk memeriksa simpul pelanggan

Pada simpul pelanggan, Anda dapat memeriksa status replikasi dengan tiga cara berbeda.

  • Lihatlah log PostgreSQL pada simpul pelanggan untuk menemukan pesan kegagalan. Log dapat mengidentifikasi kegagalan dengan pesan yang menyertakan kode keluar 1, seperti yang ditunjukkan berikut.

    2022-07-06 16:17:03 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 14610) exited with exit code 1 2022-07-06 16:19:44 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 21783) exited with exit code 1
  • Kueri fungsi pg_replication_origin. Hubungkan ke basis data pada simpul pelanggan menggunakan psql dan query fungsi pg_replication_origin, sebagai berikut.

    SELECT * FROM pg_replication_origin; roident | roname ---------+-------- (0 rows)

    Kumpulan hasil kosong berarti replikasi telah terganggu. Umumnya, Anda akan melihat output seperti berikut ini.

    roident | roname ---------+---------------------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
  • Kueri fungsi pglogical.show_subscription_status seperti yang ditunjukkan pada contoh berikut.

    SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status(); subscription_name | status | slot_name ---====----------------+--------+------------------------------------- docs_lab_subscription | down | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)

    Output ini menunjukkan bahwa replikasi telah terganggu. Statusnya adalah down. Biasanya, output menunjukkan status sebagai replicating.

Jika proses replikasi logis Anda telah terganggu, Anda dapat membangun kembali replikasi dengan mengikuti langkah-langkah ini.

Untuk membangun kembali replikasi logis antara simpul penerbit dan pelanggan

Untuk membangun kembali replikasi, pertama-tama Anda memutuskan sambungan pelanggan dari simpul penerbit dan kemudian membangun kembali langganan, seperti yang diuraikan dalam langkah-langkah ini.

  1. Hubungkan ke simpul pelanggan menggunakan psql sebagai berikut.

    psql --host=222222222222.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. Nonaktifkan langganan dengan menggunakan fungsi pglogical.alter_subscription_disable.

    SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true); alter_subscription_disable ---------------------------- t (1 row)
  3. Dapatkan identifier simpul penerbit dengan menanyakan pg_replication_origin, sebagai berikut.

    SELECT * FROM pg_replication_origin; roident | roname ---------+------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
  4. Gunakan respons dari langkah sebelumnya dengan perintah pg_replication_origin_create untuk menetapkan pengenal yang dapat digunakan oleh langganan saat dibuat kembali.

    SELECT pg_replication_origin_create('pgl_labdb_docs_labcb4fa94_docs_lab3de412c'); pg_replication_origin_create ------------------------------ 1 (1 row)
  5. Nyalakan langganan dengan meneruskan namanya dengan status true, seperti yang ditunjukkan dalam contoh berikut.

    SELECT pglogical.alter_subscription_enable('docs_lab_subscription',true); alter_subscription_enable --------------------------- t (1 row)

Periksa status simpul. Statusnya harus replicating seperti yang ditunjukkan dalam contoh ini.

SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status(); subscription_name | status | slot_name -------------------------------+-------------+------------------------------------- docs_lab_subscription | replicating | pgl_labdb_docs_lab98f517b_docs_lab3de412c (1 row)

Periksa status slot replikasi pelanggan pada simpul penerbit. Kolom active slot harus kembali t (benar), menunjukkan bahwa replikasi telah dibuat kembali.

SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots; slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_lab98f517b_docs_lab3de412c | pglogical_output | logical | t (1 row)

Mengelola slot replikasi logis untuk Aurora PostgreSQL

Sebelum Anda dapat melakukan peningkatan versi utama dari instans penulis klaster DB Aurora PostgreSQL yang disiapkan sebagai simpul penerbit untuk replikasi logis, Anda harus menghapus semua slot replikasi, bahkan yang tidak aktif. Proses pra-pemeriksaan peningkatan versi utama akan memberi tahu Anda bahwa peningkatan tidak dapat dilanjutkan sampai slot dihapuskan sementara.

Untuk mengidentifikasi slot replikasi yang dibuat menggunakan ekstensi pglogical, masuk ke setiap basis data dan dapatkan nama simpul. Saat Anda menanyakan simpul pelanggan, Anda mendapatkan penerbit dan simpul pelanggan dalam output, seperti yang ditunjukkan dalam contoh ini.

SELECT * FROM pglogical.node; node_id | node_name ------------+------------------- 2182738256 | docs_lab_target 3410995529 | docs_lab_provider (2 rows)

Anda bisa mendapatkan detail tentang langganan dengan kueri berikut.

SELECT sub_name,sub_slot_name,sub_target FROM pglogical.subscription; sub_name | sub_slot_name | sub_target ----------+--------------------------------+------------ docs_lab_subscription | pgl_labdb_docs_labcb4fa94_docs_lab3de412c | 2182738256 (1 row)

Anda sekarang dapat menghapus sementara langganan, sebagai berikut.

SELECT pglogical.drop_subscription(subscription_name := 'docs_lab_subscription'); drop_subscription ------------------- 1 (1 row)

Setelah menghapus sementara langganan, Anda dapat menghapus simpul.

SELECT pglogical.drop_node(node_name := 'docs-lab-subscriber'); drop_node ----------- t (1 row)

Anda dapat memverifikasi bahwa simpul tidak ada lagi, sebagai berikut.

SELECT * FROM pglogical.node; node_id | node_name ---------+----------- (0 rows)

Referensi parameter untuk ekstensi pglogical

Dalam tabel Anda dapat menemukan parameter yang terkait dengan ekstensi pglogical. Parameter seperti pglogical.conflict_log_level dan pglogical.conflict_resolution digunakan untuk menangani konflik pembaruan. Konflik dapat muncul ketika perubahan dilakukan secara lokal ke tabel yang sama yang berlangganan perubahan dari penerbit. Konflik juga dapat terjadi selama berbagai skenario, seperti replikasi dua arah atau ketika beberapa pelanggan mereplikasi dari penerbit yang sama. Untuk informasi lebih lanjut, lihat PostgreSQL bi-directional replication using pglogical.

Parameter Deskripsi

pglogical.batch_inserts

Melakukan penyisipan batch jika memungkinkan. Tidak diatur secara default. Ubah ke '1' untuk menghidupkan, '0' untuk mematikan.

pglogical.conflict_log_level

Menetapkan tingkat log yang digunakan untuk mencatat log konflik yang diselesaikan. Nilai string yang didukung adalah debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic.

pglogical.conflict_resolution

Menetapkan metode untuk digunakan untuk menyelesaikan konflik ketika konflik dapat diselesaikan. Nilai string yang didukung adalah kesalahan, apply_remote, keep_local, last_update_wins, first_update_wins.

pglogical.extra_connection_options

Opsi koneksi untuk ditambahkan ke semua koneksi simpul peer.

pglogical.synchronous_commit

Nilai komit sinkron spesifik pglogical

pglogical.use_spi

Gunakan SPI (antarmuka pemrograman server) alih-alih API tingkat rendah untuk menerapkan perubahan. Atur ke '1' untuk menghidupkan, '0' untuk mematikan. Untuk informasi SPI selengkapnya, lihat Server Programming Interface dalam dokumentasi PostgreSQL.