백업은 단순하지 않다: RPO에서 GFS 로테이션, 하드링크 중복 제거까지 계속 늘어나는 백업의 조건
- RPO(Recovery Point Objective) 기준으로 금융기관은 30초 미만, 소규모 기업은 24시간 이상의 데이터 손실을 감수하는데, 하루 1회 스냅샷을 1년간 쌓으면 365개가 되어 로테이션이 필요해짐
- 미러링이나 RAID 1은 백업이 아님. 랜섬웨어나 잘못 실행한 스크립트 같은 실수에서 되돌아가려면 특정 시점을 보존하는 스냅샷 방식이어야 함
- 일 14일, 주 7주, 월 12개월 주기로 스냅샷을 돌리는 GFS 로테이션이 현실적인 절충안이며, 오래된 데이터일수록 스냅샷 간격을 늘리는 게 합리적임
- 파일 변경이 팻테일 분포를 따르기 때문에 대부분 파일은 변하지 않음. 동일 파일을 여러 스냅샷에서 하드링크로 참조하면 중복 제거가 되고 이 방식은 백업 로테이션과도 함께 감
- 드라이브 고장, 도난, 콜드 스토리지의 비트 로트(HDD 자성 입자의 이동, SSD NAND 전하 누설)까지 있어 중요한 데이터를 한 곳에만 두면 안 됨
Hacker News opinions
복원 테스트 안 해보면 백업은 아무 가치 없음. 내 은사님이 백업이 아니라 복원에 돈을 낸다고 했는데 정확한 말이었음.
직접 만든 백업 솔루션으로 복구하다 보면 문제가 우수수 나오는데 그 기분이 공포에 가까움. restic이나 borg 좋긴 한데 검증까지 포함한 바보 방지 모드가 있었으면 싶음. 타임머신으로 노트북 복원했을 때 거의 똑같이 살아나서 신기했음.
비즈니스 관점은 다름. 우리는 백업 스토리지를 용량으로 과금하고 연 1회 복구 시연을 포함시킴. 고객 시스템을 격리해서 우리 장비에 띄워보고 정상 동작하는지 보여줌.
restic 쓰는데 파이프로 mysqldump나 pg_dumpall을 바로 밀어넣을 수 있고 저장소 무결성 검사 옵션도 괜찮음. 주사위 굴려서 아무 백업이나 골라 복원해보는 테스트 스크립트도 돌리고 있음. 중복 제거가 좋아서 1년치 주간 스냅샷도 합리적임.
kopia는 GUI 붙어있는데 CLI가 restic보다 좀 불편함. 로컬 설정을 계속 들고 있으려 해서 스크립트 짜기가 번거로움.
restic이랑 Backrest 조합으로 돌리고 있음. 제일 쉬운 복원 테스트는 프로덕션 백업으로 하위 환경을 주기적으로 리프레시하는 것임. 단 백업은 반드시 immutable이어야 함.
난 백업 말고 지리적으로 분리된 곳에 자격증명을 공유해서 동기화된 복제본을 두고 싶음.
그럼 실수로 파일 지웠을 때 그 삭제가 모든 데이터센터로 전파되는 데 얼마나 걸림? 사고랑 조용한 손상에서 돌아오려면 시점 스냅샷이 있어야 함.
그건 redundancy고 백업이랑 다름. 한 곳이 죽어도 서비스가 안 멈추게 하는 게 redundancy고, 데이터 손실을 막는 게 백업임. 동기화되면 실수든 고의든 다 퍼짐.
Docker 컨테이너가 root 소유 파일을 만들고 cronjob을 기본 유저로 돌리면 privesc 위험도 생김. 난 root systemd 타이머로 restic만 호출하고 DB 덤프는 컨테이너 쪽 cron으로 따로 처리함.
이상적인 건 rootless Podman인데 현실 소프트웨어는 자체 DB 덤프도 안 하고 rootless로도 안 돌아감. Immich는 자체 덤프를 해줘서 볼륨만 복사하면 되니 편함. 백업 privesc 확률이랑 쓰는 소프트웨어 CVE 확률 중 뭐가 더 나쁜지 저울질하다 그냥 무시하기로 했음.
우리 고객사가 15년 넘게 다른 서비스로 거래하던 곳인데 화재로 장비가 다 망가짐. 하필 영국 첫 코로나 락다운 1주 전이었고, XFS reflink로 저장소를 클론해서 우리 장비에 VM을 띄우고 OpenVPN 서버까지 새로 세팅해서 팬데믹 내내 우리 데이터센터에서 VPN으로 돌렸음.