์ด ํ์ด์ง์ ์ฝ๋ ์ค๋ํซ์ ๋ชจ๋ธ๋ก ์ฌ์ฉํ ์ ์๋ ์์์ด๋ฉฐ, ๊ฐ์ AlloyDB Omni ๋ฆฌ์์ค์ ๊ฐ์ผ๋ก ๋์ฒดํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
- Kubernetes์ Omni Operator ์ค์น
- ๋ณต์ ์ฌ๋กฏ, ๊ฒ์์ ํด๋ฌ์คํฐ, ๊ฒ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ณต์ ์ฌ๋กฏ ๋ฐ ๊ฒ์ ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๊ตฌ๋ ์ ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ ๋ฐ ๊ตฌ์ฑ
๊ตฌ๋ ์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ญ๋๋ค.
$ 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
).
ํ์ํ 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"
๊ตฌ๋ ์ ํด๋ฌ์คํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฌ๋์ ๋ก๊ทธ์ธํฉ๋๋ค.
$ 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
์ ๊ตฌ๋ ์ ํฌ๋์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.๊ฒ์์ 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
๊ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์๋ ๋ฐ์ดํฐ์ ์ด๊ธฐ ๋ณต์ฌ๋ณธ์ผ๋ก ๊ฒ์์์์ ์คํค๋ง ๋ฐฑ์ ์ ๊ฐ์ ธ์ต๋๋ค. ๋ ผ๋ฆฌ ๋ณต์ ๋ 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 ์ฃผ์๋ก ๋ฐ๊ฟ๋๋ค.๊ตฌ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐฑ์ ์ ์ ์ฉํฉ๋๋ค.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
์ ํ์ฌํญ: ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ๋ ์ ๋ง๋ญ๋๋ค. ๊ฒ์๊ฐ ๊ฒ์์ 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์ ์์ฑ๋ ๋ณต์ ์ฌ๋กฏ์ ์ด๋ฆ์ ๋๋ค.
์ ํ์ฌํญ: ๊ฒ์์ ํด๋ฌ์คํฐ์์ ๋ณต์ ๋ฅผ ํ์ธํฉ๋๋ค.
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)
๊ฒ์์ ํด๋ฌ์คํฐ์์ ํ์ ํ์ ์ถ๊ฐํฉ๋๋ค.
# 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์ ํ ์ด๋ธ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๊ฒ์์ ํด๋ฌ์คํฐ์์ ํ ์ด๋ธ์ ์ถ๊ฐ๋ ํ์ด ๊ตฌ๋ ์ ํด๋ฌ์คํฐ์ ํ ์ด๋ธ์ ๋ณต์ ๋์๋์ง ๊ตฌ๋ ์ ํด๋ฌ์คํฐ์์ ํ์ธํฉ๋๋ค.
# 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 ๋ช
๋ น์ด๋ฅผ ์๋์ผ๋ก ์คํํ ์๋ ์์ต๋๋ค.
์ด๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๊ฒ์์ ํด๋ฌ์คํฐ์
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
๊ฒ์์ ํด๋ฌ์คํฐ์ ์ ํ ์ด๋ธ์ด ์ถ๊ฐ๋๋ฉด ๊ตฌ๋ ์์์ 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)