๐ ๊ฐ์
์ด ๊ธ์์๋ PostgreSQL pgvector์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ฐฑ์ ํ๊ณ ๋ณต์ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
ํนํ, ๋ฐฑ์ ์๋ํ, ๋ฐ์ดํฐ ์ ์ค ๋ฐฉ์ง, AWS S3 ๋๋ Kubernetes CronJob์ ํ์ฉํ ์๋ ๋ฐฑ์ ์ ๋ต๊น์ง ์ค๋ฌด์ ๋ง๊ฒ ์ ๋ฆฌํฉ๋๋ค.
โ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ๋ฐฑ์ ์ ๋ต (pg_dump, WAL, PITR)
โ AWS S3 ๋๋ Kubernetes CronJob์ ํ์ฉํ ์๋ ๋ฐฑ์
โ ๋ฒกํฐ ๋ฐ์ดํฐ์ ์์ค ์์ด ๋น ๋ฅธ ๋ณต์ ๋ฐฉ๋ฒ
๐ 1. PostgreSQL ๋ฒกํฐ ๋ฐ์ดํฐ ๋ฐฑ์ ์ ๋ต
๋ฒกํฐ ๋ฐ์ดํฐ๋ ๋๋์ผ๋ก ์ ์ฅ๋๋ฏ๋ก ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋ฐฑ์ ์ ๋ต์ด ํ์ํฉ๋๋ค.
โ PostgreSQL์์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํ๋ ์ฃผ์ ๋ฐฉ๋ฒ
๋ฐฑ์ ๋ฐฉ๋ฒ์ค๋ช ์ถ์ฒ ์ฌ์ฉ ์ฌ๋ก
pg_dump | ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ผ๋ก ๋ด๋ณด๋ด๋ ๋ฐฉ์ | ์๊ท๋ชจ ๋ฐ์ดํฐ, ์ฃผ๊ธฐ์ ๋ฐฑ์ |
WAL(Write-Ahead Logging) | ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅ | ์ค์๊ฐ ๋ฐ์ดํฐ ๋ณดํธ |
PITR(Point-in-Time Recovery) | ํน์ ์์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณต์ | ์ฅ์ ๋ฐ์ ์ ๋ฐ์ดํฐ ๋ณต๊ตฌ |
S3 ๋๋ GCS๋ก ์๋ ๋ฐฑ์ | ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ ์๊ฒฉ ๋ฐฑ์ | ์ฅ๊ธฐ ๋ณด๊ด ๋ฐ ์ฅ์ ๋๋น |
๐ 2. pg_dump๋ฅผ ์ด์ฉํ ๋ฒกํฐ ๋ฐ์ดํฐ ๋ฐฑ์
1๏ธโฃ pg_dump๋ก ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์
pg_dump๋ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ผ๋ก ๋ด๋ณด๋ด๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฑ์ ๋ฐฉ๋ฒ์ ๋๋ค.
๐ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์ (.sql ํ์ผ)
pg_dump -U postgres -h localhost -d ragdb > ragdb_backup.sql
๐ ์์ถ๋ ๋ฐฑ์ (.tar ํ์ผ)
pg_dump -U postgres -h localhost -d ragdb -F t > ragdb_backup.tar
โ ์๋ ๋ฐฑ์ ์ ์ํด ํฌ๋ก ์ก(CronJob) ์ถ๊ฐ
echo "0 2 * * * pg_dump -U postgres -h localhost -d ragdb > /backup/ragdb_$(date +\%Y\%m\%d).sql" | crontab -
์ ์ค์ ์ ๋งค์ผ ์๋ฒฝ 2์์ ๋ฐฑ์ ์ ์ํํฉ๋๋ค.
2๏ธโฃ ํน์ ํ ์ด๋ธ(๋ฒกํฐ ๋ฐ์ดํฐ)๋ง ๋ฐฑ์
๋ฒกํฐ ๋ฐ์ดํฐ(embeddings ํ ์ด๋ธ)๋ง ๋ฐฑ์ ํ๋ ๊ฒฝ์ฐ:
pg_dump -U postgres -h localhost -d ragdb -t embeddings > embeddings_backup.sql
๐ ๋ฒกํฐ ๋ฐ์ดํฐ๋ง ๋ณต์
psql -U postgres -h localhost -d ragdb < embeddings_backup.sql
โ ์ด ๋ฐฉ์์ ๋ฒกํฐ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ํจ์จ์ ์ ๋๋ค.
๐ 3. WAL(Write-Ahead Logging) ๋ฐ PITR(Point-in-Time Recovery)
pg_dump๋ ์ ๊ธฐ ๋ฐฑ์ ์๋ ์ ํฉํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฅ์ ๋ฐ์ ์ ์ค์๊ฐ ๋ณต๊ตฌ๋ ์ด๋ ต์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด WAL(Write-Ahead Logging)๊ณผ PITR์ ํ์ฉํฉ๋๋ค.
1๏ธโฃ WAL ํ์ฑํ
๐ PostgreSQL postgresql.conf์์ WAL ์ค์ ๋ณ๊ฒฝ
wal_level: "replica"
archive_mode: "on"
archive_command: "cp %p /var/lib/postgresql/archive/%f"
โ ์ด ์ค์ ์ ์ ์ฉํ๋ฉด PostgreSQL์ด ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ WAL ๋ก๊ทธ๋ก ๊ธฐ๋กํ์ฌ ์ฅ์ ๋ฐ์ ์ ๋ณต๊ตฌ ๊ฐ๋ฅ
2๏ธโฃ PITR(ํฌ์ธํธ ์ธ ํ์ ๋ณต๊ตฌ)
PITR์ ํน์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ํ๋ ๊ธฐ๋ฅ์ผ๋ก, ์ค๋ฌด์์ ์ฅ์ ๋ณต๊ตฌ ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๐ PITR์ ์ํด WAL ๋ฐฑ์
pg_basebackup -D /var/lib/postgresql/basebackup -Ft -z -P
๐ ํน์ ์์ ์ผ๋ก ๋ณต์
pg_restore -U postgres -h localhost -d ragdb -t embeddings --data-only --restore-time="2024-03-01 10:30:00"
โ PITR์ ํ์ฉํ๋ฉด ํน์ ์์ ์ ๋ฐ์ดํฐ๋ก ๋กค๋ฐฑ ๊ฐ๋ฅ
๐ 4. AWS S3 ๋๋ Kubernetes CronJob์ ํ์ฉํ ์๋ ๋ฐฑ์
1๏ธโฃ AWS S3์ ์๋ ๋ฐฑ์
ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง(S3)์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ์๋ ๋ฐฑ์ ํ๋ฉด ๋ฐ์ดํฐ ์ ์ค์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐ S3 CLI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์ ์ ๋ก๋
pg_dump -U postgres -h localhost -d ragdb | gzip > ragdb_backup.sql.gz
aws s3 cp ragdb_backup.sql.gz s3://my-postgres-backups/
โ ์ด์ AWS S3์ ๋ฐ์ดํฐ๊ฐ ์์ ํ๊ฒ ์ ์ฅ๋ฉ๋๋ค.
2๏ธโฃ Kubernetes CronJob์ ํ์ฉํ ์๋ ๋ฐฑ์
Kubernetes ํ๊ฒฝ์์๋ CronJob์ ์ฌ์ฉํ์ฌ ์ฃผ๊ธฐ์ ์ธ ๋ฐฑ์ ์ ์๋ํํ ์ ์์ต๋๋ค.
๐ Kubernetes backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: pgvector-backup
namespace: database
spec:
schedule: "0 3 * * *" # ๋งค์ผ ์๋ฒฝ 3์์ ๋ฐฑ์
์คํ
jobTemplate:
spec:
template:
spec:
containers:
- name: pgvector-backup
image: postgres:14
command:
- "/bin/sh"
- "-c"
- "pg_dump -U postgres -h postgresql.database.svc.cluster.local -d ragdb | gzip > /backup/ragdb_backup.sql.gz"
volumeMounts:
- name: backup-volume
mountPath: /backup
restartPolicy: OnFailure
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
๐ Kubernetes์์ CronJob ์ ์ฉ
kubectl apply -f backup-cronjob.yaml -n database
โ ์ด์ Kubernetes๊ฐ ์๋์ผ๋ก PostgreSQL ๋ฐฑ์ ์ ์คํํฉ๋๋ค.
๐ 5. ์ต์ข ์ ๋ฆฌ
โ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ๋ฐฑ์ ์ ๋ต (pg_dump, WAL, PITR)
โ AWS S3 ๋๋ Kubernetes CronJob์ ํ์ฉํ ์๋ ๋ฐฑ์ ์ค์
โ ๋ฒกํฐ ๋ฐ์ดํฐ์ ์์ค ์์ด ๋น ๋ฅธ ๋ณต์ ๋ฐฉ๋ฒ (pg_restore)