MySQL 복제 지연으로 인한 SLO 위배 — 탐지, 긴급복구와 예방 가이드
문제 정의 — 복제 지연이 SLO에 미치는 영향
복제 지연(replication lag)은 마스터에서 커밋된 트랜잭션이 레플리카에 적용되기까지 걸리는 시간(초 단위)을 말한다. 네트워크 지연, 디스크 I/O 병목, 긴 트랜잭션 또는 복제 스레드의 정지 등이 원인이 된다. 이러한 지연은 SLO의 핵심 품질 지표에 직접적인 영향을 준다.
- 읽기 일관성: 레플리카에서의 읽기가 지연되면 스태일 데이터가 반환되어 세션 일관성이나 읽기 신선도 같은 일관성 SLO를 위반할 수 있다.
- 가용성: 다수의 레플리카가 지연되면 읽기 처리 용량이 감소한다. 자동·수동 페일오버 시 스태일 복제본이 승격되면 데이터 손실이나 롤백 가능성으로 가용성·무결성 SLO를 침해할 수 있다.
- 복구 시간(RTO) 및 데이터 손실(RPO): 복구 시 레플리카의 미적용 로그를 재적용하거나 재생성해야 해 RTO가 늘어난다. 지연이 크면 RPO 목표를 초과할 위험도 커진다.
운영상 핵심 지표는 seconds_behind_master(또는 replica_lag), relay_log 및 SQL 스레드 상태다. 이들 지표를 지속적으로 모니터링해 SLO 기준치를 초과하기 전에 조기에 탐지해야 한다. 실무 체크리스트: 모니터링 임계값 설정, 알람 채널 정의, 복제 스레드 재시작 및 로그 재적용 절차를 문서화해 두자. MySQL 복제 지연으로 인한 SLO 위배와 복구 절차를 설계할 때 이 항목들을 우선 고려하면 대응 속도가 빨라진다.
SLO와 지표 맵핑 — 언제 경보를 울릴 것인가
복제 지연 SLO를 관련 메트릭에 직접 연결해 경보 기준과 에러 버짓 소모를 계량화한다. 핵심 지표는 Seconds_Behind_Master(미디어 서버), replica_lag_seconds(Prometheus), 그리고 IO/SQL 스레드 상태와 relay_log_space, relay_log_corrupt 같은 relay 로그 관련 지표다. 이 접근법은 MySQL 복제 지연으로 인한 SLO 위배와 복구 절차에 그대로 적용할 수 있다.
- 임계값 예시: 경고(warning) = Seconds_Behind_Master > 30s (지속 3분 이상), 임계(critical) = >120s (지속 5분 이상).
- Prometheus: replica_lag_seconds의 p95(5m) > 30s → warning, p95(5m) > 120s → critical. 평가 윈도우는 3-of-5 샘플링을 사용해 플래핑을 줄인다.
- Relay 로그 상태: IO/SQL thread가 STOPPED되거나 relay_log_space가 급증(예: 이전 평균 대비 5배)하거나 relay_log_corrupt가 감지되면 즉시 페이지를 발생시킨다.
- 알림 정책: warning은 알림 채널 전송 및 엔지니어 대기열 확인, critical은 즉시 페이징과 자동 롤백·스위치북 실행. 유지보수 창은 mute 처리한다.
- 에러 버젯 연동: SLO 위반 발생 시 해당 이벤트의 지속시간만큼 에러 버젯을 소진한다. 동일 서비스가 1시간 내 에러 버젯의 50% 이상을 소진하면 즉시 고가용 대응(스케일 아웃 또는 리플리카 전환)을 트리거한다. 체크리스트 예: 경보 확인 → 최신 relay 로그 수집 → 문제 노드 격리(필요 시) → 리플리카 전환 또는 롤백 수행.
탐지·관찰성 구축 — 실시간으로 무엇을 관찰해야 하는가
- 핵심 메트릭: replica_seconds_behind_master, slave_io_running, slave_sql_running, relay_log_space, binlog_bytes, GTID/pos 차이, 트랜잭션 재시도·에러 카운트, 디스크 I/O·네트워크 지연. 실무에서는 MySQL 복제 지연으로 인한 SLO 위배와 복구 절차를 염두에 두고 임계값을 정해야 한다.
- 로그·쿼리 프로파일링: slow_query_log, performance_schema(threads/events_statements), 에러 로그의 복제 관련 항목을 모니터링한다. 빈번한 LOCK·WAIT 쿼리는 EXPLAIN으로 분석해 원인을 파악하라.
- 대시보드 예시: 노드별 시간 경과를 보여주는 replication lag 히트맵, 상위 지연 유발 쿼리 목록, IO·CPU·디스크 스파이크 차트, replication thread 상태 패널, binlog 성장 그래프 등으로 상태를 한눈에 확인한다.
- 알림·노이즈 억제: 임계값은 지속시간(sustained) 기준으로 설정(예: 5분 이상). 멀티 조건(alert if lag>30s AND sql_thread_down)을 사용하고 그룹화·중복제거를 적용한다. 유지보수 창은 무시하며, 경보에는 우선순위와 Runbook 링크를 포함하라. 체크리스트: 1) 임계값과 지속시간을 검토했는가? 2) 멀티 조건 경보를 테스트했는가? 3) Runbook과 담당자 연결이 준비되어 있는가?
긴급 대응 Runbook — SLO 위반 시 즉시 실행할 조치
상태 진단 체크리스트로 현재 영향 범위를 신속히 파악한다. 이 Runbook은 MySQL 복제 지연으로 인한 SLO 위배와 복구 절차에 적용된다.
- 진단: 복제 지연(초 단위)과 IO/SQL 스레드 상태, relay 로그 에러를 확인한다. 디스크·네트워크·CPU 병목과 최근 대형 트랜잭션 발생 여부도 점검한다. 체크리스트 예 — GTID/relay 오프셋을 확인하고, 이상이 반복되면 네트워크·디스크 문제를 우선 의심하며 관련 로그(타임스탬프·트랜잭션 크기)를 수집한다.
- 임시 복제 재시작: IO/SQL 스레드를 재기동하거나 relay 로그 재생을 다시 시도한다. 충돌 발생 시 skip으로 건너뛰는 조치는 위험하므로 가능한 최소화한다.
- 읽기 트래픽 라우팅: 지연된 복제본은 즉시 읽기 풀에서 제외한다. 로드밸런서나 프록시를 통해 정상 복제본으로 트래픽을 재분배한다.
- 쿼리 차단·스로틀링: 대형 읽기·쓰기 쿼리를 즉시 차단하거나 제한한다. 프록시에서 슬로우 쿼리 제한과 커넥션 쓰로틀을 적용하고, 필요 시 쓰기 잠금으로 부하를 일시 완화한다.
- 프로모션 고려사항: 마스터 장애 시에만 프로모션을 검토한다. GTID/포지션 일관성, relay 로그의 완전성, 애플리케이션의 쓰기 락 영향 등을 확인한 후 자동화 도구로 안전하게 승격한다.
완전 복구 절차와 데이터 정합성 확인
근본 원인을 규명한 뒤 리플리카를 재동기화하고 GTID/포지션을 정리한 후 데이터 무결성을 확인한다. 아래 항목을 순서대로 실행해 복구를 마무리하라.
- 근본원인 파악: 네트워크, I/O, 쿼리 지연, 스키마 변경 등 가능한 원인을 로그와 모니터링(서버 상태, binlog, error log, 퍼포먼스 스냅샷)으로 조사해 원인을 규명한다.
- 리플리카 재동기화 방법 선택:
- 스냅샷: 동일 클라우드나 스토리지 환경에서 빠르게 복구해야 할 때 적합하다.
- xtrabackup: 대용량 데이터의 온라인 복구에 유리하며, 복제 상태를 유지하면서 파일 복사를 수행한다.
- mysqldump: 소규모 환경이나 완전 초기화가 필요한 경우 단순하고 확실한 방법이다.
- GTID/포지션 정리:
- GTID 사용 시 불일치 원인을 제거한 뒤
SET GLOBAL gtid_purged='...'로 조정하거나 소스에서 적절히 처리한다. - 비GTID 환경에서는 소스의 binlog 파일과 위치를 확인해
CHANGE REPLICATION SOURCE TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...로 맞춘다. - 복제 시작 전에
STOP SLAVE또는RESET SLAVE ALL로 초기화가 필요한지 판단한다.
- GTID 사용 시 불일치 원인을 제거한 뒤
- 데이터 무결성 검증:
- pt-table-checksum으로 테이블별 체크섬을 계산해 동기화 상태를 확인한다.
- 불일치가 발견되면 pt-table-sync 또는 쿼리 기반의 행 비교로 차이를 해소한다.
- 중요 테이블은 행 수, 인덱스 무결성, 통계 쿼리 등을 통해 추가 검증을 수행한다.
- 검증 후 모니터링: 복제 지연, 오류 로그, binlog 보존 정책을 재검토한다. 이후 재발 방지를 위해 자원 증설, 쿼리 튜닝, 네트워크 QoS 등 적절한 조치를 적용한다. 체크리스트 예: 복제 상태, 최근 지연 시간, 최근 오류 메시지, binlog 사용량, 정기 백업 생성 여부를 빠르게 점검하라.
사후조치 및 예방책 — 재발 방지와 운영 개선
근본 원인에 대한 개선을 최우선으로 한다. 슬로우 쿼리와 실행 계획을 분석해 쿼리와 인덱스를 정리하고, 대량 변경은 배치화해 복제 부담을 줄인다. 특히 MySQL 복제 지연으로 인한 SLO 위배와 복구 절차를 염두에 두고, 인프라에서는 리플리카 수평 확장·디스크 I/O·네트워크 자원 증설, 복제 버퍼와 로그 설정 재조정으로 안정성을 확보한다.
- 자동화·테스트·카오스 실험: 리플리카 캐치업 자동화(스냅샷·포인트 보정), 자동 복구 스크립트와 안전 차단 로직을 도입한다. 정기적인 부하 및 레플리카 지연 시나리오를 CI/QA 파이프라인에 포함시키고, 카오스 실험으로 실제 대응력을 검증한다.
- SLO·운영문서 업데이트: SLO와 경보 임계값을 재정의하고, 감지→격리→복구→근본원인 분석의 단계별 플레이북을 명문화한다. 롤별 호출자·권한·테스트 일정도 명확히 해 운영체계를 정비한다. 체크리스트 예: 경보 수신 → 담당자 지정 → 자동 격리 스크립트 실행 → 복구 확인 → RCA 등록.
경험에서 얻은 교훈
특히 MySQL 복제 지연으로 인한 SLO 위배와 복구 절차를 다뤄보면, 현장에서는 한 가지 지표만 보고 '일시적'이라 판단하거나 경보 임계값이 부적절해 조치가 지연되는 경우가 많았습니다. 탐지 시 우선 확인할 항목은 복제 상태(Replica/Slave 상태), IO·SQL 쓰레드 실행 여부, seconds_behind_master 외의 Last_SQL_Error와 채널별 지연, 장시간 실행 중인 트랜잭션과 락, 디스크 I/O 및 네트워크 오류 여부입니다. 단일 지표에 의존하면 노이즈에 휘둘리기 쉽습니다. 쓰기량, binlog 생성량, 쿼리 응답 시간, 스레드 상태 등 여러 지표를 함께 모니터링해 우선순위를 명확히 해야 합니다.
긴급복구의 최우선 원칙은 SLO 영향 최소화입니다. 예를 들어 읽기 트래픽을 영향 없은 복제본으로 우회하고, 대량 쓰기나 배치 작업을 즉시 백오프시키는 것이 초동입니다. 트랜잭션을 건너뛰는 명령(skip, SET GTID_PURGED 등)은 문서화된 승인 절차 없이 즉시 사용하지 마십시오. 안전한 복구 흐름은 대략 (1) 영향을 받는 복제본 식별 및 상태 캡처, (2) 읽기 라우팅 전환·쓰기 스로틀로 노출 축소, (3) 잠금·대형 트랜잭션·네트워크·리소스 병목 등 원인 해결 시도, (4) 필요 시 IO/SQL 쓰레드 재시작과 재동기화 순입니다. 장기 대책으로는 GTID 기반 복제 도입, 작은 단위 트랜잭션 권장, binlog·IO 버퍼·네트워크 용량 검토와 정기적인 페일오버·복제 무결성 테스트를 권합니다.
- 모니터링: seconds_behind_master 외에 Slave_IO_Running, Slave_SQL_Running, Last_SQL_Error, per-query latency, binlog 생성률, 디스크·네트워크 지표 등을 수집해 시각화합니다.
- 알림 정책: 단계적 임계값(예: 경고→중요→비상)을 두어 SLO 영향도에 따라 다른 대응을 트리거하세요.
- 긴급 조치 체크리스트: 상태 캡처(SHOW REPLICA/SLAVE STATUS), 읽기 라우팅 전환, 배치/ETL 일시중지, 문제 복제본 트래픽 격리, IO/SQL 쓰레드 재시작(재시작 전 로그 캡처). 실무 사례로, 대형 ETL 작업이 원인일 때는 즉시 해당 배치를 중단하고 로그를 확보한 뒤 재동기화하는 절차가 효과적입니다.
- 주의사항: 데이터 손실 위험이 있는 조치(스킵/데이터 재설정)는 문서화된 승인과 롤백 플랜 없이 사용하지 마십시오.
- 예방 조치: GTID 사용, 대형 트랜잭션 분할, binlog·innodb 설정 검토, 리소스(IO·CPU·네트워크) 격리, 정기적 복제 무결성 검사(pt-heartbeat 또는 synthetic checks)를 시행하세요.
- 운영 준비: 런북과 롤백 플랜을 문서화하고 정기적으로 장애 시나리오(페일오버 드릴)를 연습한 뒤 포스트모템과 RCA로 근본 원인을 제거하고 구성·용량에 반영합니다.
댓글
댓글 쓰기