AlloyDB Omni ๋กœ๊ทธ ์ˆœํ™˜ ๊ตฌ์„ฑ

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

์ด ๋ฌธ์„œ์—์„œ๋Š” AlloyDB Omni Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ AlloyDB Omni ์ง„๋‹จ ๋กœ๊ทธ์˜ ์ˆœํ™˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋กœ๊ทธ ํŒŒ์ผ์€ /obs/diagnostic/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • postgresql.audit: ์ด ๋กœ๊ทธ ํŒŒ์ผ์€ ์„ธ์…˜ ๋ฐ ๊ฐ์ฒด ์•ก์„ธ์Šค ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • postgresql.log: ์ด ๋กœ๊ทธ ํŒŒ์ผ์€ PostgreSQL ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋Š” ํ•ญ์ƒ ์ˆ˜์ง‘๋˜๋ฉฐ ์‚ฌ์šฉ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ํŒŒ์ผ์ด ์ˆœํ™˜๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ๋กœ๊ทธ ํŒŒ์ผ์ด /obs/diagnostic/archive/ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด๋ฆ„์˜ ๋กœ๊ทธ ํŒŒ์ผ์ด ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ฎ์–ด์”๋‹ˆ๋‹ค.

  2. ์ˆœํ™˜๋œ ๋กœ๊ทธ ํŒŒ์ผ ์›๋ณธ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์‚ญ์ œ๋˜์–ด ํŒŒ์ผ์ด ๋น„๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  3. ๋กœ๊ทธ ์ •๋ณด๊ฐ€ ์ฆ‰์‹œ ๋นˆ ์ˆœํ™˜ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ํฌ๊ธฐ ๋˜๋Š” ๊ธฐ๊ฐ„ ๊ธฐ์ค€์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋กœ๊ทธ ์ •๋ณด๊ฐ€ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๋ฉฐ, ์ด ์‹œ์ ์—์„œ ๋‹ค์‹œ ์ˆœํ™˜๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€์ง€ ์•Š๋„๋ก ์ˆœํ™˜๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœํ™˜ ์„ค์ •์€ ํฌ๊ธฐ๊ฐ€ 200MB์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ ๋กœ๊ทธ ํŒŒ์ผ์ด ์ˆœํ™˜๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ˆœํ™˜์—๋Š” ๊ธฐ๊ฐ„ ์„ค์ •์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ๊ฐ ํŒŒ์ผ์€ Gzip(.gz) ํŒŒ์ผ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ์••์ถ•๋ฉ๋‹ˆ๋‹ค.

๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์€ 7์ผ ๋™์•ˆ ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. 7์ผ์ด ์ง€๋‚œ ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์€ ์ด์ „ ์ˆœํ™˜ ์ค‘์— ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๊ณ  ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด log_rotation_age๊ฐ€ 7์ผ๋ณด๋‹ค ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ, ํ˜„์žฌ ํŒŒ์ผ์ด ์ˆœํ™˜๋˜๊ธฐ ์ „์— ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์ด 7์ผ ๊ธฐ์ค€์ ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ ์ˆœํ™˜์—์„œ ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ์ƒˆ ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ์ด ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ๊ฐ ๋กœ๊ทธ ํŒŒ์ผ ์ด๋ฆ„์€ postgresql-%Y-%m-%d_%H%M%S.log.gz ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๋กœ๊ทธ ์ˆœํ™˜ ์‹œ์— ๊ฒฐ์ •๋˜๋ฉฐ ํ˜‘์ • ์„ธ๊ณ„์‹œ(UTC)๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2024๋…„ 12์›” 20์ผ 13์‹œ 1๋ถ„ 2์ดˆ(UTC)์— ๋กœ๊ทธ๊ฐ€ ์ˆœํ™˜๋˜๋ฉด ๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ ์ด๋ฆ„์€ postgresql-2024-12-20_130102.log.gz์ž…๋‹ˆ๋‹ค.

๋ณด๊ด€์ฒ˜๋ฆฌ๋œ ํŒŒ์ผ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๋ ค๋ฉด kubectl cp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋กœ๊ทธ ์‚ฌ์šฉ ์„ค์ •

์„ธ์…˜ ๋ฐ ๊ฐ์ฒด ์•ก์„ธ์Šค ๋กœ๊ทธ๊ฐ€ postgresql.audit ํŒŒ์ผ์— ์ˆ˜์ง‘๋˜๋ ค๋ฉด pgaudit ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. pgaudit์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด Secret ์•„๋ž˜์˜ v1_dbcluster_parameters.yaml ํŒŒ์ผ์˜ parameters ์„น์…˜์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

