23. 백업·복구와 재해복구(DR): 스냅샷·WAL·PITR·RPO/RTO
난이도 상내 답안
모범답안
난이도: 상
1. RPO / RTO 와 데이터별 목표
- RPO(복구 지점 목표): 장애 시 얼마만큼의 최근 데이터 손실을 감수하는가(시간). RPO=0 은 한 건도 못 잃음(동기 복제 필요), RPO=5분은 최근 5분 유실 허용.
- RTO(복구 시간 목표): 장애 후 얼마 만에 서비스를 복구해야 하는가(시간).
- 데이터별 차등:
- 재화 원장/결제: RPO 매우 낮게(0에 가깝게) — 동기 복제·WAL. 손실=금전 사고.
- 인벤토리/진행도: 낮은 RPO(수십 초~분).
- 임시 매칭/세션 상태: 유실돼도 재생성 가능 → RPO 느슨(재접속으로 복구).
- 로그/텔레메트리: 분석용, RPO 느슨·저비용 스토리지.
- 목표를 높일수록(0에 가깝게) 비용·복잡도가 급증하므로 데이터 가치로 차등한다.
2. 논리 vs 물리, full/incremental/differential
- 논리적 백업(pg_dump/mysqldump): SQL/행 수준 덤프. 이식성·부분 복구·버전 이동에 유리. 대신 크고 느리며 복구 시 재적재·인덱스 재생성 비용.
- 물리적 백업(파일/블록 수준, 스냅샷): 데이터 파일을 그대로 복사. 크고 빠른 복구, 대용량에 적합. 대신 동일 엔진/버전·플랫폼 의존, 일관성 확보(스냅샷/락) 필요.
- full: 매번 전체. 복구 단순·빠름, 저장·시간 비용 큼.
- incremental: 직전 백업 이후 변경분만. 저장·시간 절약, 복구 시 full + 여러 증분을 순서대로 적용해야 해 복구가 느리고 체인 하나만 깨져도 위험.
- differential: 마지막 full 이후 누적 변경. 복구는 full+최신 차등 하나면 되어 증분보다 복구가 단순, 대신 시간이 갈수록 차등 크기 증가.
- 실무: 주기적 full + 잦은 증분/차등 + WAL 아카이브 조합.
3. WAL/바이너리 로그와 PITR
- WAL: DB 는 데이터 페이지를 고치기 전에 변경을 로그에 먼저 기록한다(내구성· 크래시 복구의 근간). MySQL 의 binlog, PostgreSQL 의 WAL 이 그 예.
- PITR(시점 복구): 베이스 백업(특정 시점의 물리 스냅샷) + 그 이후의 WAL 아카이브 를 보관해 두면, 베이스 복원 후 WAL 을 원하는 시점까지만 재생(replay) 해 그 순간의 상태로 되돌릴 수 있다.
- "잘못된 대량 UPDATE 직전으로": 어제 03:14 이전의 베이스 백업을 복원하고, 아카이브된 WAL 을 03:13:59(또는 그 사고 트랜잭션 직전 LSN/GTID)까지 재생하면 사고 직전 상태가 된다. 사고 트랜잭션은 재생에서 제외한다. (운영 실수 복구의 핵심 도구.)
4. 백업의 함정
- 복구 검증 안 함: "백업은 있는데 복구가 안 되는" 사고가 가장 흔하다. 정기적인 복구 훈련(restore drill) 으로 실제로 되살아나는지, RTO 안에 되는지 검증해야 한다. 검증 안 된 백업은 백업이 아니다.
- 일관성: 진행 중 트랜잭션·여러 파일/샤드에 걸친 백업이 시점 정합해야 한다. 물리 백업은 스냅샷/백업 모드로 일관 시점을 잡고, 샤드 다수면 공통 시점(글로벌 스냅샷/좌표)이 필요.
- 3-2-1 규칙: 사본 3개, 매체 2종, 그중 1개는 오프사이트. 같은 시스템에만 두면 동반 소실.
- 암호화·접근통제: 백업에 민감 데이터가 있으니 저장/전송 암호화.
- 랜섬웨어 대비 불변 백업: WORM/오브젝트 락 등 수정·삭제 불가(immutable) 백업으로 공격자가 백업까지 지우지 못하게 한다.
5. 리전 단위 DR
- 복제 모드: 동기(RPO≈0, 지연·비용↑) vs 비동기(RPO>0, 지연·비용↓). 데이터 가치로 선택(재화=동기, 로그=비동기).
- 스탠바이: 콜드(백업만, RTO 큼) / 웜(대기 인스턴스, 중간) / 핫(항상 최신 복제, RTO 작음·비용 큼).
- 페일오버 + split-brain 방지: 승격은 복제 따라잡음(catch-up) 확인 후, 펜싱/에폭 으로 옛 primary 의 늦은 쓰기를 무효화해 두 리더가 동시에 쓰지 않게 한다.
- failback: 옛 리전 복구 시 그 사이 갈라진 데이터를 버전/에폭으로 충돌 해소 후 재편입.
- 실시간 게임서버의 차이: DB 는 디스크 내구성·복제로 복구되지만, 진행 중 세션·인메모리 월드 상태는 백업 대상이 아니고 유실 시 재생성/재접속으로 복구한다. 그래서 게임 DR 은 "권위 있는 영속 상태(계정/재화)는 강한 DR, 휘발성 실시간 상태는 재구성 가능하게 설계"로 이원화한다(스냅샷/체크포인트 주기, 재접속 그레이스, 결정적 재시뮬레이션 등).
요약
RPO/RTO 를 데이터 가치로 차등하고, full+증분/차등+WAL 아카이브로 백업하며 PITR 로 운영 실수까지 되돌린다. 백업은 반드시 복구 훈련으로 검증하고 3-2-1·불변 백업으로 동반 소실·랜섬웨어를 방어한다. 리전 DR 은 복제 모드·스탠바이 등급·펜싱을 데이터별로 설계하되, 실시간 인메모리 상태는 재구성 가능하도록 별도로 다룬다.