pglogical
.
Untuk mengetahui ringkasan pglogical
di AlloyDB Omni, manfaat, dan batasannya, lihat Tentang ekstensi pglogical.
Komponen utama pglogical
Komponen utama ekstensi pglogical
adalah sebagai berikut:
- Node: referensi yang diberikan untuk database dalam cluster PostgreSQL.
Ekstensi
pglogical
diinstal ke, dan berfungsi pada sejumlah database dalam cluster, dan masing-masing bertindak sebagai node pglogical yang berbeda. Setiap node dapat berupa penyedia yang juga dikenal sebagai sumber replikasi atau pelanggan yang juga dikenal sebagai target replikasi, atau keduanya secara bersamaan. Hanya satu node yang diizinkan per database. - Set replikasi: ditentukan dalam database penyedia sebagai pengelompokan logis
tabel dan urutan yang akan dimigrasikan, serta pernyataan SQL seperti
INSERT, UPDATE, DELETE, TRUNCATE
yang perlu direplikasi. Anda dapat menetapkan tabel ke lebih dari satu set replikasi. Secara default, tiga set replikasi yang telah dikonfigurasi sebelumnya sepertidefault
,default_insert_only
, danddl_sql
disediakan, dan Anda dapat menambahkan sejumlah set replikasi tambahan untuk memenuhi kebutuhan Anda. - Langganan: memberikan detail perubahan yang direplikasi dari database
penyedia dan perubahan yang direplikasi dari database penyedia, di database
pelanggan. Langganan menentukan database penyedia melalui string koneksi, dan secara opsional, set replikasi mana dari penyedia tersebut yang harus disalin. Selain itu, Anda juga dapat menentukan apakah akan menggunakan
apply delay
saat membuat langganan.
Dalam deployment ini, layanan AlloyDB untuk PostgreSQL adalah penyedia dan AlloyDB Omni on-premise adalah pelanggan. Perhatikan bahwa konfigurasi sebaliknya juga dapat dilakukan.
Metode autentikasi yang didukung
Anda harus mempertimbangkan jaringan dan keamanan antara node replikasi sebelum menerapkan ekstensi pglogical
di AlloyDB Omni.
Dua metode autentikasi utama yang digunakan dengan ekstensi pglogical
adalah metode autentikasi sandi dan kepercayaan.
Metode autentikasi yang direkomendasikan adalah autentikasi tepercaya karena dalam metode autentikasi sandi, sandi disimpan dalam format teks biasa di tabel database yang dimiliki oleh pglogical
. Sandi ini terlihat dalam teks biasa oleh siapa saja yang memiliki izin database untuk membuat kueri tabel ini, dalam cadangan non-biner, dan dalam file log PostgreSQL.
Jika Anda menggunakan metode autentikasi tepercaya, Anda harus membuat entri tertentu
dalam file autentikasi berbasis host, pg_hba.conf
untuk keamanan maksimum. Anda dapat
membatasi akses dengan menentukan database target, hanya mengizinkan opsi replikasi
atau database tertentu, pengguna replikasi, dan hanya dari alamat IP tertentu
pelanggan.
Sebelum memulai
Anda dapat menginstal pglogical
sebagai ekstensi dalam database tertentu.
Sebelum menerapkan ekstensi pglogical
di AlloyDB Omni, pastikan Anda memenuhi persyaratan sistem berikut:
- Cluster AlloyDB untuk PostgreSQL, dan akses baca/tulis ke instance utama sebagai Admin AlloyDB untuk PostgreSQL. Untuk mengetahui petunjuk cara mem-provisioning cluster AlloyDB untuk PostgreSQL, lihat Membuat dan menghubungkan ke database AlloyDB untuk PostgreSQL.
- Server AlloyDB Omni, yang diinstal dan dikonfigurasi. Untuk mengetahui petunjuk cara menginstal AlloyDB Omni, lihat Menginstal AlloyDB Omni.
- Alamat IP untuk instance utama AlloyDB untuk PostgreSQL dan server host AlloyDB Omni.
- Jaringan yang sudah dibuat dan diamankan antara AlloyDB untuk PostgreSQL dan server host AlloyDB Omni. Konektivitas TCP di port PostgreSQL standar 5432 diperlukan.
Menyesuaikan parameter di penyedia AlloyDB untuk PostgreSQL
Ekstensi pglogical
memerlukan serangkaian penyesuaian parameter minimal pada cluster penyedia AlloyDB for PostgreSQL. Anda harus menyetel parameter wal_level
ke logical
, dan menambahkan pglogical
ke parameter shared_preload_libraries
dalam file postgresql.conf
.
cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf
Di layanan AlloyDB untuk PostgreSQL, Anda dapat menyesuaikan parameter dengan menetapkan tanda cluster yang sesuai.
Anda harus menyesuaikan parameter untuk flag AlloyDB for PostgreSQL berikut:
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
Untuk mengetahui informasi tentang cara menyetel flag database di AlloyDB untuk PostgreSQL, lihat Mengonfigurasi flag database instance.
Untuk parameter database node penyedia lainnya yang diperlukan, Anda harus menetapkan nilai default AlloyDB untuk PostgreSQL sebagai berikut:
max_worker_processes
: satu per database penyedia dan minimal satu per node pelanggan. Setidaknya 10 adalah standar untuk parameter ini.max_replication_slots
: satu per node di node penyedia.max_wal_senders
: satu per node di node penyedia.track_commit_timestamp
: ditetapkan keon
jika resolusi konflik diperlukan untuk pembaruan terakhir atau pertama.listen_addresses
: harus menyertakan alamat IP AlloyDB Omni atau menyebutkannya melalui blok CIDR yang mencakupnya.
Anda dapat memeriksa parameter ini menggunakan alat kueri apa pun, seperti psql
.
Menyesuaikan parameter pada cluster pelanggan AlloyDB Omni
Ekstensi pglogical
juga memerlukan serangkaian penyesuaian parameter minimal pada
pelanggan AlloyDB Omni. Anda harus menambahkan pglogical
ke parameter shared_preload_libraries
dalam file DATA_DIR/postgresql.conf
. Jika ada database dalam cluster yang bertindak sebagai database penyedia, lakukan perubahan parameter yang diperlukan untuk database penyedia.
Ganti DATA_DIR dengan jalur sistem file ke direktori data Anda—misalnya, /home/$USER/alloydb-data
.
Sesuaikan parameter:
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
Pastikan parameter ditetapkan dengan benar:
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
Mulai ulang AlloyDB Omni agar perubahan parameter diterapkan:
Docker
docker container restart CONTAINER_NAME
Ganti
CONTAINER_NAME
dengan nama yang Anda tetapkan ke container AlloyDB Omni saat Anda menginstalnya.Podman
podman container restart CONTAINER_NAME
Ganti
CONTAINER_NAME
dengan nama yang Anda tetapkan ke container AlloyDB Omni saat Anda menginstalnya.Tetapkan nilai default AlloyDB Omni untuk parameter database penyedia lainnya:
max_worker_processes
: Satu per database penyedia dan satu per node pelanggan.track_commit_timestamp
: Setel keon
jika resolusi konflik yang dimenangkan oleh pembaruan terakhir atau pertama diperlukan.
Pastikan semua nilai parameter ditetapkan dengan benar:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Penyesuaian autentikasi berbasis host ke cluster pelanggan AlloyDB Omni
pglogical
membuat koneksi TCP lokal ke database pelanggan AlloyDB Omni. Oleh karena itu, Anda harus menambahkan alamat IP server host pelanggan ke file DATA_DIR/pg_hba.conf
AlloyDB Omni.
Tambahkan entri autentikasi tepercaya untuk server lokal, khusus untuk pengguna
pglogical_replication
baru, ke fileDATA_DIR/pg_hba.conf
:echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
Pastikan entri sudah benar:
tail -2 DATA_DIR/pg_hba.conf
Mulai ulang AlloyDB Omni agar perubahan autentikasi diterapkan:
Docker
docker container restart CONTAINER_NAME
Podman
podman container restart CONTAINER_NAME
Buat pengguna pglogical
di cluster penyedia dan pelanggan
Anda harus membuat pengguna baru di cluster penyedia dan pelanggan.
pglogical
mengharuskan pengguna memiliki izin superuser
dan replication
.
Di cluster penyedia AlloyDB untuk PostgreSQL, buat pengguna dan berikan peran
alloydbsuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
Di cluster pelanggan AlloyDB Omni, buat pengguna dan berikan atribut
replication
dansuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
Menambahkan pglogical
dan node ke database penyedia AlloyDB untuk PostgreSQL
Berikan hak istimewa yang diperlukan.
Anda harus menginstal ekstensi
pglogical
di setiap database dan memberikan izinusage
kepada pengguna database pglogical. Di AlloyDB untuk PostgreSQL, Anda harus memberikan hak istimewa pada skemapglogical
.Misalnya, jika database Anda adalah
my_test_db
, jalankan perintah berikut terhadap database penyedia AlloyDB untuk PostgreSQL:\c my_test_db; CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication; -- For Google Cloud AlloyDB we also need to manually grant privileges: GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
Buat node
pglogical
untuk database penyedia.node_name
bersifat arbitrer dan stringdsn
harus berupa koneksi TCP yang valid kembali ke database yang sama. Untuk AlloyDB untuk PostgreSQL, bagian host daridsn
adalah alamat IP yang diberikan untuk instance utama.Untuk AlloyDB untuk PostgreSQL, autentikasi tepercaya tidak diizinkan, dan argumen sandi harus disertakan dalam
dsn
. parameter.Misalnya, untuk database
my_test_db
, jalankan perintah berikut:SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
Buat tabel dan tambahkan ke kumpulan replikasi default
Buat tabel dan tambahkan ke set replikasi default di database penyedia AlloyDB for PostgreSQL.
Buat tabel pengujian bernama
test_table_1
di database penyedia:CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
Berikan
SELECT
pada setiap tabel atau jalankan perintahGRANT SELECT ON ALL TABLES
. Semua tabel yang akan menjadi bagian dari set replikasi harus memiliki izin kueri yang diberikan kepada pengguna replikasi,pglogical_replication
.GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
Tambahkan tabel pengujian ke set replikasi default secara manual. Anda dapat membuat set replikasi pglogical kustom, atau menggunakan set replikasi default. Beberapa set replikasi default seperti
default
,default_insert_only
, danddl_sql
dibuat saat Anda membuat ekstensi. Anda dapat menambahkan tabel dan urutan ke set replikasi satu per satu, atau sekaligus untuk skema tertentu.-- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
(Opsional) Tambahkan semua tabel dalam skema yang ditentukan, seperti
public
:-- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
Hapus tabel dari set replikasi
default
. Jika ada tabel dalam skema yang tidak memiliki kunci utama, Anda dapat menyiapkannya untuk replikasi khusus INSERT atau menetapkan kolom yang secara unik mengidentifikasi baris menggunakan fiturREPLICA IDENTITY
yang digunakan dengan perintahALTER TABLE
. Jika Anda telah menambahkan tabel tersebut ke set replikasidefault
secara otomatis menggunakan fungsireplication_set_add_all_tables
, maka Anda harus menghapusnya secara manual dari set replikasi tersebut dan menambahkannya ke setdefault_insert_only
.-- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
-- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
Jika ingin, Anda dapat menambahkan tabel yang baru dibuat ke set replikasi secara otomatis dengan menambahkan pemicu
pglogical_assign_repset
seperti yang disarankan di sumberpglogical
.
Menyalin database ke cluster pelanggan AlloyDB Omni
Buat cadangan hanya skema database sumber menggunakan utilitas
pg_dump
.Jalankan perintah
pg_dump
dari server pelanggan AlloyDB Omni menggunakan alamat IP instance utama AlloyDB untuk PostgreSQL.pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
Impor cadangan ke database pelanggan di server AlloyDB Omni pelanggan:
Docker
docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Podman
podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Abaikan error seperti alloydbsuperuser not existing
. Peran ini khusus untuk
AlloyDB untuk PostgreSQL.
Tindakan ini akan membuat database dan skema, tanpa data baris apa pun. Data
baris direplikasi oleh ekstensi pglogical
. Salin atau buat ulang pengguna atau peran lain yang diperlukan secara manual.
Membuat node dan langganan di database pelanggan AlloyDB Omni
Buat node di database pelanggan AlloyDB Omni:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Buat langganan di database pelanggan, yang mengarah kembali ke instance utama database penyedia AlloyDB untuk PostgreSQL.
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Berdasarkan ukuran tabel dan data yang akan direplikasi, waktu replikasi dapat bervariasi dari detik hingga menit, setelah itu data awal akan direplikasi dari penyedia ke pelanggan:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Baris tambahan yang ditambahkan ke database penyedia juga direplikasi dalam hitungan detik.
Pertimbangan tambahan untuk deployment pglogical
Ekstensi pglogical
memiliki banyak fitur lanjutan yang tidak dibahas dalam dokumen ini.
Banyak fitur ini dapat diterapkan pada implementasi Anda. Anda dapat mempertimbangkan fitur lanjutan berikut:
- Penyelesaian konflik
- Replikasi dua arah dan multimaster
- Penyertaan urutan
- Prosedur peralihan dan failover
Langkah berikutnya
- Mereplikasi data antara AlloyDB Omni dan database lain
- Switchover dan failover dengan replikasi
pglogical