Mengonfigurasi replikasi logis di Kubernetes

Pilih versi dokumentasi:

Di PostgreSQL, replikasi logis adalah metode untuk menyalin perubahan data dari database publisher ke satu atau beberapa subscriber, yang dapat berupa database atau aplikasi lainnya. Anda dapat mengaktifkan dan mengonfigurasi replikasi logis pada 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, dengan mengganti nilai dengan nilai untuk resource AlloyDB Omni Anda.

Buat cluster

  1. Instal Omni Operator di Kubernetes.

  2. 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.5.2"
        resources:
          memory: 10Gi
          cpu: 1
          disks:
          - name: DataDisk
            size: 40Gi
    EOF
    
  3. 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.5.2"
        resources:
          memory: 10Gi
          cpu: 1
          disks:
          - name: DataDisk
            size: 40Gi
    EOF
    

Mengonfigurasi cluster penayang

Konfigurasi cluster penayang dan buat tabel. Secara opsional, Anda dapat memublikasikan data sebagai pengujian untuk memastikan data direplikasi ke pelanggan.

  1. Perbarui parameter wal_level menjadi logical.

    $ kubectl patch dbclusters.al publisher  -p '{"spec":{"primarySpec":{"parameters":{"wal_level":"logical"}}}}' --type=merge
    
  2. Temukan pod yang Anda butuhkan.

    $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=publisher, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
    
  3. 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
    
  4. Buat database dengan nama customer.

    CREATE DATABASE customer;
    
  5. Opsional: Untuk tujuan pengujian, tambahkan tabel ke database dan masukkan beberapa data. Anda dapat menggunakan data ini untuk mengamati replikasi data dari penerbit 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)
    
  6. Buat pengguna logicalreplica untuk replikasi dan berikan izin kepadanya.

    CREATE USER logicalreplica WITH REPLICATION LOGIN PASSWORD '123';
    
  7. 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;
    
  8. Buat publikasi di database customer.

    CREATE PUBLICATION pub_customer;
    ALTER PUBLICATION pub_customer ADD TABLE company;
    

Mengonfigurasi cluster pelanggan

Aktifkan cluster pelanggan untuk menerima update data dari cluster penerbit.

  1. Tetapkan parameter wal_level ke logical di database pelanggan.

    $ kubectl patch dbclusters.al subscriber  -p '{"spec":{"primarySpec":{"parameters":{"wal_level":"logical"}}}}' --type=merge
    
  2. Temukan pod yang Anda butuhkan.

    $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=subscriber, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
    
  3. 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:/$
    
  4. 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
    
  5. Buat cadangan skema dari penayang sebagai salinan awal data yang dipublikasikan di database penayang. Replikasi logis tidak mendukung replikasi DDL. Skema atau tabel yang akan direplikasi harus ada di tujuan (klaster 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
    
  6. Terapkan cadangan di database pelanggan.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. Opsional: Pastikan tidak ada data dalam tabel.

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. 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;
    
  9. 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)
    
  10. 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);
    
  11. Di cluster pelanggan, verifikasi bahwa baris yang ditambahkan ke tabel di cluster penerbit 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.

  1. Untuk mengilustrasikannya, buat tabel baru bernama finance di database customer pada cluster penerbit.

    # 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
    
  2. Saat tabel baru ditambahkan ke cluster penerbit, Anda menerapkan DDL (pembuatan tabel) secara manual di pelanggan, lalu memverifikasi replikasi dengan menjalankan berikut ini 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)
    

Langkah berikutnya