Menggunakan pgactive untuk mendukung replikasi aktif-aktif - Layanan Basis Data Relasional Amazon

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

Menggunakan pgactive untuk mendukung replikasi aktif-aktif

pgactiveEkstensi menggunakan replikasi aktif-aktif untuk mendukung dan mengoordinasikan operasi penulisan pada beberapa RDS database Postgre. SQL Amazon RDS untuk Postgre SQL mendukung pgactive ekstensi pada versi berikut:

  • RDSuntuk Postgre SQL 16.1 dan versi 16 yang lebih tinggi

  • RDSuntuk Postgre SQL 15.4-R2 dan versi 15 yang lebih tinggi

  • RDSuntuk Postgre SQL 14.10 dan versi 14 yang lebih tinggi

  • RDSuntuk Postgre SQL 13.13 dan versi 13 yang lebih tinggi

  • RDSuntuk Postgre SQL 12.17 dan versi 12 yang lebih tinggi

  • RDSuntuk Postgre 11.22 SQL

catatan

Ketika ada operasi tulis pada lebih dari satu basis data dalam konfigurasi replikasi, konflik mungkin terjadi. Untuk informasi selengkapnya, silakan lihat Menangani konflik dalam replikasi aktif-aktif

Menginisialisasi kemampuan ekstensi pgactive

Untuk menginisialisasi kemampuan pgactive ekstensi pada instance Postgre SQL DB AndaRDS, tetapkan nilai rds.enable_pgactive parameter ke 1 dan kemudian buat ekstensi dalam database. Melakukannya secara otomatis menyalakan parameter rds.logical_replication dan track_commit_timestamp lalu menetapkan nilai wal_level ke logical.

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

Anda dapat menggunakan AWS Management Console atau AWS CLI untuk membuat yang diperlukan RDS untuk instance Postgre SQL DB. Langkah-langkah berikut mengasumsikan bahwa instans Postgre SQL DB Anda RDS dikaitkan dengan grup parameter DB kustom. Untuk informasi tentang cara membuat grup parameter DB kustom, lihat Grup parameter untuk RDS.

Untuk menginisialisasi kemampuan ekstensi pgactive
  1. Masuk ke AWS Management Console dan buka RDS konsol Amazon di https://console.aws.amazon.com/rds/.

  2. Di panel navigasi, pilih instans Postgre SQL DB AndaRDS.

  3. Buka tab Konfigurasi untuk instans Postgre SQL DB AndaRDS. Dalam detail instans, temukan tautan grup parameter instans DB.

  4. Pilih tautan untuk membuka parameter kustom yang terkait dengan instans Postgre SQL DB AndaRDS.

  5. Temukan parameter rds.enable_pgactive, lalu atur ke 1 untuk menginisialisasi kemampuan pgactive.

  6. Pilih Simpan perubahan.

  7. Di panel navigasi RDS konsol Amazon, pilih Database.

  8. Pilih RDS instans Postgre SQL DB Anda, lalu pilih Reboot dari menu Actions.

  9. Konfirmasikan boot ulang instans DB sehingga perubahan Anda berlaku.

  10. Ketika instans DB tersedia, Anda dapat menggunakan psql atau SQL klien Postgre lainnya untuk terhubung ke instance RDS for SQL Postgre DB.

    Contoh berikut mengasumsikan bahwa instance Postgre SQL DB Anda RDS memiliki database default bernama postgres.

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

    postgres=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';

    Jika pgactive berada di shared_preload_libraries, perintah sebelumnya akan mengembalikan yang berikut:

    ?column? ---------- t
  12. Buat ekstensi, sebagai berikut.

    postgres=> CREATE EXTENSION pgactive;
Untuk menginisialisasi kemampuan ekstensi pgactive

Untuk menginisialisasi pgactive penggunaan AWS CLI, panggil modify-db-parameter-groupoperasi untuk memodifikasi parameter tertentu dalam grup parameter kustom Anda seperti yang ditunjukkan dalam prosedur berikut.

  1. Gunakan AWS CLI perintah berikut untuk mengatur rds.enable_pgactive 1 untuk menginisialisasi pgactive kemampuan untuk instance Postgre SQL DB. RDS

    postgres=>aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  2. Gunakan AWS CLI perintah berikut untuk reboot RDS untuk Postgre SQL DB instance sehingga pgactive perpustakaan diinisialisasi.

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. Ketika instance tersedia, gunakan psql untuk terhubung ke . RDSuntuk contoh Postgre SQL DB.

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master user --password --dbname=postgres
  4. Buat ekstensi, sebagai berikut.

    postgres=> CREATE EXTENSION pgactive;

