All
현재 Airflow 약 50개의 DAG를 운영하고 있다. 모든 DAG task 실패시 failure 콜백으로 슬랙 알람을 발송하게 설정해두었는데, 입사 이후 3개월 지켜보면서 특히 자주 오는 실패 알람이 있다는 것을 알게됐다.
알람이 잦다보니 실제 중요한 장애 알람이 묻히는 상황이 생길 것 같았다. 이를 해결하기 위해 자주 생기는 실패케이스와 개선사항을 정리하고 하나씩 적용하는 중이다.
이번 글을 시작으로 트러블슈팅 작업들을 하나씩 정리해보려 한다.
개요
•
DMS 가 정상적으로 동작하고 있는지 확인하기 위해 매시간 소스 DB와 타겟 DB의 Row 비교 & 스키마 변경 감지하는 DAG
•
모니터링 중인 DMS task는 세개로 테이블 분배는 도메인과 log 테이블 단위로 분류
•
DAG 실행 순서
◦
DMS 에러 체크 → (task1 → task2 → task3) Rows 비교 → 스키마 변경 비교
문제 및 해결
해당 DAG이 매시간 실행되서 실패 알람 또한 잦았음 (fail task 월 평균 25건)
1) DAG Run 타임아웃
•
원인
◦
dagrun_timeout=210s로 너무 짧아, 체인 실행하다보면 시간 초과로 런이 중간에 종료(SIGTERM)
•
개선
◦
DB 부하 방지를 위해 전체적으로 짧은 타임아웃을 잡은것으로 파악됨
◦
하지만 slow query 방지용으로 rows 비교 task에는 이미 1분 타임아웃이 있음
◦
task 다섯개가 직렬 실행인데 타임아웃이 너무 짧아서 정상동작 하다가도 종료되어버리는 로그가 반복적으로 나타남
◦
DAG 전체 타임아웃을 600s로 상향 조정
2) 스키마 변경 체크 Task 연쇄 실패
•
원인
◦
앞선 문제 때문에 DAG 중도 종료시 뒷 순서인 스키마 변경 체크 task 실행 되지 않음
◦
다음 회차에서 이전 스냅샷을 읽어야 하는데 존재하지 않아 연쇄적으로 실패 발생
중도 종료시 다음 task 실패 패턴
•
개선
◦
트리거 룰 변경: success → all_done
▪
이 task는 앞과 의존성이 없기 때문에, 앞 태스크 실패해도 스키마 스냅샷은 항상 실행하도록 수정
◦
더불어 S3에서 이전 스냅샷 키 존재 여부 확인 후 없으면 스킵하는 로직 추가
성과
•
한달 평균 25번 실패 알람 > 9월 개선 배포 이후 0건
•
알람 노이즈가 줄어들어 실제 장애 대응에 집중할 수 있는 환경 확보

