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
.
Topik
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
Masuk ke AWS Management Console lalu buka konsol Amazon RDS di https://console.aws.amazon.com/rds/
. -
Di panel navigasi, pilih Instans penulis klaster DB Aurora PostgreSQL Anda.
-
Buka tab Konfigurasi untuk instans penulis klaster DB Aurora PostgreSQL. Di antara detail Instans, temukan tautan Grup parameter.
-
Pilih tautan untuk membuka parameter kustom yang terkait dengan klaster DB Aurora PostgreSQL.
-
Di kolom pencarian Parameter, ketik
shared_pre
untuk menemukan parametershared_preload_libraries
. -
Pilih Edit parameter untuk mengakses nilai properti.
-
Tambahkan
pglogical
ke daftar di kolom Nilai. Gunakan koma untuk memisahkan item dalam daftar nilai. Temukan parameter
rds.logical_replication
dan atur ke1
, untuk mengaktifkan replikasi logis.Boot ulang instans penulis klaster DB Aurora PostgreSQL sehingga perubahan Anda akan berlaku.
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
Untuk memverifikasi bahwa pglogical diinisialisasi, jalankan perintah berikut.
SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pglogical (1 row)
Verifikasi pengaturan yang memungkinkan penguraian kode logis, sebagai berikut.
SHOW wal_level;
wal_level ----------- logical (1 row)
Buat ekstensi, sebagai berikut.
CREATE EXTENSION pglogical;
EXTENSION CREATED
Pilih Simpan perubahan
Buka konsol Amazon RDS di https://console.aws.amazon.com/rds/
. 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.
Gunakan perintah AWS CLI berikut untuk menambah
pglogical
ke parametershared_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" \ --regionaws-region
Gunakan perintah AWS CLI berikut untuk mengatur
rds.logical_replication
ke1
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" \ --regionaws-region
-
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
\ --regionaws-region
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
Buat ekstensi, sebagai berikut.
CREATE EXTENSION pglogical;
EXTENSION CREATED
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
\ --regionaws-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
metacommand tablename
psq1
dan kemudian membuat tabel yang sama pada instans pelanggan. Prosedur berikut membuat tabel contoh pada penerbit (sumber) untuk tujuan demonstrasi.
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.
Buat contoh tabel menggunakan pernyataan SQL berikut.
CREATE TABLE docs_lab_table (a int PRIMARY KEY);
Mengisi tabel dengan data yang dihasilkan dengan menggunakan pernyataan SQL berikut.
INSERT INTO docs_lab_table VALUES (generate_series(1,5000));
INSERT 0 5000
Verifikasi bahwa data ada dalam tabel dengan menggunakan pernyataan SQL berikut.
SELECT count(*) FROM docs_lab_table;
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)
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.
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
-
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);
Verifikasi bahwa tabel ini kosong.
SELECT count(*) FROM docs_lab_table;
count ------- 0 (1 row)
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)
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 fungsipg_replication_slots
. Perhatikan nilai di kolom aktif. Biasanya, ini akan kembalit
(benar), menunjukkan bahwa replikasi aktif. Jika kueri kembalif
(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 menggunakanpsql
dan query fungsipg_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 sebagaireplicating
.
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.
Hubungkan ke simpul pelanggan menggunakan
psql
sebagai berikut.psql --host=
222222222222
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
Nonaktifkan langganan dengan menggunakan fungsi
pglogical.alter_subscription_disable
.SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true);
alter_subscription_disable ---------------------------- t (1 row)
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)
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)
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 |