Skip to content

feat: 백업 freshness 외부 모니터링 방식 논의 및 도입 여부 결정 #74

Description

@Hexeong

어떤 기능인가요?

백업이 조용히 멈추는 상황을 외부에서 감지하는 freshness 모니터링을 검토합니다.

이 이슈는 도입을 확정한 작업이 아닙니다. 방식과 비용, 운영 부담을 논의한 뒤 도입 여부를 결정합니다. 결정 전까지 구현하지 않습니다.

배경

#66에서 백업 실패 알림을 구성했습니다. DB EC2의 백업 스크립트가 실패를 감지하면 API 서버를 거쳐 Discord로 알립니다. 다만 이 경로는 스크립트가 실행되고 있을 때만 동작합니다.

상황 현재 감지 가능 여부
업로드가 계속 실패 가능
binlog 누락, 번호 역행 가능
덤프 실패 가능
DB EC2 정지 또는 종료 불가능
systemd 타이머 자체가 멈춤 불가능
네트워크 단절 불가능

알릴 주체가 사라지면 알림도 사라지므로, 백업이 멈춘 것을 아무도 모르는 구간이 남습니다. 목표 RPO가 5분인 것을 감안하면 이 사각을 방치하기 어렵습니다.

검토한 방식

A. DB EC2에 exporter를 두고 Prometheus가 스크래핑

백업 스크립트가 기록하는 last-binlog-success를 textfile collector로 노출합니다.

  • 구현이 가장 단순합니다. 이미 파일이 존재합니다.
  • 관찰 주체가 관찰 대상 안에 있습니다. EC2가 멈추면 up == 0으로 감지되지만, 백업이 실제로 S3에 도달했는지는 확인하지 못합니다.
  • DB EC2 보안 그룹이 현재 API 서버만 신뢰하므로 모니터링 서버도 허용해야 합니다.

B. 모니터링 서버가 S3를 직접 조회

모니터링 서버에서 주기적으로 버킷의 최신 객체 시각을 읽어 메트릭으로 노출하고, Prometheus가 수집한 뒤 Grafana Alerting으로 Discord에 알립니다.

time() - mysql_backup_last_binlog_upload_timestamp_seconds > 900
time() - mysql_backup_last_dump_upload_timestamp_seconds > 108000
  • DB EC2 상태와 무관하게 "백업이 S3에 도달했는가"라는 최종 사실만 관찰합니다. 이 이슈가 요구하는 외부 관찰에 부합합니다.
  • 기존 Grafana 대시보드에 백업 상태를 함께 표시할 수 있습니다.
  • 모니터링 서버에 백업 버킷 s3:ListBucket 권한이 필요합니다. 권한 관리 원칙에 따라 수동으로 구성합니다.
  • 모니터링 서버가 멈추면 알림도 멈춥니다.

C. EventBridge Scheduler와 Lambda

Lambda가 주기적으로 S3를 확인하고 임계를 넘으면 Discord로 직접 알립니다.

  • 우리 인프라가 모두 멈춰도 동작합니다. 관찰 독립성이 가장 높습니다.
  • Lambda 코드와 배포 경로가 추가되고 Grafana 대시보드에는 나타나지 않습니다.

비용 검토

전제를 확인한 결과 데이터 전송 비용은 발생하지 않습니다.

  • 모니터링 서버는 퍼블릭 서브넷에서 IGW로 직접 통신하며 VPC에 NAT Gateway가 없습니다.
  • S3에서 같은 리전의 AWS 서비스로 전송하는 트래픽은 무료입니다.
  • 서울 리전 S3 Standard의 LIST 요청 단가는 1,000건당 0.0045 USD입니다.

5분 주기로 날짜 prefix를 조회할 때의 추정입니다.

항목
실행 빈도 8,640회/월
실행당 LIST 4회
월 LIST 요청 34,560회
월 비용 약 0.16 USD

C안도 Lambda와 EventBridge가 프리티어 범위이거나 소액이라 월 0.19 USD 수준으로, 비용은 방식 선택의 기준이 되지 못합니다.

버킷 전체를 조회하면 보관 기간 14일 기준 약 8,100개를 페이지네이션하게 되어 비용이 2.5배가 됩니다. 날짜 prefix로 좁히면 하루치가 한 페이지에 들어옵니다.

논의가 필요한 사항

  • 어느 방식을 선택할지 결정합니다. 관찰 독립성과 운영 부담의 균형이 기준입니다.
  • 모니터링 서버의 리소스 여유를 확인합니다. 현재 t4g.micro(2 vCPU, 1 GiB)에 Grafana, Prometheus, Loki가 함께 떠 있고 루트 볼륨은 8 GiB입니다. 여유가 없다면 인스턴스 상향이 선행되어야 하며 이 경우 월 6 USD 수준의 실제 비용이 발생합니다.
  • 감시자를 누가 감시할지 정합니다. B안은 모니터링 서버가 멈추면 침묵하므로, 외부 헬스체크를 두거나 C안을 최후 방어선으로 함께 둘지 판단이 필요합니다.
  • 임계값을 정합니다. 초기 후보는 binlog 15분, dump 30시간입니다.
  • 알림 채널과 심각도를 정합니다. 기존 백업 실패 알림과 같은 채널을 쓸지, 별도로 둘지 결정합니다.
  • 도입하지 않기로 할 경우 이 사각을 어떻게 감수할지 기록합니다.

결정 이후 진행할 작업

도입하기로 결정한 뒤에 아래를 진행합니다.

  • 선택한 방식으로 메트릭 수집 또는 감시 경로를 구성합니다.
  • 필요한 IAM 권한을 AWS에서 수동으로 구성합니다.
  • 알림 규칙과 임계값을 설정합니다.
  • 백업을 의도적으로 멈춰 알림이 발생하는지 검증합니다.
  • 운영 문서에 감지 범위와 한계를 기록합니다.

참고할만한 자료(선택)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions