Mengonfigurasi cluster pelanggan untuk replikasi logis

Pilih versi dokumentasi:

Dokumen ini memberikan contoh yang menunjukkan cara membuat dan mengonfigurasi subscriber cluster secara manual. Cluster pelanggan adalah cluster database yang menerima data yang direplikasi dari cluster penerbit.

Cuplikan kode di halaman ini adalah contoh yang dapat Anda gunakan sebagai model, dengan mengganti nilai dengan nilai untuk resource AlloyDB Omni Anda.

Sebelum memulai

Membuat dan mengonfigurasi cluster pelanggan

  1. Buat cluster pelanggan.

    $ cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-pw-DB_CLUSTER_NAME
    type: Opaque
    data:
      DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword
    ---
    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: subscriber
    spec:
      databaseVersion: "16.8.0"
      primarySpec:
        adminUser:
          passwordRef:
            name: db-pw-DB_CLUSTER_NAME
        resources:
          memory: MEMORY_SIZE
          cpu: CPU_COUNT
          disks:
          - name: DataDisk
            size: DISK_SIZE
    EOF
    

    Ganti kode berikut:

    • DB_CLUSTER_NAME: nama cluster database ini—misalnya, subscriber-cluster.
    • ENCODED_PASSWORD: sandi login database untuk peran pengguna postgres default, yang dienkode sebagai string base64—misalnya, Q2hhbmdlTWUxMjM= untuk ChangeMe123.

    • CPU_COUNT: jumlah CPU yang tersedia untuk setiap instance database dalam cluster database ini.

    • MEMORY_SIZE: jumlah memori per instance database dari cluster database ini. Sebaiknya tetapkan setelan ini ke 8 gigabyte per CPU. Misalnya, jika Anda menetapkan cpu ke 2 sebelumnya dalam manifes ini, sebaiknya tetapkan memory ke 16Gi.

    • DISK_SIZE: ukuran disk per instance database—misalnya, 10Gi.

  2. Temukan pod yang Anda butuhkan.

    $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, 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 SUBSCRIBER_POD_NAME  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-3513-subscriber-0:/$
    

    Ganti SUBSCRIBER_POD_NAME dengan nama pod subscriber.

  4. Temukan alamat IP load balancer di DBcluster 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 PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
    

    Ganti PUBLISHER_IP_ADDRESS dengan alamat IP load balancer di DBcluster publisher.

  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. Pastikan publikasi sudah dibuat di DBCluster penayang.

    postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
    

    Ganti kode berikut:

    • REPLICATION_USER: nama pengguna yang terhubung ke slot replikasi.
    • DATABASE_NAME: ditetapkan ke nama database yang perubahannya ingin Anda streaming dari slot replikasi.
    • PUBLISHER_CLUSTER_PASSWORD: sandi login database untuk pengguna postgres dari DBCluster penayang.
    • PUBLICATION_NAME: nama publikasi yang menjadi langganan pelanggan.
    • REPLICATION_SLOT_NAME: nama slot replikasi yang dibuat di DBCluster publisher.
  9. Opsional: Verifikasi replikasi di cluster pelanggan.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME
    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 DATABASE_NAME
    customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
    

    Ganti TABLE_NAME dengan nama tabel di DBCluster penerbit yang menjadi langganan pelanggan.

  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 DATABASE_NAME
    customer=# select * from TABLE_NAME;
    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