장비가 SNMP 응답을 멈추면 자동으로 재기동하는 감시 스크립트를 cron 에 걸었다. 사람이 밤에 안 나가도 되게 하려는 것이었다.
잘 돌았고 몇 주간 아무 일도 없었다. 그게 문제였다.
Table of contents
Open Table of contents
재기동 횟수를 세어 봤다
몇 주 뒤에 다른 일로 로그를 훑다가 restart_device 기록을 봤다. dev3 가 하루에 대여섯 번씩 재기동되고 있었다.
자동 복구가 매번 성공했으니 아무도 몰랐고 지표도 잠깐 끊겼다 돌아오니 그래프에 티가 안 났다.
문제는 계속 있었고 복구가 그것을 덮고 있었는데 아무 일도 없던 것이 아니라 안 보였던 것이다.
조치가 성공했으니 알릴 이유가 없다고 봤다. 조치가 필요했다는 사실 자체가 정보였다.
조치 — 성공해도 남기는 알림
그래서 조치와 알림 둘을 나눴고 조치는 자동으로 하되 알림은 성공해도 남긴다.
밤에 안 나가도 되는 것이 이 장치의 목적이라 조치는 그대로 두고 무슨 일이 있었는지만 남긴다.
[RECOVER] dev3 응답 없음 → 재기동 → 정상 복귀 (오늘 4번째)
여기서 오늘 4번째 라는 꼬리가 특히 중요했는데 하루 한 번이면 넘어가고 네 번째면 봐야 한다.
같은 RECOVER 줄이라도 빈도가 성격을 바꾼다. 횟수가 붙어 있으면 보는 사람이 바로 판단한다.
임계를 넘으면 멈춘다
한 걸음 더 가서 재기동이 잦으면 자동 복구 자체를 멈추게 했다.
1시간에 3번 넘게 재기동 → 자동 복구 중단, 사람 호출
restart_device 를 멈추는 데는 이유가 있는데 자동 복구가 상황을 더 나쁘게 만드는 경우가 있다.
하드웨어가 손상 중인데 계속 재기동하면 더 망가지고 자료가 깨지는 중이면 깨진 채로 계속 쓴다.
원인이 외부에 있으면 재시도가 그쪽에 부하를 준다. 세 경우 모두 복구가 문제를 키운다.
계속 실패한다는 것 자체가 멈출 신호였고 세 번 해서 안 되면 네 번째도 안 될 가능성이 높다.
변경 내용 — 복구 로그 항목
복구 로그에 담을 것을 정리했다.
언제 타임스탬프
무엇을 대상 장비/서비스
왜 감지한 증상 (응답 없음/임계 초과/…)
어떻게 수행한 조치
결과 성공/실패
누적 오늘 N번째, 최근 1시간 M번째
직전 상태 조치 전에 수집한 진단 정보
앞의 다섯은 조치 자체를 적는 것이고 뒤의 둘이 새로 넣은 것인데 누적은 빈도를 직전 상태는 원인을 말한다.
복구는 증거를 지운다
마지막 항목이 특히 유용했는데 restart_device 가 돌면 증거가 날아간다.
메모리 상태와 열린 파일과 프로세스 목록이 전부 초기화되므로 조치 전에 스냅샷을 뜨게 했다.
{ ps aux; free -m; dmesg | tail -50; } > "/var/log/recover/$(date +%s).snap"
restart_device
ps aux 와 free -m 과 dmesg 를 .snap 파일로 떠 두고 restart_device 를 부른다. 파일 이름에 date +%s 를 넣어 복구 기록과 맞춰 볼 수 있게 했다.
이 .snap 파일이 없으면 왜 멈췄는지를 영영 모른다. 복구는 되는데 원인이 미궁이 된다.
판단 기준 — 복구된 것과 해결된 것
이번 일에서 남은 것이 이 구분인데 복구는 상태를 되돌리고 해결은 원인을 없앤다.
자동 복구는 앞의 것만 한다. 앞의 것만 하면서 뒤의 것을 한 것처럼 보이는 상태가 위험하다.
지표가 정상이고 알림이 없으면 아무 문제도 없어 보여서 주기적으로 셋을 보게 했다.
이번 주 자동 복구가 몇 번 있었나
어느 대상에 몰려 있나
지난주보다 늘었나
COUNT(*) 가 늘고 있으면 근본 원인이 진행 중이라는 뜻이고 복구가 성공해도 그렇다.
실제로 몇 대에 몰린 것이 이 집계에서 보여 그쪽을 손봤다. 매번 성공하는 복구가 그 대들을 가려 주고 있었다.
정리
- 자동 복구가 성공하면 문제가 있었다는 사실도 같이 사라진다
- 조치가 필요했다는 사실 자체가 알아야 할 정보다
- 조치는 자동으로 하되 알림은 성공해도 남긴다
- 알림에 오늘 몇 번째인지를 넣으면 빈도가 성격을 말해 준다
- 잦으면 자동 복구를 멈추고 사람을 부른다
- 계속 실패한다는 것 자체가 자동 조치를 멈출 신호다
- 복구는 증거를 지우므로 조치 전에
ps aux와dmesg를 떠 둔다 - 복구된 것과 해결된 것은 다르다
- 복구 횟수의 추세를 주기적으로 보면 몰려 있는 대상이 드러난다