한 달 동안 조용히 안 돌던 백업
매일 돌기로 한 백업이 에러 하나 없이 한 달째 멈춰 있었습니다. 자동화가 실패할 때 왜 조용한지, 그리고 성공 신호가 끊기면 알아채는 heartbeat 방식으로 어떻게 바꿨는지 정리합니다.
어느 날 로컬 데이터베이스를 실수로 날릴 뻔한 일이 있었습니다. 다행히 직전에 눈치챘고, 그때 처음으로 “백업이 제대로 돌고 있나?”를 확인하러 갔습니다.
결과는 충격이었습니다. 매일 새벽에 돌도록 등록해 둔 백업이 한 달 넘게 한 번도 실행되지 않았습니다. 에러 로그는 없었습니다. 알림도 없었습니다. 그냥 조용했습니다.
왜 아무 소리도 없었나
원인을 찾는 것은 오래 걸리지 않았습니다. 서버를 한 번 재구성하면서 스케줄 설정을 옮기다가 실행 경로가 틀어져 있었습니다. 스크립트 파일 자체는 있었고, 스케줄 항목도 있었습니다. 다만 스크립트 안에서 참조하는 절대 경로 하나가 바뀐 환경에서는 존재하지 않는 경로였습니다. 스크립트는 시작하자마자 조용히 종료되었습니다.
문제의 본질은 설정 실수가 아니었습니다. 진짜 문제는 제가 만든 자동화 구조가 “실패했을 때 알려주는” 방식이었다는 것입니다. 실패 자체가 발생하지 않으면, 즉 스크립트가 아예 실행되지 않으면 아무 신호도 오지 않습니다. 침묵이 성공처럼 보입니다.
이 구조에서는 한 달이 아니라 1년이 지나도 모를 수 있습니다.
성공 알림 대신 heartbeat를 붙였습니다
문제를 확인하고 나서 방식을 바꿨습니다. 실패했을 때 알리는 게 아니라, 성공했을 때 신호를 남기고 그 신호가 끊기면 이상으로 판단하는 구조입니다.
외부 서비스를 붙일 수도 있었지만, 저는 이미 시스템 안에 잡 실행 기록과 알림 채널(텔레그램)을 갖고 있었습니다. 그래서 새 의존을 늘리는 대신, 각 정기 작업이 성공할 때마다 “마지막 성공 시각”을 남기고, 그 시각이 자기 실행 주기를 넘겨 침묵하면 경보하는 heartbeat 기록 장치를 직접 붙였습니다.
작업 하나가 성공적으로 끝나는 지점에서 신호를 한 번 남기는 게 전부입니다. 개념적으로는 이런 한 줄입니다.
// 정기 작업이 성공으로 끝나는 자리에서
heartbeat.success("db-backup", intervalMinutes = 1440) // 하루 주기
db-backup 잡이 하루(1440분) 주기인데 그만큼 지나도록 다음 성공 신호가 안 오면, 감시 쪽이 “이 잡이 침묵한다”고 판단해 알림을 보냅니다. 스크립트가 아예 실행되지 않아도, 바로 그 “신호 없음”이 탐지됩니다. 실패가 아니라 무응답을 잡는 것입니다.
주기에는 약간의 여유를 둡니다. 하루 한 번 도는 작업이라도 판정을 정확히 24시간에 걸면 일시적인 지연에도 오탐이 나기 때문에, 실제로는 주기보다 조금 넉넉하게 잡아 한 번 건너뛴 것이 확실할 때만 울리도록 합니다.
그동안 믿고 있던 것들
한 달 동안 백업이 없었다는 사실보다, 한 달 동안 있다고 믿었다는 사실이 더 불편했습니다.
1인 개발은 확인자가 없습니다. 팀이 있으면 누군가 모니터링을 열거나 주간 점검을 하는 문화가 생기기도 합니다. 혼자 운영할 때는 “잘 돌고 있겠지”가 기본 상태가 되고, 그 믿음이 틀렸다는 것을 외부 충격 없이는 알기 어렵습니다.
지금은 비슷한 구조로 자동화된 것들을 다시 살펴보고 있습니다. 에러가 났을 때 알림이 오는 것과, 살아있다는 신호가 와야 정상인 것을 구분하는 것이 핵심입니다. 에러 알림은 실패를 탐지하고, heartbeat는 무응답을 탐지합니다. 두 가지는 다른 종류의 감시입니다.
자동화가 “조용하다”는 것은 잘 돌고 있다는 뜻이 아닐 수 있습니다. 적어도 어제치 신호가 왔는지는 확인하는 구조를 만들어두는 편이 낫습니다.
자주 묻는 질문
자동 백업이 실패해도 알림이 안 오는 이유가 뭔가요?
대부분의 자동화 스크립트는 에러가 발생했을 때만 알림을 보내도록 설계되어 있습니다. 그런데 스크립트 자체가 실행되지 않으면 에러도 발생하지 않아 아무 신호도 오지 않습니다. cron 데몬이 죽거나, 스케줄 설정이 잘못되거나, 실행 경로가 바뀐 경우가 대표적입니다.
heartbeat 모니터링이란 무엇인가요?
작업이 성공적으로 완료되었을 때 "살아있다"는 신호를 남기는 방식입니다. 정해진 주기 안에 신호가 오지 않으면 이상이 생긴 것으로 판단해 알림을 보냅니다. 성공을 감시하는 구조이기 때문에, 스크립트가 아예 실행되지 않아도 탐지할 수 있습니다.
heartbeat는 외부 서비스를 써야 하나요, 직접 만들어야 하나요?
둘 다 가능합니다. Healthchecks.io 같은 외부 서비스는 붙이기 쉽고 무료 플랜도 있습니다. 저는 이미 잡 실행 기록과 텔레그램 알림 채널을 시스템 안에 갖고 있어서, 각 잡의 마지막 성공 시각을 기록하고 주기를 넘겨 침묵하면 경보하는 방식을 직접 붙였습니다. 새 의존을 늘리지 않는 쪽을 택한 것입니다.
백업 스크립트가 실제로 돌았는지 확인하는 가장 간단한 방법은 뭔가요?
백업 완료 후 타임스탬프가 찍힌 로그를 남기고 그 최종 수정 시각을 주기적으로 확인하는 것이 가장 단순합니다. 더 나아가 성공할 때마다 어딘가에 신호를 남기고, 그 신호가 끊기면 알림이 오도록 만들면 자동으로 감시됩니다.
1인 개발자에게 백업 검증이 특히 중요한 이유가 있나요?
팀이 있으면 누군가 백업 상태를 주기적으로 확인하거나 공유 모니터링을 보는 문화가 생깁니다. 1인 개발자는 백업이 잘 돌겠지 하고 믿어버리면 아무도 확인하지 않는 상태가 지속됩니다. 문제를 발견했을 때는 이미 복구가 필요한 시점인 경우가 많습니다.