
서비스를 출시하기 전, 안정적인 운영을 위해 데이터 백업은 필수적이었다.
운영 환경에서 데이터베이스 장애가 발생하면 어떻게 복구할 것인가?
데이터 손실은 사용자 신뢰와 비즈니스에 심각한 영향을 미칠 수 있다.
AWS RDS를 사용하는 상황에서, 데이터 크기가 2MB 미만으로 작아 안정적이라 느낄 수 있었지만, 복구 전략이 없으면 치명적인 상황을 초래할 가능성이 있었다.
네트워크 문제로 RDS 접근이 불가능해지거나, 서버 부하로 데이터 무결성이 깨질 가능성을 고려해 데이터 손실 방지를 위한 백업 체계 구축이 필요했다.
결국, 간단하면서도 효과적인 복구 방법을 고민한 끝에 스케줄링 기반 덤프 파일 생성 방식을 선택하게 되었다.
서비스 특성을 고려했을 때, 1시간 주기로 백업을 설정한 이유는 다음과 같다:
AWS RDS 스냅샷과 DB 덤프는 백업을 수행하는 두 가지 주요 방식이다. 각각의 원리와 구조를 이해하면 최적의 방법을 선택할 수 있다.
RDS 스냅샷은 Amazon RDS에서 제공하는 관리형 백업 기능이다. 이는 데이터베이스의 상태를 특정 시점에 저장하는 방식으로, AWS의 내부 스토리지 시스템에 저장된다.
DB 덤프는 데이터베이스의 데이터를 SQL 파일 형태로 내보내는 방식이다. 데이터베이스의 구조와 데이터를 SQL 명령문으로 변환해 저장하며, pg_dump와 같은 도구를 사용한다.
pg_dump는 데이터베이스와 연결해 데이터를 읽어들인다.pg_dump를 활용한 스케줄링 기반 덤프 생성pg_dump를 통해 데이터베이스 덤프 파일을 생성하고 로컬에 저장할 수 있어 구현이 간단하다.pg_dump와 Lambda의 조합으로 서버리스 환경에서 덤프 생성과 S3 업로드를 자동화할 수 있다.pg_dump를 실행하기 위한 네트워크 구성과 IAM 설정이 필요하다.
선택 이유 및 향후 계획
현재 데이터 크기(2MB 미만)와 빠른 구현이 요구되는 상황에서는 로컬 스케줄링 기반
pg_dump방식이 단순하면서도 효과적이다.이 방식은 초기 설정이 간단하고, 데이터 크기가 작을 경우 복구 및 분석이 빠르게 가능하다는 점에서 적합하다.
장기적으로 데이터 크기 증가 및 안정적인 장기 보관 요구가 생긴다면 Lambda + EventBridge + dump 방식으로 전환해 S3에 데이터를 저장하고, 서버리스 환경을 활용한 백업 자동화를 도입할 계획이다
또한, 복구 속도가 덜 중요하고 AWS RDS 인프라를 활용한 안정성을 중시하는 경우, AWS RDS 스냅샷 또는 Lambda + EventBridge 스냅샷 방식도 검토할 것이다
pg_dump를 활용한 덤프 생성은 데이터 크기가 작고 빠른 복구가 필요한 상황에서 적합하다. 덤프 파일은 데이터베이스 테이블의 구조와 데이터를 SQL 명령문으로 변환해 저장하며, 주요 과정은 다음과 같다:
pg_dump는 PostgreSQL 클라이언트를 통해 데이터베이스와 연결한다.F c) 등으로 지정 가능하다.psql 또는 pg_restore 명령어를 사용해 복구할 수 있다.import subprocess
import datetime
import schedule
import time
# 덤프 파일 생성 함수
def create_dump():
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
dump_file = f"demo_backup_{timestamp}.dump"
command = [
"pg_dump",
"-h", "demo-instance.abcdefg12345.ap-northeast-2.rds.amazonaws.com",
"-p", "5432",
"-U", "test_user",
"-d", "test_db",
"-F", "c",
"-f", dump_file
]
try:
subprocess.run(command, check=True)
print(f"[{datetime.datetime.now()}] Dump created: {dump_file}")
except subprocess.CalledProcessError as e:
print(f"[{datetime.datetime.now()}] Error creating dump: {e}")
# 1시간마다 백업 실행
schedule.every(1).hours.do(create_dump)
print("Starting scheduled dump task...")
while True:
schedule.run_pending()
time.sleep(1)
Retention Policy
오래된 백업 파일을 주기적으로 삭제해 저장 공간을 관리한다.
import os
import glob
import time
def cleanup_old_dumps(directory, retention_days=7):
now = time.time()
for file in glob.glob(f"{directory}/*.dump"):
if os.stat(file).st_mtime < now - retention_days * 86400:
os.remove(file)
print(f"Deleted old dump file: {file}")
복구 테스트
덤프 파일의 복원 가능성을 검증하기 위해 주기적으로 테스트를 수행한다.
pg_restore -h localhost -U test_user -d test_db demo_backup_2024-11-22_10-58-27.dump
스케줄 최적화
서비스 부하를 최소화하기 위해 백업 작업을 비활성 시간대(예: 새벽)에 실행한다.
백엔드 개발자로서 서비스 안정성과 데이터 보호는 필수적인 책임이다.
이번 스케줄링 기반 백업 자동화 작업을 통해 데이터베이스 백업 시스템을 간단하고 효과적으로 구축했다.
다음 단계로는 로깅 및 모니터링 알림 시스템을 추가하여 서비스 운영 시작 전 대비를 더욱 철저히 할 계획이다.
Ref