LiteFS 클러스터 백업하기
LiteFS가 노드 간에 데이터를 복제하고 페일오버를 지원하긴 하지만, 전체 클러스터를 잃었을 때를 대비한 재해 복구 시스템은 아직 없어요. 그래서 버그나 디스크 손상으로 데이터가 유실될 위험을 줄이는 백업 전략을 알려드릴게요. 주기적 export 백업부터 Litestream을 이용한 지속적(point-in-time) 백업까지 함께 살펴보아요.
출처: 문서
본문
LiteFS는 노드 간에 데이터를 복제하고 페일오버를 지원하지만, 현재 전체 클러스터를 잃는 상황에 대비한 재해 복구 시스템은 갖추고 있지 않습니다. 다음은 버그나 디스크 손상이 발생했을 때 데이터 손실 위험을 줄이는 데 사용할 수 있는 몇 가지 전략입니다.
export를 통한 주기적 백업
가장 간단한 방법은 litefs export 명령으로 데이터베이스를 내보낸 다음 그 파일을 S3 같은 장기 스토리지에 업로드하는 것입니다. export 명령은 라이브 데이터베이스에서 안전하게 사용할 수 있으며 -url 플래그를 지정하면 원격에서도 실행할 수 있습니다.
데이터베이스를 다운로드한 후에는 압축해서 S3에 업로드할 수 있습니다.
# Download current snapshot the "my.db" database to a local file.
litefs export -name my.db /path/to/backup
# Compress the file.
gzip /path/to/backup
# Upload the file to S3.
aws s3 cp /path/to/backup.gz s3://mybucket/backup.gz
비용 요건에 따라 시간, 일, 월 단위로 롤링 백업을 수행하는 것도 권장합니다.
# 1-day, rolling hourly backup
aws s3 cp /path/to/backup.gz s3://mybucket/backup-`date +%H`.gz
# 1-month, rolling daily backup
aws s3 cp /path/to/backup.gz s3://mybucket/backup-`date +%d`.gz
# 1-month, rolling hourly backup
aws s3 cp /path/to/backup.gz s3://mybucket/backup-`date +%d%H`.gz
이 백업은 어떤 노드에서든 실행할 수 있습니다. 복제본도 primary에 비해 지연이 거의 없어야 하기 때문입니다. 여러 노드(예: 모든 후보 노드)에서 실행한다면 서로 다른 스토리지 위치에 백업하도록 해 서로 덮어쓰지 않게 하세요.
Litestream을 통한 지속적 백업
Litestream은 S3 호환 객체 스토리지에 증분 백업을 지속적으로 스트리밍하는 도구입니다. LiteFS 위에 사용하면 어떤 이유로든 클러스터가 실패했을 때 point-in-time 복구를 제공할 수 있습니다.
이 방식은 클러스터에서 정적 임대(static lease)를 실행 중일 때만 동작합니다.버킷 초기화하기
먼저 S3 호환 스토리지에 버킷을 만들어야 합니다. 이 예시에서는 Fly.io와 잘 통합되는 Tigris를 사용하겠습니다.
fly storage create
이 명령은 여러 구성 변수를 반환합니다. AWS 액세스 키 ID와 시크릿 액세스 키를 애플리케이션의 시크릿으로 설정하세요:
fly secrets set AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
구성 파일 설정하기
버킷이 생성되면 Litestream 구성 파일을 만들어야 합니다. 이 예시에서는 my.db와 mybucket을 각자의 데이터베이스 파일과 버킷 이름으로 바꾸세요:
dbs:
- path: /litefs/my.db
meta-path: /var/lib/litefs/my.db-litestream
replicas:
- type: s3
bucket: "mybucket"
path: "my.db"
endpoint: "fly.storage.tigris.dev"
force-path-style: true
이 파일을 /etc/litestream.yml에 저장하면 Litestream이 사용하는 모든 명령에 자동으로 적용됩니다.
meta-path는 영구 볼륨의 경로여야 합니다. 이 예시에서는 /var/lib/litefs가 볼륨에서 마운트되었다고 가정합니다.
Litestream 실행하기
Litestream은 LiteFS가 초기화된 후에 실행되어야 하므로 LiteFS exec에 지정할 수 있습니다. Litestream은 자체 exec를 실행할 수 있으므로 애플리케이션을 거기에 지정하세요.
# litefs.yml
exec: "litestream replicate -exec myapp"
Litestream은 primary 노드에서만 실행해야 합니다. 데이터베이스에 대한 쓰기 액세스가 필요하므로 읽기 전용 복제본에서는 실행되지 않습니다.
설정 확인하기
애플리케이션이 실행되면 Litestream의 restore 명령을 실행해 데이터베이스의 현재 버전을 가져올 수 있습니다:
litestream restore -o ~/myrestored.db /litefs/my.db
데이터베이스가 손실된 경우 복구해야 한다면 SQLite 데이터베이스를 파일로 복원한 다음 litefs import를 사용해 클러스터로 가져와야 합니다. Litestream은 LiteFS 마운트에 직접 복원할 수 없습니다.