Mengonfigurasi cluster pelanggan untuk replikasi logis

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

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

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: "15.7.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 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 perlukan.

    $ 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 pelanggan.

  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. 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 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 penayang.

  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 replika.
    • 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 dilanggani pelanggan.
    • REPLICATION_SLOT_NAME: nama slot replika yang dibuat di DBCluster penayang.
  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 penayang yang dilanggani oleh pelanggan.

  11. 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 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 dalam database customer 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
    
  2. 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)
    

Langkah berikutnya