문제 발견
최근에 사내에서 호스팅하는 서버 중 하나에 접근이 안되어서 서버를 확인해보니 해당 서버 내의 MongoDB 서버가 일정 주기로 다운되는 현상을 발견했다. 문제 원인을 찾기 위해서 mongodb 로그를 확인해보니 다음과 같은 에러 메시지가 있었다
참고 환경: ubuntu 22.04 os
# mongod.log의 최근 내역 확인
sudo tail -n 100 /var/log/mongodb/mongod.log
...
Failed to write to interim file buffer for full-time diagnostic data capture: /var/lib/mongodb/diagnostic.data/metrics.interim.temp
Actual exception type: mongo::error_details::ExceptionForImpl<(mongo::ErrorCodes::Error)39, mongo::AssertionException>
...
디스크 용량을 확인해보니 충분했지만, /var/lib/mongodb/diagnostic.data 디렉토리에 저장되는 메트릭(metric.*) 파일과 관련하여 내부 버퍼 쓰기 실패가 발생한 것으로 보였다.
원인 분석
원인을 찾아보니 MongoDB는 FTDC(Full-Time Diagnostic Capture)라는 성능 통계 수집 기능을 기본값으로 사용하는데, 이 때 데이터를 임시파일인 /var/lib/mongodb/diagnostic.data/metrics.interim.temp 에 쓰기 시도하다가 쓰기 실패하여 MongoDB가 비정상 종료되었던 것으로 추정된다.
MongoDB는 매 1분 주기로 메트릭 파일을 기록하는데, 내부 버퍼에서 metrics.interim.temp로 플러시(flush)하는 과정에서 오류가 발생하면 MongoDB 전체 프로세스를 강제 종료시킨다고 한다.
조치 사항
- 비정상 파일 정리
우선 비정상적으로 생성된 metric 파일들을 정리해 주었다.
sudo find /var/lib/mongodb/diagnostic.data -type f -delete
- 자동 정리 스크립트 설정
이벤트 스케쥴러(crontab)에 진단 데이터 디렉토리의 파일들을 주기적으로 정리하도록 명령어 추가
# 매일 새벽 3시에 3일 이상된 메트릭 파일들을 삭제
0 3 * * * find /var/lib/mongodb/diagnostic.data -type f -name 'metrics.*' -mtime +3 -delete
- mongod 서비스 파일 설정 override
MongoDB 서비스가 비정상 종료되었을 때 자동으로 재시작하도록 설정파일을 override함
# 만약에 mongod.service.d 디렉토리가 없다면 생성
sudo mkdir -p /etc/systemd/system/mongod.service.d
# override 설정파일 생성 및 수정
sudo nano /etc/systemd/system/mongod.service.d/override.conf
다음의 내용을 추가
[Service]
Restart=always # 비정상 종료 시 항상 재시작
RestartSec=10 # 재시작 전 10초 대기
설정을 적용
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart mongod
설정 적용을 확인
systemctl show mongod | grep -E 'Restart|RestartSec'
출력 결과를 확인함

위와 같이 조치하였다. 진단 데이터 디렉토리의 관리와 자동 재시작 설정이 핵심인듯...
'개발 일상' 카테고리의 다른 글
| 대량의 파일, 효율적으로 압축 & 전송하기 – 우분투 기반 백업 최적화 (2) | 2025.06.02 |
|---|---|
| [python] data.dict() vs jsonable_encoder(). 그리고 datetime 쿼리 삽질기 (0) | 2025.05.26 |
| MongoDB Aggregation을 활용한 통계 API 구현(python) (1) | 2025.05.22 |
| [React.js] setTimeout 사용 시 최신 상태(state)가 반영되지 않는 이슈 처리 (0) | 2025.04.07 |
| Ubuntu의 crontab에서 GUI 프로그램 실행 스케쥴 등록하기(ubuntu 22.04 기준) (0) | 2022.11.04 |
