MySQL 복제 지연 증가 시 원인 추적과 동기화 대책
문제 정의: 복제 지연이란 무엇이며 왜 중요한가
복제 지연은 마스터에서 커밋된 트랜잭션이 복제본(슬레이브/리더)에 반영되기까지 걸리는 시간입니다. 일반적으로 IO(쓰기) 지연과 SQL 적용 지연으로 나뉘며, 모니터링은 "마스터 타임스탬프"와 "슬레이브 적용 시각"의 차이(초)로 측정합니다.
- 비즈니스 영향: 읽기 일관성 손상(읽기-쓰기 불일치), 장애 전이 시 데이터 손실 위험(RPO 증가), 분석·리포트 결과 왜곡, 캐시 불일치로 인한 응답 지연 및 SLA 위반.
- 정상·임계값 설정 예시: 서비스 특성에 따라 달라야 하지만 일반 가이드라인은 다음과 같습니다 — 정상: <1s(실시간 요구), 주의: 1–10s(저지연이 필요한 서비스), 임계: >10–30s(즉각 대응 필요). 임계값은 트래픽 패턴, 트랜잭션 크기, 동기화 방식(비동기/반동기)에 맞춰 서비스별로 조정하고, 경고(Warning)와 심각(Critical) 알림을 계층화해 구성하세요. 체크리스트: 임계값 설정 검토, 주요 트랜잭션 샘플링으로 지연 원인 파악, 트래픽 급증 시 모니터링 경로와 알림 수신자 확인.
먼저 측정하라 — 핵심 지표와 관찰 포인트
복제 지연을 해결하려면 측정부터 시작해야 한다. Seconds_Behind_Master는 유용한 지표지만 Slave가 멈추거나 순간값이 요동칠 수 있어 단독 판단은 위험하다. MySQL 복제 지연 증가 시 원인 추적과 동기화 대책 관점에서, 다음 항목을 동시에 관찰해 원인을 좁혀라. 간단한 체크리스트 예: 문제 발생 시 IO/SQL 스레드 상태 → relay/binlog 일치 여부 → 리소스 지표 → 집계 패턴 순으로 점검해 본다.
- IO/SQL thread: SHOW SLAVE STATUS에서 Slave_IO_Running·Slave_SQL_Running·Last_SQL_Error를 확인하고, 스레드 재시작 빈도도 함께 점검한다.
- relay/binlog 상태: relay log의 파일·크기와 Exec_Master_Log_Pos를 확인하고, master의 binlog 파일 및 포지션과 일치하는지 비교한다.
- 리소스 메트릭: CPU 사용률과 iowait, 디스크 지연과 쓰기량, 네트워크 대역폭, 메모리 및 InnoDB buffer_pool 활용률, 그리고 row_lock_waits를 점검한다.
- 집계 지표: read_io·exec 등 읽기/실행 카운터의 변화와 대형 트랜잭션 또는 배치 쿼리의 발생 패턴을 찾아본다.
원인 분류 및 식별 방법 — 쿼리·리소스·네트워크·설정
복제 지연의 원인은 쿼리·리소스·네트워크·설정 네 가지 축으로 빠르게 분류해 좁히는 것이 효율적입니다. 우선 seconds_behind_master·SHOW SLAVE STATUS·pt-heartbeat로 지연 지점을 파악하세요. 간단한 점검 체크리스트 예: seconds_behind_master 확인 → SHOW SLAVE STATUS로 스레드와 에러 확인 → pt-heartbeat로 실제 지연 측정. 이 절차는 MySQL 복제 지연 증가 시 원인 추적과 동기화 대책 수립에 도움이 됩니다.
- 쿼리: SHOW PROCESSLIST로 블로킹 쿼리를 확인합니다. slow_query_log와 performance_schema로 무거운 쿼리나 풀스캔을 찾아내세요. INFORMATION_SCHEMA.INNODB_TRX로 장기 트랜잭션과 락 대기를 추적하고, binlog 이벤트 크기도 점검합니다.
- 리소스: iostat·vmstat·sar로 디스크 I/O, CPU, 메모리 병목을 진단합니다. ioping으로 디스크 응답 시간(지연)을 측정하세요. InnoDB 버퍼풀의 더티 페이지 비율과 fsync 대기 현상도 확인해야 합니다.
- 네트워크: ping, mtr, iperf로 RTT·패킷 손실·대역폭을 점검합니다. netstat와 tcpdump로 연결 재시도나 대기 상태를 확인하고, MTU 및 중간 장비의 재전송 동작도 살펴보세요.
- 설정: binlog_format, sync_binlog, innodb_flush_log_at_trx_commit, slave_parallel_workers, net_write_timeout 등 설정이 불일치하거나 값이 낮은지 점검합니다. GTID 사용 여부와 relay_log 관련 문제도 확인해야 합니다.
실전 트러블슈팅 체크리스트 — 빠르게 원인 좁히기
- 프로세스 우선 확인 —
ps aux | grep mysqld로 MySQL 프로세스가 실행 중인지 확인하고,SHOW SLAVE STATUS\G로 IO/SQL_THREAD 상태와 Seconds_Behind_Master 값을 점검합니다. - 로그 점검 — 최근 에러 및 relay 관련 로그(
/var/log/mysql/error.log)와 슬로우로그를 살펴 대형 트랜잭션이나 반복 에러를 찾아보세요. relay 로그 손상이나 파일 권한 문제도 확인합니다. - 디스크/IO —
iostat -xm 1 3의 %util과 await 상승을 확인합니다. 디스크 포화로 인한 I/O 대기 증가가 흔한 원인입니다. - 네트워크 캡처 —
tcpdump -n host MASTER_IP and port 3306로 패킷 손실·재전송·지연을 점검하세요. MTU 불일치나 방화벽 정책도 의심해야 합니다. - 레플리케이션 지연 측정 —
pt-heartbeat --check또는 heartbeat 테이블을 이용해 애플리케이션에서 관측되는 지연과 DB 내부 lag을 비교합니다. - 빠른 조치 가이드 — I/O 병목이면 쓰기 제한 적용이나 I/O 스로틀링, 네트워크 문제면 라우팅·경로 재구성; 큰 트랜잭션이 원인일 경우 즉시 작업을 중단하고 트랜잭션을 분할한 뒤 슬레이브를 재동기화하세요. 실무 체크리스트(예): 대량 배치 발생 시 — ① 배치 중지 ② 트랜잭션을 작게 쪼개 적용 ③ 슬레이브 적용률과 Seconds_Behind_Master 모니터링. 긴급 대응 시에는 MySQL 복제 지연 증가 시 원인 추적과 동기화 대책을 우선 순위로 두십시오.
즉시 동기화 대책(단기) — 신속하고 안전하게 복제 회복하기
복제 지연이 심해졌다면 신속하면서도 안전한 복구가 핵심이다. 복제 중단(예: stop/skip)은 최후의 수단으로만 고려하라. 단일 트랜잭션 오류라면 STOP SLAVE 후 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1로 건너뛸 수 있으나, 이 경우 데이터 불일치 위험이 있음을 반드시 인지해야 한다.
- pt-table-sync 사용: 테이블 차이를 확인한 뒤
--chunk-size와--txn-size로 작은 단위로 동기화한다. 실행 전에는--dry-run으로 영향 범위를 검증하라. - 복제 병렬화: replica_parallel_workers(또는 slave_parallel_workers) 값을 높여 적용 속도를 개선한다. 이때 로그 순서와 락 경쟁을 주의 깊게 모니터링해야 한다.
- 일시적 읽기 차단 주의: 대량 동기화나 DDL 적용은 읽기 지연이나 차단을 유발할 수 있다. 낮은 우선순위나 스로틀링을 사용하고, 오프피크 시간대에 실행하는 것을 권장한다.
- 대규모 불일치 시: pt-table-sync 대신 스냅샷을 이용한 재동기화(복제 재설정)를 검토하라. 실무 체크리스트: 영향 테이블 식별 → 스냅샷 생성 및 검증 → 복제 재설정 후 데이터 무결성 확인. 자세한 절차는 'MySQL 복제 지연 증가 시 원인 추적과 동기화 대책'을 참고하라.
장기적 예방과 운영 전략 — 설계·모니터링·자동화
- 모니터링·알림: Replica lag(ms), Seconds_Behind_Master/Replica, IO/SQL 스레드 상태, 디스크 I/O, 그리고 binlog 디렉토리 용량을 수집한다. 알림은 임계치 기반으로 구성하되(예: lag > 10s가 5분 이상 지속), Runbook 링크를 포함해 Slack이나 PagerDuty로 즉시 전송하도록 자동화한다. 체크리스트: 임계치, 담당자 연락처, Runbook 경로를 정기적으로 검증한다.
- 스키마 변경 정책: 온라인 DDL(gh-ost, pt-online-schema-change)을 사용하고, 변경 전 영향 분석과 테스트를 수행한다. 점진적 배포와 트래픽 셰이핑을 적용하며, 롤백 플랜을 반드시 문서화한다.
- binlog 설정: binlog는 ROW 포맷을 권장한다. sync_binlog=1과 innodb_flush_log_at_trx_commit을 적절히 조정해 일관성을 확보하고, GTID를 활성화한다. expire_logs_days와 max_binlog_size를 설정해 보존을 관리한다.
- 재해복구 계획: 정기적으로 전체 및 증분 백업을 수행하고 PITR을 확보한다. 복구 절차와 RTO/RPO를 명확히 정의하며, DR 리허설을 통해 절차와 자동화를 검증한다. 복제 토폴로지(멀티-리전, 비동기·반동기 혼합)를 설계에 반영한다.
- 자동화·운영: 자동 재가입과 슬로우다운 임계치 기반의 리플리케이션 제어를 도입한다. Orchestrator 같은 오케스트레이터로 장애를 탐지하고 자동 복구한다. 지표에 기반한 스케일링과 정기적인 검증 작업도 스케줄링한다. 이와 같은 운영 자동화는 MySQL 복제 지연 증가 시 원인 추적과 동기화 대책을 빠르게 실행하는 데 도움이 된다.
경험에서 배운 점
복제 지연이 커질 때 흔한 원인은 장시간 실행 쿼리나 대용량 배치, 디스크 I/O·네트워크 병목, 복제 스레드(I/O/SQL)의 중단 또는 하나의 대형 트랜잭션입니다. 운영상 실수로는 seconds_behind_master 수치만 보고 판단하거나 복제 상태와 호스트 자원(디스크·CPU·컨테이너 리소스 제한)을 함께 점검하지 않는 경우가 많습니다. 결론적으로, 단순 숫자 경보에 의존하지 말고 복제 스레드 상태·트랜잭션 대기·리플리케이션 헬스(헬스비트)·호스트 자원을 동시에 빠르게 확인하는 표준 절차를 마련해야 합니다. 또한 MySQL 복제 지연 증가 시 원인 추적과 동기화 대책을 문서화해 두면 대응 속도와 일관성이 높아집니다.
실무 체크리스트(긴급 진단·단기 대응·재발 방지 중심):
- 긴급 진단: SHOW SLAVE STATUS\G (또는 SHOW REPLICA STATUS)로 Replica_IO_Running/Replica_SQL_Running과 Last_IO_Error/Last_SQL_Error를 확인하되, seconds_behind_master의 한계를 이해합니다.
- 쿼리 진단: 복제 서버에서 SHOW PROCESSLIST/INFORMATION_SCHEMA.PROCESSLIST로 장시간 쿼리와 잠금을 파악하고, 필요하면 해당 쿼리를 신중히 중단합니다.
- 리소스 확인: iostat, vmstat, 네트워크 지연/대역폭, 디스크 사용량·IOPS, 컨테이너 cgroup 제한 등을 점검합니다.
- 사례: 예를 들어 야간 대량 INSERT 배치가 복제 스레드를 정체시켜 seconds_behind_master가 급증한 경우, 배치를 분할하고 병렬 복제를 조정해 지연을 해소한 경험이 있습니다.
- 로그/포맷 점검: relay log 크기, Binlog 포맷(row vs statement), GTID 상태, 스키마 변경 중인 테이블 여부를 확인합니다.
- 단기 대응: 원인을 파악한 뒤 리플리케이션 스레드를 재시작하거나, 병렬 복제(slave_parallel_workers) 수를 조정하고 큰 트랜잭션은 분할하거나 배치 실행을 재스케줄링합니다.
- 동기화(재동기화) 옵션: 논리 덤프보다 xtrabackup·파일 레벨 복사 같은 증분·일관성 있는 방법을 우선 고려하고, pt-table-sync은 소규모 불일치 정리에 적합합니다. 복구 전에는 반드시 백업과 체크섬 검증을 수행하세요.
- 재발 방지: 헬스비트(pt-heartbeat 또는 커스텀 타임스탬프)로 실체 랙을 모니터링하고, 경보는 임계값과 스레드 상태(IO/SQL)를 함께 기준으로 설정합니다. 스키마 변경·백업·대용량 작업은 운영 절차(창구화·다중 승인)로 통제합니다.
- 운영 정책: 대형 트랜잭션 제한, 배치·아카이브 작업 스로틀링, 장애 복구(프로모션) 플레이북과 주기적 복제 무결성 검사를 포함한 정책을 마련합니다.
댓글
댓글 쓰기