alloydb.enable_pgaudit: "on"

์ด์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Secret
...
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
   name: DB_CLUSTER_NAME
spec:
  databaseVersion: "15.7.0"
  primarySpec:
    ...
    parameters:
      ...
      alloydb.enable_pgaudit: "on"

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง€์›๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ pgaudit ๋ฐ PostgreSQL ๊ฐ์‚ฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐธ์กฐํ•˜์„ธ์š”. PostgreSQL ์„œ๋ฒ„ ๋กœ๊ทธ๋Š” ํ•ญ์ƒ postgresql.log ํŒŒ์ผ์— ์ˆ˜์ง‘๋˜๋ฉฐ pgaudit์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ ์ˆœํ™˜ ๊ตฌ์„ฑ

๋กœ๊ทธ ์ˆœํ™˜ ์‹œ์ ์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋ ค๋ฉด ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ, ๋กœ๊ทธ ์ˆœํ™˜ ๊ฐ„ ๊ธฐ๊ฐ„ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ๊ตฌ์„ฑํ•˜์„ธ์š”. ๋กœ๊ทธ ์ˆœํ™˜ ๊ฐ„์˜ ๊ธฐ๊ฐ„์„ ๋กœ๊ทธ์˜ ์ˆ˜๋ช…์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์„ค์ •์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋กœ๊ทธ๊ฐ€ ๊ธฐ์ค€์  ์ค‘ ํ•˜๋‚˜์— ๋„๋‹ฌํ•  ๋•Œ๋งˆ๋‹ค ์ˆœํ™˜๋ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ ์ˆœํ™˜์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด DBCluster ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ parameters ์„น์…˜์—์„œ ๋‹ค์Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • log_rotation_size: 'SIZE_IN_KB'
  • log_rotation_age: 'AGE_IN_MINUTES'

๋กœ๊ทธ ์ˆœํ™˜ ์„ค์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด 0("0")์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 200MB์— ๋„๋‹ฌํ•  ๋•Œ ๋กœ๊ทธ๋ฅผ ์ˆœํ™˜ํ•˜๋Š” ๊ธฐ๋ณธ ์„ค์ •์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋‘ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋‘ ์„ค์ •ํ•˜์ง€ ๋งˆ์„ธ์š”.

๋กœ๊ทธ ์ˆœํ™˜ ์ตœ๋Œ€ ๋กœ๊ทธ ํฌ๊ธฐ ๋ฐ ๊ธฐ๊ฐ„ ์˜ˆ์‹œ

๋‹ค์Œ ์ƒ˜ํ”Œ์€ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 400MB์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ ์ˆœํ™˜ ๊ฐ„ ์‹œ๊ฐ„์ด 1์ผ์— ๋„๋‹ฌํ•  ๋•Œ ๋กœ๊ทธ๋ฅผ ์ˆœํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: DB_CLUSTER_NAME
spec:
...
  primarySpec:
  ...
    parameters:
      log_rotation_size: "400000" # 400 MB
      log_rotation_age: "1440" # 24 hours * 60 minutes = 1 day

๋กœ๊ทธ ์ˆœํ™˜ ์ตœ๋Œ€ ๋กœ๊ทธ ํฌ๊ธฐ ์˜ˆ์‹œ

๋‹ค์Œ ์ƒ˜ํ”Œ์€ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 400MB์— ๋„๋‹ฌํ•˜๋ฉด ๋กœ๊ทธ๊ฐ€ ์ˆœํ™˜๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: DB_CLUSTER_NAME
spec:
...
  primarySpec:
  ...
    parameters:
      log_rotation_size: "400000" # 400 MB
      log_rotation_age: "0" # Set to 0 to disable

๋กœ๊ทธ ์ˆœํ™˜ ๊ธฐ๊ฐ„ ์˜ˆ์‹œ

๋‹ค์Œ ์ƒ˜ํ”Œ์€ 24์‹œ๊ฐ„๋งˆ๋‹ค ๋กœ๊ทธ๊ฐ€ ์ˆœํ™˜๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: DB_CLUSTER_NAME
spec:
...
  primarySpec:
  ...
    parameters:
      log_rotation_size: "0" # Set to 0 to disable
      log_rotation_age: "1440" # 24 hours * 60 minutes = 1 day

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