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
pgactive
Ekstensi 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
Topik
- Menginisialisasi kemampuan ekstensi pgactive
- Menyiapkan replikasi aktif-aktif untuk cluster DB RDS SQL
- Menangani konflik dalam replikasi aktif-aktif
- Menangani urutan dalam replikasi aktif-aktif
- Referensi parameter untuk ekstensi pgactive
- Mengukur lag replikasi di antara anggota pgactive
- Batasan untuk ekstensi pgactive
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
Masuk ke AWS Management Console dan buka RDS konsol Amazon di https://console.aws.amazon.com/rds/
. -
Di panel navigasi, pilih instans Postgre SQL DB AndaRDS.
-
Buka tab Konfigurasi untuk instans Postgre SQL DB AndaRDS. Dalam detail instans, temukan tautan grup parameter instans DB.
-
Pilih tautan untuk membuka parameter kustom yang terkait dengan instans Postgre SQL DB AndaRDS.
Temukan parameter
rds.enable_pgactive
, lalu atur ke1
untuk menginisialisasi kemampuanpgactive
.Pilih Simpan perubahan.
Di panel navigasi RDS konsol Amazon, pilih Database.
Pilih RDS instans Postgre SQL DB Anda, lalu pilih Reboot dari menu Actions.
Konfirmasikan boot ulang instans DB sehingga perubahan Anda berlaku.
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
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 dishared_preload_libraries
, perintah sebelumnya akan mengembalikan yang berikut:?column? ---------- t
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.
Gunakan AWS CLI perintah berikut untuk mengatur
rds.enable_pgactive
1
untuk menginisialisasipgactive
kemampuan untuk instance Postgre SQL DB. RDSpostgres=>
aws rds modify-db-parameter-group \ --db-parameter-group-namecustom-param-group-name
\ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --regionaws-region
-
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
\ --regionaws-region
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
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.
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
Buat database pada SQL instance RDS for Postgre menggunakan perintah berikut:
postgres=>
CREATE DATABASEapp
;Alihkan koneksi ke basis data baru menggunakan perintah berikut:
\c
app
Untuk memeriksa apakah parameter
shared_preload_libraries
berisipgactive
, jalankan perintah berikut:app=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';?column? ---------- t
-
Membuat dan mengisi tabel sampel menggunakan SQL pernyataan berikut:
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);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');Verifikasi bahwa data ada dalam tabel dengan menggunakan SQL pernyataan berikut.
app=>
SELECT count(*) FROM inventory.products;count ------- 3
Buat ekstensi
pgactive
pada basis data yang ada.app=>
CREATE EXTENSION pgactive;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 ke1
.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.
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
Buat database pada kedua RDS untuk Postgre SQL DB instance menggunakan perintah berikut:
postgres=>
CREATE DATABASEapp
;Alihkan koneksi ke basis data baru menggunakan perintah berikut:
\c
app
Buat ekstensi
pgactive
pada basis data yang ada.app=>
CREATE EXTENSION pgactive;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
.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.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
Jalankan perintah berikut ini untuk memasukkan nilai baru:
app=>
INSERT INTO inventory.products (id, product_name) VALUES ('lotion');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:
Anda dapat melepas instans DB kedua dari instans DB pertama menggunakan perintah berikut:
app=>
SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app
']);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);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_history
Akan 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.