Skip to content
isdnetworks
Go back

AWS RDS 디스크 풀 장애 대응 — 연속 ALARM에서 배운 것

CloudWatch에서 awsrds-myapp-standalone-High-rds_disk_running_out ALARM이 연속 5회 발생했다. RDS 디스크가 꽉 차면 DB가 읽기 전용 모드로 전환되어 서비스가 중단된다.

Table of contents

Open Table of contents

장애 타임라인

09:21 — ALARM: rds_disk_running_out
09:35 — ALARM: rds_disk_running_out
09:48 — ALARM: rds_disk_running_out
10:00 — ALARM: rds_disk_running_out
11:42 — ALARM: rds_disk_running_out

약 15분 간격으로 알람이 반복됐다. 디스크 사용량이 임계값을 넘어 지속적으로 증가하고 있다는 의미다.

원인 분석

RDS 디스크가 급격히 차는 원인:

1. 바이너리 로그 (binlog)

리플리카 연결이나 PITR(Point-in-Time Recovery)을 위해 binlog가 쌓인다:

SHOW BINARY LOGS;
-- 파일 크기와 개수 확인

binlog 보관 기간이 길거나 리플리카 지연이 있으면 급격히 증가한다.

2. 슬로우 쿼리/제너럴 로그

로그 활성화 상태에서 트래픽이 급증하면 로그 파일이 빠르게 증가한다.

3. 임시 테이블

대량 JOIN이나 정렬 작업에서 디스크 기반 임시 테이블이 생성된다:

SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';

4. InnoDB 임시 테이블스페이스

MySQL 8.0에서는 세션별 임시 테이블스페이스가 자동 확장된다.

즉시 대응

1. 디스크 여유 공간 확인

-- RDS에서는 CloudWatch 메트릭으로 확인
-- FreeStorageSpace (bytes)

또는 AWS CLI:

aws cloudwatch get-metric-statistics \
  --namespace AWS/RDS \
  --metric-name FreeStorageSpace \
  --dimensions Name=DBInstanceIdentifier,Value=myapp-standalone \
  --start-time 2026-01-08T00:00:00Z \
  --end-time 2026-01-08T23:59:59Z \
  --period 300 \
  --statistics Minimum

2. binlog 정리

-- binlog 보관 시간 단축 (기본 NULL = 무제한)
CALL mysql.rds_set_configuration('binlog retention hours', 24);

-- 또는 수동 삭제 (RDS 프로시저)
CALL mysql.rds_rotate_general_log;
CALL mysql.rds_rotate_slow_log;

3. 스토리지 확장

aws rds modify-db-instance \
  --db-instance-identifier myapp-standalone \
  --allocated-storage 100 \  # GB 단위
  --apply-immediately

주의: 스토리지 확장은 축소 불가다. 신중하게 결정한다.

4. 스토리지 오토스케일링 활성화

aws rds modify-db-instance \
  --db-instance-identifier myapp-standalone \
  --max-allocated-storage 200 \  # 최대 한도
  --apply-immediately

오토스케일링이 활성화되면 여유 공간이 10% 미만일 때 자동으로 확장된다.

재발 방지

모니터링 강화

알람 설정:
├── Warning: FreeStorageSpace < 20% (이메일)
├── Critical: FreeStorageSpace < 10% (SMS/전화)
└── 추세 알람: 24시간 내 20% 이상 감소 시 (이메일)

정기 점검 항목

항목주기명령
binlog 크기주간SHOW BINARY LOGS
테이블 크기월간information_schema.TABLES
임시 테이블 사용주간Created_tmp_disk_tables
로그 파일 크기주간CloudWatch RDS 메트릭

근본 대책

  1. 스토리지 오토스케일링: 반드시 활성화 (최대 한도 설정)
  2. binlog 보관 기간 제한: 24~48시간으로 설정
  3. 슬로우 쿼리 최적화: 임시 테이블을 만드는 쿼리 개선
  4. 데이터 아카이빙: 오래된 데이터는 S3로 이관

정리

RDS 디스크 풀은 예방 가능한 장애다. 스토리지 오토스케일링을 켜고, binlog 보관 기간을 제한하고, 여유 공간 알람을 20% 시점에 설정한다. 연속 ALARM이 오기 전에 미리 대응한다.


Share this post on:

Previous Post
레거시 PHP 프로젝트를 인수받으면 가장 먼저 하는 것들
Next Post
GitHub 2FA 잠금 — 복구 절차 가이드