백업보다 중요한 복구: 20명에서 100명 규모의 사내 시스템 백업 설계
백업이 성공했다는 알림은 데이터를 되살릴 수 있다는 보증이 아니다. 파일이 손상됐거나, 필요한 암호화 키가 없거나, 복구 순서를 아무도 모르면 백업은 있어도 업무를 재개할 수 없다. 사내 시스템의 백업 설계는 저장 횟수보다 복구 목표와 복원 시험에서 시작해야 한다.
먼저 RPO와 RTO를 정한다
- RPO, 복구 시점 목표: 장애가 나면 최대 몇 분 또는 몇 시간의 데이터를 잃어도 되는가?
- RTO, 복구 시간 목표: 장애 발생 후 몇 시간 안에 업무를 다시 시작해야 하는가?
예를 들어 휴가 신청은 몇 시간 전 데이터로 돌아가도 수기로 보완할 수 있지만, 주문이나 회계 기록은 같은 기준을 적용하기 어렵다. 시스템 전체에 하나의 숫자를 붙이지 말고 업무별로 정한다.
백업 대상은 DB만이 아니다
| 대상 | 반드시 보존할 것 | 복구 때 확인할 것 |
|---|---|---|
| 데이터베이스 | 스키마, 업무 데이터, 권한 정책 | 버전 호환, 확장 기능, 사용자 권한 |
| 객체 저장소 | 원본 파일, 결과 파일, 메타데이터 | DB의 파일 키와 실제 객체 일치 |
| 애플리케이션 | 소스, 이미지, 배포 설정 | 특정 버전을 다시 배포할 수 있는가 |
| 설정과 비밀정보 | 필요한 환경 설정과 키의 안전한 사본 | 접근 권한, 키 교체 여부 |
| 운영 기록 | 복구 절차, 담당자, 최근 시험 결과 | 담당자가 없어도 따라 할 수 있는가 |
소스 저장소는 백업의 일부일 뿐이다. 배포 당시 이미지와 DB 스키마가 맞지 않으면 애플리케이션을 재배포해도 정상 동작하지 않는다. 마이그레이션과 배포 버전을 함께 기록해야 한다.
관리형 백업도 별도 사본이 필요하다
Supabase의 유료 플랜은 자동 일일 백업 보존 기간을 제공하고, 더 짧은 복구 시점이 필요하면 PITR을 선택할 수 있다. 하지만 프로젝트를 삭제하면 해당 프로젝트의 백업도 함께 영구 삭제된다. 무료 프로젝트는 정기적인 논리 백업과 외부 보관이 특히 중요하다. Supabase 데이터베이스 백업
물리 백업이나 PITR을 사용하는 프로젝트는 대시보드에서 내려받는 논리 백업 파일이 없을 수 있다. 이 경우 Supabase CLI의 db dump나 pg_dump로 별도 논리 사본을 만들어야 한다. Supabase 논리 백업 내려받기
R2나 S3의 파일도 같은 계정 안에 복사해 두는 것만으로는 충분하지 않다. 잘못된 삭제 권한이 원본과 복사본에 동시에 적용될 수 있기 때문이다. 보존 잠금, 별도 버킷 또는 별도 계정, 삭제 권한 분리를 조합한다. R2의 Bucket Lock은 정한 기간 동안 객체 삭제를 막을 수 있고, 수명 주기 규칙보다 잠금 규칙이 우선한다. Cloudflare R2 Bucket Lock
인원별 현실적인 운영 단계
20명
- 관리형 DB 자동 백업을 확인한다.
- 주 1회 이상 논리 백업을 다른 저장 위치에 보관한다.
- 중요한 파일은 원본 저장소와 권한이 분리된 위치에 복제한다.
- 분기마다 한 번, 새 환경에 DB와 파일 일부를 복원한다.
50명
- 업무별 RPO와 RTO를 문서화한다.
- 백업 실패, 마지막 성공 시각, 저장 용량을 감시한다.
- 월 1회 복원 시험을 하고 담당자 외 한 명도 절차를 수행해 본다.
- 삭제 사고를 대비해 보존 정책과 관리자 승인 절차를 둔다.
100명
- 핵심 업무에는 PITR이나 더 짧은 백업 간격을 검토한다.
- 운영 계정 침해를 가정해 별도 계정과 별도 자격 증명으로 사본을 보관한다.
- 연 1회 이상 전체 재해 복구 훈련을 하고 실제 RTO를 잰다.
- 복구 중 사용할 임시 업무 절차와 공지 책임자를 정한다.
복원 시험에서 확인할 항목
- 빈 환경에서 시작해 문서만 보고 복구할 수 있는가?
- DB 사용자, 확장 기능, 스토리지 권한까지 돌아오는가?
- 첨부 파일 링크가 깨지지 않는가?
- 복구된 시스템에서 로그인과 핵심 업무가 가능한가?
- 실제 소요 시간이 목표 RTO 안에 들어오는가?
- 복구용 키와 백업에 접근한 기록이 남는가?
좋은 백업은 많은 사본이 아니라, 삭제 사고와 계정 침해를 견디고 정해진 시간 안에 업무를 되살릴 수 있는 사본이다. 마지막 백업 성공 시각보다 마지막 복원 성공 시각을 운영 대시보드에 표시하면 팀의 관심도 자연스럽게 복구 가능성으로 이동한다.
함께 읽기
- 20명에서 100명까지, 사내 시스템 배포 아키텍처 설계하기사내 시스템은 직원 수가 적다고 해서 항상 가볍지 않다. 20명이 쓰는 문서 변환 시스템은 100명이 쓰는 단순 결재 시스템보다 더 많은 CPU와 저장 공간을 요구할 수 있다. 그래서 배포 구조는 인원수보다 동시 접속, 요청 시간, 파일 크기, 실시간 연결 수, 장애 허용 시간을 기준으로 정해야 한다.
- Supabase는 데이터베이스만이 아닙니다: 핵심 서비스와 Upstash 비교Supabase를 처음 접하면 관리형 PostgreSQL 서비스로 이해하기 쉽습니다. 실제로 PostgreSQL은 Supabase의 중심이지만, 전체 제품은 데이터베이스보다 훨씬 넓은 범위를 다룹니다.
- 온프레미스 Next.js 서비스를 Vercel과 Supabase로 옮기기온프레미스에서 서비스를 운영하면 애플리케이션, 데이터베이스, Redis, WebSocket 서버와 백그라운드 워커를 한 네트워크 안에 둘 수 있습니다. 프로세스를 계속 띄워두기도 쉽습니다. setInterval로 10초마다 데이터베이스를 확인하는 코드도 일단은 잘 동작합니다.
- 사내 시스템 공개 전 확인해야 할 운영 체크리스트 30가지사내 시스템은 외부 고객 서비스보다 사용자가 적다는 이유로 공개 전 점검이 짧아지기 쉽다. 하지만 결재, 계약, 인사, 회계처럼 업무의 기준이 되는 시스템은 한 번의 권한 오류나 데이터 손실도 실제 업무 중단으로 이어진다.
- 듀오랩스가 사내 시스템을 설계하고 운영하는 7가지 원칙사내 시스템의 좋은 아키텍처는 가장 큰 서버나 가장 복잡한 기술 조합이 아니다. 현재 업무를 무리 없이 지원하고, 문제가 생겼을 때 되돌릴 수 있으며, 사용자가 늘면 필요한 부분만 확장할 수 있는 구조다.