Di PostgreSQL, replikasi logis adalah metode untuk menyalin perubahan data dari database penayang ke satu atau beberapa pelanggan, yang dapat berupa database atau aplikasi lainnya. Anda dapat mengaktifkan dan mengonfigurasi replikasi logis di cluster yang Anda buat menggunakan Operator Kubernetes AlloyDB Omni.
Dokumen ini memberikan contoh yang menunjukkan cara membuat dan mengonfigurasi cluster penayang dan cluster pelanggan. Sebelum membaca dokumen ini, Anda harus memahami ringkasan AlloyDB Omni. Anda juga harus mengetahui batasan replikasi logis PostgreSQL.
Cuplikan kode di halaman ini adalah contoh yang dapat Anda gunakan sebagai model, yang mengganti nilai dengan nilai untuk resource AlloyDB Omni Anda.
Membuat cluster
Buat cluster penayang.
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-publisher type: Opaque data: publisher: "b2RzcGFzc3dvcmQ=" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: publisher spec: primarySpec: adminUser: passwordRef: name: db-pw-publisher databaseVersion: "15.7.0" resources: memory: 10Gi cpu: 1 disks: - name: DataDisk size: 40Gi EOF
Buat cluster pelanggan.
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-subscriber type: Opaque data: subscriber: "b2RzcGFzc3dvcmQ=" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: subscriber spec: primarySpec: adminUser: passwordRef: name: db-pw-subscriber databaseVersion: "15.7.0" resources: memory: 10Gi cpu: 1 disks: - name: DataDisk size: 40Gi EOF
Mengonfigurasi cluster penayang
Konfigurasikan cluster penayang dan buat tabel. Secara opsional, Anda dapat memublikasikan data sebagai pengujian untuk memastikan data direplikasi ke pelanggan.
Perbarui parameter
wal_level
kelogical
.$ kubectl patch dbclusters.al publisher -p '{"spec":{"primarySpec":{"parameters":{"wal_level":"logical"}}}}' --type=merge
Temukan pod yang Anda perlukan.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=publisher, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
Login ke pod database untuk cluster penayang.
NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 36m $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash
Buat database dengan nama
customer
.CREATE DATABASE customer;
Opsional: Untuk tujuan pengujian, tambahkan tabel ke database dan masukkan beberapa data. Anda dapat menggunakan data ini untuk mengamati replikasi data dari penayang ke pelanggan.
$ psql -h localhost -U postgres customer customer=# CREATE TABLE COMPANY( customer(# ID INT PRIMARY KEY NOT NULL, customer(# NAME TEXT NOT NULL, customer(# AGE INT NOT NULL, customer(# SALARY REAL customer(# ); CREATE TABLE customer=# INSERT INTO COMPANY (ID,NAME,AGE,SALARY) VALUES customer-# (1, 'Quinn', 25, 65000.00), customer-# (2, 'Kim', 22, 72250.00), customer-# (3, 'Bola', 31, 53000.00), customer-# (4, 'Sasha', 33, 105000.00), customer-# (5, 'Yuri', 27, 85000.00); INSERT 0 5 customer=# \dt List of relations Schema | Name | Type | Owner --------+---------+-------+---------- public | company | table | postgres (1 row) customer=# select * from company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
Buat pengguna
logicalreplica
untuk replikasi dan untuk memberikan izin.CREATE USER logicalreplica WITH REPLICATION LOGIN PASSWORD '123';
Berikan izin. Contoh ini menggunakan skema publik.
GRANT SELECT ON ALL TABLES IN SCHEMA public TO logicalreplica; GRANT USAGE ON SCHEMA public TO logicalreplica; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO logicalreplica;
Buat publikasi di database
customer
.CREATE PUBLICATION pub_customer; ALTER PUBLICATION pub_customer ADD TABLE company;
Mengonfigurasi cluster pelanggan
Mengaktifkan cluster pelanggan untuk menerima update data dari cluster penayang.
Tetapkan parameter
wal_level
kelogical
di database pelanggan.$ kubectl patch dbclusters.al subscriber -p '{"spec":{"primarySpec":{"parameters":{"wal_level":"logical"}}}}' --type=merge
Temukan pod yang Anda perlukan.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=subscriber, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
Login ke pod database cluster pelanggan.
$ kubectl get pod NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 20h $ kubectl exec -ti al-3513-subscriber-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-3513-subscriber-0:/$
Temukan alamat IP pod penayang, seperti
10.116.14.190
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE al-publisher-rw-ilb ClusterIP 10.116.14.190 <none> 5432/TCP 21h
Ambil cadangan skema dari penayang sebagai salinan awal data yang dipublikasikan di database penayang. Replikasi logis tidak mendukung replikasi DDL. Skema atau tabel yang ingin Anda replikasi harus ada di tujuan (cluster pelanggan) sebelum replikasi logis dimulai.
postgres@al-3513-subscriber-0:/$ pg_dump -h 10.116.14.190 -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
Terapkan cadangan di database pelanggan.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
Opsional: Pastikan tidak ada data dalam tabel.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
Buat langganan untuk database
customer
.postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# CREATE SUBSCRIPTION sub_customer CONNECTION 'host=10.116.14.190 port=5432 user=logicalreplica dbname=customer password=123' PUBLICATION pub_customer;
Opsional: Verifikasi replikasi di cluster pelanggan.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# select * from public.company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
Di cluster penayang, tambahkan baris ke tabel.
# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# insert into company(id, name, age, salary) values (6, 'Alex', 39, 100000);
Di cluster pelanggan, pastikan baris yang ditambahkan ke tabel di cluster penayang telah direplikasi ke tabel di cluster pelanggan.
# On the subscriber database, data is synced. postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# select * from company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 6 | Alex | 39 | 100000 (6 rows)
Membuat tabel tambahan secara manual
Replikasi logis tidak otomatis menyinkronkan perubahan DDL, tidak seperti
replicate_ddl_command
di pglogical
. Meskipun alat open source
pgl_ddl_deploy
menawarkan solusi, Anda juga dapat menjalankan perintah DDL secara manual di
pelanggan.
Untuk mengilustrasikannya, buat tabel baru bernama
finance
dalam databasecustomer
di cluster penayang.# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# insert into finance values ('critical data'); INSERT 0 1 customer=# ALTER PUBLICATION pub_customer ADD TABLE finance; ALTER PUBLICATION
Saat tabel baru ditambahkan ke cluster penayang, Anda akan menerapkan DDL secara manual (pembuatan tabel) di pelanggan, lalu memverifikasi replikasi dengan menjalankan perintah berikut di cluster pelanggan.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION; ALTER SUBSCRIPTION customer=# select * from finance; row --------------- critical data (1 row)