운영 · 자동화 · 리눅스

df는 정상이고 컨테이너도 Up인데, 이틀째 아무것도 안 만들어지고 있었다

실패 알림은 오지 않았다. 실패한 적이 없기 때문이 아니라, 실패를 아무도 세고 있지 않았기 때문이다.

자동 업로드가 안 되는 것 같다는 신고를 받고 들여다봤습니다. 겉으로 보이는 것은 전부 정상이었습니다.

그런데 산출물이 이틀째 하나도 없었습니다.

죽은 마운트

커널 로그가 답을 갖고 있었습니다.

usb 4-1: USB disconnect, device number 2
EXT4-fs (sdb1): I/O error while writing superblock
Aborting journal on device sdb1-8.
usb 4-1: new SuperSpeed USB device number 3

USB 외장 디스크가 순간 끊겼다가 즉시 다시 붙었습니다. 커널은 옛 장치 노드를 오프라인 처리하고 새 노드로 재등록했는데, 마운트 지점은 여전히 죽은 옛 노드를 가리키고 있었습니다.

결과는 껍데기 마운트입니다. df는 마운트 테이블을 읽으니 멀쩡한 용량을 보여 주고, 실제로 그 경로에 접근하면 전부 I/O 에러가 납니다. 상태를 묻는 명령과 실제로 써 보는 것이 다른 답을 냅니다.

여기 얹혀 있던 작업 10개가 한꺼번에 죽었습니다. 특히 취약했던 하나는 설정 모듈이 import 시점에 출력 디렉터리를 만들고 있어서, 스크립트 첫 줄에서 크래시했습니다. 무엇을 만들지 정하기도 전에 죽은 겁니다.

왜 이틀이나 몰랐나

실패 알림이 없었기 때문입니다. 그런데 더 정확히 말하면, 애초에 실패를 세는 장치가 없었습니다.

이런 배치를 만들 때 흔히 성공 경로만 생각합니다. 로그는 쌓이고 있었고 트레이스백도 남아 있었지만, 로그는 누가 읽어야 정보가 됩니다. 매일 아침 로그를 열어 보는 사람은 없습니다.

그래서 감시 기준을 바꿨습니다. 작업이 성공했는지가 아니라, 산출물이 실제로 생겼는지를 봅니다.

마지막 항목이 중요합니다. "알림이 안 온다"는 두 가지를 뜻합니다. 다 잘 돌고 있거나, 감시기가 죽었거나. 둘을 구분할 수 없으면 감시기는 없는 것과 같습니다.

가져갈 것

다른 제작 노트