๋ณต์ œ ์Šฌ๋กฏ ๋ฐ ๊ฒŒ์‹œ ๋งŒ๋“ค๊ธฐ

๋ฌธ์„œ ๋ฒ„์ „์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” AlloyDB Omni์—์„œ ๋…ผ๋ฆฌ์  ๋ณต์ œ ์Šฌ๋กฏ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. PostgreSQL์—์„œ ๋…ผ๋ฆฌ ๋ณต์ œ๋Š” ๊ฒŒ์‹œ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๊ธฐํƒ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ตฌ๋…์ž๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. AlloyDB Omni Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ผ๋ฆฌ์  ๋ณต์ œ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ๊ฐœ๋ณ„ ํ–‰ ์—…๋ฐ์ดํŠธ, ์‚ฝ์ž… ๋˜๋Š” ์‚ญ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…์ž๋Š” ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ๋ณด์žฅํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ณต์ œ ์Šฌ๋กฏ์„ ํ†ตํ•ด ๊ฒŒ์‹œ์ž์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ ์—ฐ๊ฒฐ์€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ค‘๋‹จ๋œ ์ง€์ ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค.

PostgreSQL์˜ ๋…ผ๋ฆฌ ๋ณต์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋…ผ๋ฆฌ ๋ณต์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

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

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

๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ

๋ณต์ œ ์Šฌ๋กฏ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ๋…ผ๋ฆฌ์  ๋ณต์ œ๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. DBCluster ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ wal_level ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ logical๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ ๋ณต์ œ๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒŒ์‹œ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•˜์„ธ์š”.

  apiVersion: v1
  kind: Secret
  metadata:
    name: db-pw-DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  type: Opaque
  data:
    DB_CLUSTER_NAME: "ENCODED_PASSWORD"
  ---
  apiVersion: alloydbomni.dbadmin.goog/v1
  kind: DBCluster
  metadata:
    name: DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  spec:
    databaseVersion: "ALLOYDB_OMNI_VERSION"
    spec:
    availability:
      numberOfStandbys: 1
    primarySpec:
      parameters:
        wal_level: "logical"
      adminUser:
        passwordRef:
          name: db-pw-DB_CLUSTER_NAME
      resources:
        cpu: CPU_COUNT
        memory: MEMORY_SIZE
        disks:
        - name: DataDisk
          size: DISK_SIZE

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

  • DB_CLUSTER_NAME: ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ: publisher).

  • DB_CLUSTER_NAMESPACE(์„ ํƒ์‚ฌํ•ญ): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค(์˜ˆ: publisher-namespace).

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

  • ALLOYDB_OMNI_VERSION: AlloyDB Omni ๋ฒ„์ „, 15.7.0 ์ด์ƒ

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

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

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

๋ณต์ œ ์Šฌ๋กฏ ๋งŒ๋“ค๊ธฐ

๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“  ํ›„ ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Replication ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ผ๋ฆฌ ๋ณต์ œ ์Šฌ๋กฏ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ Replication ๋ฆฌ์†Œ์Šค๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋…ผ๋ฆฌ์  ๋ณต์ œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ณต์ œ ์Šฌ๋กฏ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•˜์„ธ์š”.

$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
spec:
  dbcluster:
    name: DB_CLUSTER_NAME
  upstream:
    logicalReplication:
      pluginName: DECODER_PLUGIN
      databaseName: DATABASE_NAME
    applicationName: APPLICATION_NAME
    replicationSlotName: REPLICATION_SLOT_NAME
    synchronous: "REPLICATION_MODE"
    username: APPLICATION_USER
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF

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

  • REPLICATION_NAME: ์ด Replication ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ: replication-1).
  • NAMESPACE: ์ด Replication ๋ฆฌ์†Œ์Šค์˜ Kubernetes ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • DB_CLUSTER_NAME: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.
  • DECODER_PLUGIN: ๋…ผ๋ฆฌ ๋ณต์ œ์— ์‚ฌ์šฉํ•  ๋””์ฝ”๋”ฉ ํ”Œ๋Ÿฌ๊ทธ์ธ(์˜ˆ: pgoutput)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋””์ฝ”๋”ฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถœ๋ ฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • DATABASE_NAME: ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณต์ œ ์Šฌ๋กฏ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์— ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • APPLICATION_NAME (์„ ํƒ์‚ฌํ•ญ): ๋ณต์ œ ์Šฌ๋กฏ์— ์—ฐ๊ฒฐํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ๊ฐ€ ๋™๊ธฐ์‹์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ด ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  • REPLICATION_MODE (์„ ํƒ์‚ฌํ•ญ): ๋น„๋™๊ธฐ ๋ณต์ œ์˜ ๊ฒฝ์šฐ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ ๋ณต์ œ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋˜ ์†๋„๋Š” ํฌ์ƒํ•˜๋ ค๋ฉด ์ด ๊ฐ’์„ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.
  • REPLICATION_SLOT_NAME: ์ƒ์„ฑ๋˜๊ณ  ๊ตฌ๋…์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋ณต์ œ ์Šฌ๋กฏ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ: logicalrepltestslot).
  • REPLICATION_USER (์„ ํƒ์‚ฌํ•ญ): ๋ณต์ œ ์Šฌ๋กฏ์— ์—ฐ๊ฒฐํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ณต์ œ ์‚ฌ์šฉ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณด์•ˆ ๋น„๋ฐ€ ์ด๋ฆ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • USER_PASSWORD_SECRET_NAME (์„ ํƒ์‚ฌํ•ญ): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž์˜ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  • USER_PASSWORD_SECRET_NAMESPACE (์„ ํƒ์‚ฌํ•ญ): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž์˜ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์ด ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ณต์ œ ์Šฌ๋กฏ ์ƒํƒœ ๋ณด๊ธฐ

