주기적인 MongoDB 서비스 Down 증상 해결

2025. 5. 19. 18:30·개발 일상

문제 발견

최근에 사내에서 호스팅하는 서버 중 하나에 접근이 안되어서 서버를 확인해보니 해당 서버 내의 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 전체 프로세스를 강제 종료시킨다고 한다.

조치 사항

  1. 비정상 파일 정리

우선 비정상적으로 생성된 metric 파일들을 정리해 주었다.

sudo find /var/lib/mongodb/diagnostic.data -type f -delete
  1. 자동 정리 스크립트 설정

이벤트 스케쥴러(crontab)에 진단 데이터 디렉토리의 파일들을 주기적으로 정리하도록 명령어 추가

# 매일 새벽 3시에 3일 이상된 메트릭 파일들을 삭제
0 3 * * * find /var/lib/mongodb/diagnostic.data -type f -name 'metrics.*' -mtime +3 -delete
  1. 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'

출력 결과를 확인함

설정이 적용되었는지 확인(mongod service)

위와 같이 조치하였다. 진단 데이터 디렉토리의 관리와 자동 재시작 설정이 핵심인듯...

저작자표시 (새창열림)

'개발 일상' 카테고리의 다른 글

대량의 파일, 효율적으로 압축 & 전송하기 – 우분투 기반 백업 최적화  (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
'개발 일상' 카테고리의 다른 글
  • [python] data.dict() vs jsonable_encoder(). 그리고 datetime 쿼리 삽질기
  • MongoDB Aggregation을 활용한 통계 API 구현(python)
  • [React.js] setTimeout 사용 시 최신 상태(state)가 반영되지 않는 이슈 처리
  • Ubuntu의 crontab에서 GUI 프로그램 실행 스케쥴 등록하기(ubuntu 22.04 기준)
레실이
레실이
  • 레실이
    레실이의 티스토리
    레실이
  • 전체
    오늘
    어제
    • 분류 전체보기 (91)
      • SE Bootcamp 내용 정리 (63)
      • 알고리즘 연습 (7)
      • Project 주저리 (4)
      • 기술 면접 source (3)
      • 개발 일상 (12)
      • 생성 AI 활용 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DOM
    CSR
    IT
    비동기
    Python
    PickAndDrink
    인증/보안
    데이터베이스
    mongoDB
    알고리즘
    state
    react
    promise
    자료구조
    JS
    fastapi
    Linux
    useState
    Ajax
    ORM
    ubuntu
    문자열
    JavaScript
    node
    node.js
    useRef
    CORS
    객체
    CSS
    MVC
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
레실이
주기적인 MongoDB 서비스 Down 증상 해결
상단으로

티스토리툴바