본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

백업 전략 — Hot, Cold, Streaming

~14 min · backup, production, litestream

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

3 가지 접근, 3 가지 트레이드오프

production SQLite는 진짜 데이터를 받기 전에 백업 전략부터 세워야 해. 쓸 만한 방법이 셋이야.

  • Cold 백업 — writer를 멈추고 파일을 복사해. 가장 단순한 대신 서비스를 잠깐 멈춰야 해.
  • Online 백업sqlite3 source.db ".backup target.db"를 쓰거나 C-level sqlite3_backup API를 불러. writer가 도는 중에도 되고, 앞뒤가 맞는 snapshot을 만들어줘.
  • Streaming 백업 — Litestream이나 LiteFS, Turso가 WAL을 S3나 다른 노드, 매니지드 서비스로 계속 흘려보내. 최근 어느 시점으로든 되돌릴 수 있어.

개인이 만든 제품이라면 — 피파나 사이드 프로젝트 같은 — NAS나 S3로 한 시간에 한 번 online 백업을 뜨는 것으로 재해의 99%를 감당해. 사용자가 여럿인 제품이라면 Litestream이 손실 폭을 시간 단위에서 분 단위로 줄여주면서 원하는 시점으로 복구하게 해줘.

Warning: 복구해본 적 없는 백업은 백업이 아니야. 어떤 백업 설정이든 믿기 전에 다른 머신에 통째로 복구해보는 훈련을 해봐. 진짜 사고가 터진 그 순간에야 백업이 깨져 있거나 반쪽이라는 걸 알게 되는 제품이 셀 수 없이 많아.

Code

Online 백업 — daily cron·bash
#!/bin/bash
# Daily; writer 활성 상태에서 동작
set -euo pipefail

DB=/var/lib/myapp/myapp.db
DEST=/backups/myapp/$(date +%Y%m%d).db

sqlite3 "$DB" ".backup $DEST"
sqlite3 "$DEST" 'PRAGMA integrity_check'  # 복사 검증
gzip "$DEST"
Litestream — S3로 continuous replication·yaml
# /etc/litestream.yml — 사이드카 (launchd / systemd)
dbs:
  - path: /var/lib/myapp/myapp.db
    replicas:
      - type: s3
        bucket: myapp-backups
        path:   prod/myapp
        region: us-east-1
        retention: 168h        # 7 일 point-in-time recovery

External links

Exercise

피파든 네가 가진 SQLite DB든 하나 골라 매일 도는 online 백업을 걸어봐. mac이면 launchd, linux면 systemd-timer로 예약하고. 그리고 진짜로 복구해봐. 최신 백업을 다른 머신에 옮겨 열고 PRAGMA integrity_check를 돌리고 row 수를 맞춰봐. 예상 못 했던 게 나오면 적어둬.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.