๋…ผ๋ฆฌ ๋ณต์ œ๋ฅผ ์œ„ํ•œ ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

๋ฌธ์„œ ๋ฒ„์ „์„ ์„ ํƒํ•˜์„ธ์š”.

์ด ๋ฌธ์„œ์—์„œ๋Š” ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ณต์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์€ ๋ชจ๋ธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ์ด๋ฉฐ, ๊ฐ’์„ AlloyDB Omni ๋ฆฌ์†Œ์Šค์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ตฌ์„ฑ

  1. ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    $ 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
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • DB_CLUSTER_NAME: ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ: subscriber-cluster).
    • ENCODED_PASSWORD: ๊ธฐ๋ณธ postgres ์‚ฌ์šฉ์ž ์—ญํ• ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ, base64 ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ChangeMe123์˜ ๊ฒฝ์šฐ Q2hhbmdlTWUxMjM=).

    • CPU_COUNT: ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CPU ์ˆ˜์ž…๋‹ˆ๋‹ค.

    • MEMORY_SIZE: ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋‹น ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค. CPU๋‹น 8GB๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ด์ „์— cpu๋ฅผ 2๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ memory๋ฅผ 16Gi๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    • DISK_SIZE: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋‹น ๋””์Šคํฌ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค(์˜ˆ: 10Gi).

  2. ํ•„์š”ํ•œ pod์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

    $ 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. ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๋“œ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

    $ 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:/$
    

    SUBSCRIBER_POD_NAME์„ ๊ตฌ๋…์ž ํฌ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  4. ๊ฒŒ์‹œ์ž DBcluster์—์„œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค(์˜ˆ: 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. ๊ฒŒ์‹œ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฒŒ์‹œ๋œ ๋ฐ์ดํ„ฐ์˜ ์ดˆ๊ธฐ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๊ฒŒ์‹œ์ž์—์„œ ์Šคํ‚ค๋งˆ ๋ฐฑ์—…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ ๋ณต์ œ๋Š” DDL ๋ณต์ œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต์ œํ•˜๋ ค๋Š” ์Šคํ‚ค๋งˆ ๋˜๋Š” ํ…Œ์ด๋ธ”์€ ๋…ผ๋ฆฌ์  ๋ณต์ œ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋Œ€์ƒ (๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ)์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
    

    PUBLISHER_IP_ADDRESS๋ฅผ ๊ฒŒ์‹œ์ž DBcluster์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ IP ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  6. ๊ตฌ๋…์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐฑ์—…์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. ์„ ํƒ์‚ฌํ•ญ: ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ๋…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ฐ€ ๊ฒŒ์‹œ์ž DBCluster์— ์ด๋ฏธ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    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');
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • REPLICATION_USER: ๋ณต์ œ ์Šฌ๋กฏ์— ์—ฐ๊ฒฐํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • DATABASE_NAME: ๋ณต์ œ ์Šฌ๋กฏ์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • PUBLISHER_CLUSTER_PASSWORD: ๊ฒŒ์‹œ์ž DBCluster์˜ postgres ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
    • PUBLICATION_NAME: ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•˜๋Š” ๊ฒŒ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • REPLICATION_SLOT_NAME: ๊ฒŒ์‹œ์ž DBCluster์— ์ƒ์„ฑ๋œ ๋ณต์ œ ์Šฌ๋กฏ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  9. ์„ ํƒ์‚ฌํ•ญ: ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ณต์ œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    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. ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ‘œ์— ํ–‰์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    # 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);
    

    TABLE_NAME์„ ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•œ ๊ฒŒ์‹œ์ž DBCluster์˜ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  11. ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋œ ํ–‰์ด ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ…Œ์ด๋ธ”์— ๋ณต์ œ๋˜์—ˆ๋Š”์ง€ ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    # 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)
    

์ถ”๊ฐ€ ํ…Œ์ด๋ธ” ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค๊ธฐ

๋…ผ๋ฆฌ์  ๋ณต์ œ๋Š” pglogical์˜ replicate_ddl_command์™€ ๋‹ฌ๋ฆฌ DDL ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ pgl_ddl_deploy์—์„œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ฒŒ์‹œ์ž์—์„œ DDL ๋ช…๋ น์–ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์˜ customer ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— finance๋ผ๋Š” ์ƒˆ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    # 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. ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒˆ ํ…Œ์ด๋ธ”์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ตฌ๋…์ž์—์„œ DDL(ํ…Œ์ด๋ธ” ์ƒ์„ฑ)์„ ์ˆ˜๋™์œผ๋กœ ์ ์šฉํ•œ ๋‹ค์Œ ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ณต์ œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    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)
    

๋‹ค์Œ ๋‹จ๊ณ„