Menyiapkan replikasi aktif-aktif untuk cluster DB RDS SQL

Prosedur berikut menunjukkan cara memulai replikasi aktif-aktif antara dua yang menjalankan Postgre RDS 15.4 atau lebih tinggi di wilayah SQL yang sama. SQL Untuk menjalankan contoh ketersediaan tinggi multi-wilayah, Anda perlu menerapkan Amazon RDS untuk SQL instans Postgre di dua wilayah berbeda dan menyiapkan Peering. VPC Untuk informasi lebih lanjut, lihat VPCmengintip.

catatan

Mengirim lalu lintas antar beberapa wilayah dapat menimbulkan biaya tambahan.

Langkah-langkah ini mengasumsikan bahwa instance RDS for Postgre SQL DB telah diatur dengan ekstensi. pgactive Untuk informasi selengkapnya, lihat Menginisialisasi kemampuan ekstensi pgactive.

Untuk mengkonfigurasi yang pertama RDS untuk instance Postgre SQL DB dengan ekstensi pgactive

Contoh berikut menggambarkan bagaimana pgactive grup dibuat, bersama dengan langkah-langkah lain yang diperlukan untuk membuat pgactive ekstensi pada instance RDS for Postgre SQL DB.

  1. Gunakan psql atau alat klien lain untuk terhubung ke instans Postgre SQL DB pertama RDS Anda.

    psql --host=firstinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. Buat database pada SQL instance RDS for Postgre menggunakan perintah berikut:

    postgres=> CREATE DATABASE app;
  3. Alihkan koneksi ke basis data baru menggunakan perintah berikut:

    \c app
  4. Untuk memeriksa apakah parameter shared_preload_libraries berisi pgactive, jalankan perintah berikut:

    app=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
    ?column? ---------- t
  5. Membuat dan mengisi tabel sampel menggunakan SQL pernyataan berikut:

    1. Buat tabel contoh menggunakan SQL pernyataan berikut.

      app=> CREATE SCHEMA inventory; CREATE TABLE inventory.products ( id int PRIMARY KEY, product_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);
    2. Isi tabel dengan beberapa data sampel dengan menggunakan SQL pernyataan berikut.

      app=> INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');
    3. Verifikasi bahwa data ada dalam tabel dengan menggunakan SQL pernyataan berikut.

      app=>SELECT count(*) FROM inventory.products; count ------- 3
  6. Buat ekstensi pgactive pada basis data yang ada.

    app=> CREATE EXTENSION pgactive;
  7. Buat dan inisialisasi grup pgactive menggunakan perintah berikut:

    app=> SELECT pgactive.pgactive_create_group( node_name := 'node1-app', node_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD');

    node1-app adalah nama yang Anda tetapkan untuk mengidentifikasi simpul secara unik dalam grup pgactive.

    catatan

    Untuk melakukan langkah ini dengan sukses pada instans DB yang dapat diakses publik, Anda harus mengaktifkan parameter rds.custom_dns_resolution dengan menyetelnya ke 1.

  8. Untuk memeriksa apakah instans DB sudah siap, gunakan perintah berikut ini:

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    Jika perintah berhasil, Anda dapat melihat output sebagai berikut:

    pgactive_wait_for_node_ready ------------------------------ (1 row)
Untuk mengkonfigurasi yang kedua RDS untuk SQL instance Postgre dan bergabung ke grup pgactive

Contoh berikut menggambarkan bagaimana Anda dapat menggabungkan instance RDS for Postgre SQL DB ke pgactive grup, bersama dengan langkah-langkah lain yang diperlukan untuk membuat pgactive ekstensi pada instans DB.

Langkah-langkah ini mengasumsikan bahwa lain RDSuntuk instance Postgre SQL DB telah disiapkan dengan ekstensi. pgactive Untuk informasi selengkapnya, lihat Menginisialisasi kemampuan ekstensi pgactive.

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

    psql --host=secondinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. Buat database pada kedua RDS untuk Postgre SQL DB instance menggunakan perintah berikut:

    postgres=> CREATE DATABASE app;
  3. Alihkan koneksi ke basis data baru menggunakan perintah berikut:

    \c app
  4. Buat ekstensi pgactive pada basis data yang ada.

    app=> CREATE EXTENSION pgactive;
  5. Bergabunglah dengan untuk instance DB SQL kedua Postgre ke grup sebagai berikut. pgactive

    app=> SELECT pgactive.pgactive_join_group( node_name := 'node2-app', node_dsn := 'dbname=app host=secondinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD', join_using_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');

    node2-app adalah nama yang Anda tetapkan untuk mengidentifikasi simpul secara unik dalam grup pgactive.

  6. Untuk memeriksa apakah instans DB sudah siap, gunakan perintah berikut ini:

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    Jika perintah berhasil, Anda dapat melihat output sebagai berikut:

    pgactive_wait_for_node_ready ------------------------------ (1 row)

    Jika yang pertama RDS untuk SQL database Postgre relatif besar, Anda dapat melihat pgactive.pgactive_wait_for_node_ready() memancarkan laporan kemajuan operasi pemulihan. Output akan terlihat serupa dengan yang berikut ini:

    NOTICE: restoring database 'app', 6% of 7483 MB complete NOTICE: restoring database 'app', 42% of 7483 MB complete NOTICE: restoring database 'app', 77% of 7483 MB complete NOTICE: restoring database 'app', 98% of 7483 MB complete NOTICE: successfully restored database 'app' from node node1-app in 00:04:12.274956 pgactive_wait_for_node_ready ------------------------------ (1 row)

    Dari titik ini ke depan, pgactive menyinkronkan data antara dua instans DB.

  7. Anda dapat menggunakan perintah berikut untuk memverifikasi apakah basis data instans DB kedua memiliki data:

    app=> SELECT count(*) FROM inventory.products;

    Jika data berhasil disinkronkan, Anda akan melihat output sebagai berikut:

    count ------- 3
  8. Jalankan perintah berikut ini untuk memasukkan nilai baru:

    app=> INSERT INTO inventory.products (id, product_name) VALUES ('lotion');
  9. Hubungkan ke basis data instans DB pertama dan jalankan kueri berikut:

    app=> SELECT count(*) FROM inventory.products;

    Jika replikasi aktif-aktif diinisialisasi, output serupa dengan berikut ini:

    count ------- 4
Melepas dan menghapus instans DB dari grup pgactive

Anda dapat melepas dan menghapus instans DB dari grup pgactive menggunakan langkah-langkah berikut:

  1. Anda dapat melepas instans DB kedua dari instans DB pertama menggunakan perintah berikut:

    app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
  2. Menghapus ekstensi pgactive dari instans DB kedua menggunakan perintah berikut:

    app=> SELECT * FROM pgactive.pgactive_remove();

    Untuk menghapus ekstensi secara paksa:

    app=> SELECT * FROM pgactive.pgactive_remove(true);
  3. Hapus sementara ekstensi menggunakan perintah berikut ini:

    app=> DROP EXTENSION pgactive;

Menangani konflik dalam replikasi aktif-aktif

Ekstensi pgactive bekerja per basis data dan bukan per klaster. Setiap instans DB yang menggunakan pgactive adalah instans independen dan dapat menerima perubahan data dari sumber apa pun. Ketika perubahan dikirim ke instance DB, Postgre SQL mengkomitmennya secara lokal dan kemudian menggunakannya pgactive untuk mereplikasi perubahan secara asinkron ke instance DB lainnya. Ketika dua instans Postgre SQL DB memperbarui catatan yang sama pada waktu yang hampir bersamaan, konflik dapat terjadi.

Ekstensi pgactive menyediakan mekanisme untuk deteksi konflik dan resolusi otomatis. Ini akan melacak stempel waktu ketika transaksi dilakukan pada kedua instans DB dan secara otomatis menerapkan perubahan dengan stempel waktu terbaru. Ekstensi pgactive juga melakukan log ketika konflik terjadi dalam tabel pgactive.pgactive_conflict_history.

pgactive.pgactive_conflict_historyAkan terus tumbuh. Anda mungkin ingin menentukan kebijakan pembersihan. Ini dapat dilakukan dengan menghapus beberapa catatan secara teratur atau mendefinisikan skema partisi untuk hubungan ini (dan kemudian melepaskan, menjatuhkan, memotong partisi yang menarik). Untuk menerapkan kebijakan pembersihan secara teratur, salah satu opsi adalah menggunakan pg_cron ekstensi. Lihat informasi berikut dari contoh untuk tabel pg_cron riwayat, Penjadwalan pemeliharaan dengan ekstensi Postgre SQL pg_cron.

Menangani urutan dalam replikasi aktif-aktif

Instance RDS for Postgre SQL DB dengan pgactive ekstensi menggunakan dua mekanisme urutan yang berbeda untuk menghasilkan nilai unik.

Urutan Global

Untuk menggunakan urutan global, buat urutan lokal dengan pernyataan CREATE SEQUENCE. Gunakan pgactive.pgactive_snowflake_id_nextval(seqname) alih-alih usingnextval(seqname) untuk mendapatkan nilai unik berikutnya dari urutan.

Contoh berikut membuat urutan global:

postgres=> CREATE TABLE gstest ( id bigint primary key, parrot text );
postgres=>CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
postgres=> ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
Urutan yang dipartisi

Dalam urutan split-step atau partisi, urutan Postgre SQL normal digunakan pada setiap node. Setiap urutan bertambah dengan jumlah yang sama dan dimulai pada offset yang berbeda. Misalnya, dengan langkah 100, simpul 1 menghasilkan urutan sebagai 101, 201, 301, dan seterusnya dan simpul 2 menghasilkan urutan sebagai 102, 202, 302, dan seterusnya. Skema ini bekerja dengan baik bahkan jika simpul tidak dapat berkomunikasi untuk waktu yang lama, tetapi mengharuskan perancang menentukan jumlah simpul maksimum saat membuat skema dan memerlukan konfigurasi per-simpul. Kesalahan dapat dengan mudah menyebabkan urutan yang tumpang tindih.

Hal ini relatif mudah untuk mengonfigurasi pendekatan ini dengan pgactive dengan membuat urutan yang diinginkan pada simpul sebagai berikut:

CREATE TABLE some_table (generated_value bigint primary key);
postgres=> CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
postgres=> ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');

Kemudian panggil setval setiap simpul untuk memberikan nilai awal offset yang berbeda sebagai berikut.

postgres=> -- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);

Referensi parameter untuk ekstensi pgactive

Anda dapat menggunakan kueri berikut untuk melihat semua parameter yang terkait dengan ekstensi pgactive.

postgres=> SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';

Mengukur lag replikasi di antara anggota pgactive

Anda dapat menggunakan kueri berikut untuk melihat lag replikasi di antara pgactive anggota. Jalankan kueri ini di setiap pgactive node untuk mendapatkan gambaran lengkap.

postgres=# SELECT *, (last_applied_xact_at - last_applied_xact_committs) AS lag FROM pgactive.pgactive_node_slots; -{ RECORD 1 ]----------------+----------------------------------------------------------------- node_name | node2-app slot_name | pgactive_5_7332551165694385385_0_5__ slot_restart_lsn | 0/1A898A8 slot_confirmed_lsn | 0/1A898E0 walsender_active | t walsender_pid | 69022 sent_lsn | 0/1A898E0 write_lsn | 0/1A898E0 flush_lsn | 0/1A898E0 replay_lsn | 0/1A898E0 last_sent_xact_id | 746 last_sent_xact_committs | 2024-02-06 18:04:22.430376+00 last_sent_xact_at | 2024-02-06 18:04:22.431359+00 last_applied_xact_id | 746 last_applied_xact_committs | 2024-02-06 18:04:22.430376+00 last_applied_xact_at | 2024-02-06 18:04:52.452465+00 lag | 00:00:30.022089

Batasan untuk ekstensi pgactive

  • Semua tabel memerlukan Kunci Primer, jika bukan Pembaruan dan Hapus tidak akan diperbolehkan. Nilai di kolom Kunci Primer tidak boleh diperbarui.

  • Urutan mungkin memiliki celah dan terkadang mungkin tidak mengikuti perintah. Urutan tidak direplikasi. Untuk informasi selengkapnya, lihat Menangani urutan dalam replikasi aktif-aktif.

  • DDLdan benda-benda besar tidak direplikasi.

  • Indeks unik sekunder dapat menyebabkan divergensi data.

  • Kolasi harus identik pada semua simpul dalam grup.

  • Penyeimbang beban di seluruh simpul adalah anti-pola.

  • Transaksi besar dapat menyebabkan kelambatan replikasi.