๋ณต์ œ ์Šฌ๋กฏ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml

status ํ•„๋“œ์™€ ๊ธฐํƒ€ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ์‘๋‹ต์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
...
...
status:
  conditions:
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Ready for replication
    reason: Ready
    status: "True"
    type: Ready
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Replication slot is not being used
    reason: Unhealthy
    status: "False"
    type: Healthy
  observedGeneration: 2
  upstream:
    host: DATABASE_ENDPOINT
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
    port: DATABASE_PORT
    replicationSlotName: REPLICATION_SLOT_NAME
    username: APPLICATION_USER

DATABASE_ENDPOINT์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” IP ์ฃผ์†Œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. READY ์—ด์˜ ์ƒํƒœ TRUE์€ ์Šฌ๋กฏ์ด ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ตฌ๋…์ž DBCluster ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์ œ ์Šฌ๋กฏ์— ์—ฐ๊ฒฐ๋˜๋ฉด HEALTHY ์—ด์˜ ์ƒํƒœ๊ฐ€ TRUE๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

  1. ํ•„์š”ํ•œ ํฌ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

    $ 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"
    
  2. psql์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ๋ณธ ํฌ๋“œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

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

    • IP_ADDRESS: ๊ฒŒ์‹œ์ž ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ๋ณธ ํฌ๋“œ IP ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
    • USERNAME: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ postgres ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.
    • DATABASE_NAME: ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.
  3. ๋ณต์ œ ๋ฆฌ์†Œ์Šค์— ์ง€์ •๋œ DATABASE_NAME๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    CREATE DATABASE DATABASE_NAME;
    
  4. ์„ ํƒ์‚ฌํ•ญ: ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ์ž์—์„œ ๊ตฌ๋…์ž๋กœ์˜ ๋ฐ์ดํ„ฐ ๋ณต์ œ๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ psql -h localhost -U postgres DATABASE_NAME
    customer=# CREATE TABLE TABLE_NAME(
    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 TABLE_NAME (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 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
    (5 rows)
    

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

  5. ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER;
    GRANT USAGE ON SCHEMA public TO REPLICATION_USER;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO REPLICATION_USER;
    
  6. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒŒ์‹œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    CREATE PUBLICATION PUBLICATION_NAME;
    ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
    

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

    • PUBLICATION_NAME: ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๊ฒŒ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๊ฒŒ์‹œ๋ฅผ ๋งŒ๋“  ํ›„ ๋…ผ๋ฆฌ์  ๋ณต์ œ๋ฅผ ์œ„ํ•ด ๊ตฌ๋…์ž ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ณต์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • ๋ณต์ œ ์Šฌ๋กฏ ๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋ณต์ œ ์Šฌ๋กฏ์„ ์‚ญ์ œํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋œ ๊ตฌ์„ฑ์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ๋ณต์ œ ์Šฌ๋กฏ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
    
  • ๊ฒŒ์‹œ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋งŒ ๋…ผ๋ฆฌ์  ๋ณต์ œ ์Šฌ๋กฏ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œ API๋Š” ๋…ผ๋ฆฌ์  ๋ณต์ œ ๊ตฌ๋…์ž DBCluster ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋ณต์ œ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณ ๊ฐ€์šฉ์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์žฅ์•  ์กฐ์น˜ ํ›„ ์Šน๊ฒฉ๋œ ๋Œ€๊ธฐ ์„œ๋ฒ„์—์„œ ๋…ผ๋ฆฌ ๋ณต์ œ ์Šฌ๋กฏ์ด ๋‹ค์‹œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ณต์ œ ์Šฌ๋กฏ์ด ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋ฉด ์Šฌ๋กฏ์˜ ์ŠคํŠธ๋ฆผ ์œ„์น˜๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ŠคํŠธ๋ฆผ์„ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๊ณ  ์žฌ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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