MongoDB 에러 대응 총정리 (/etc/mongod.conf (code=exited, status=1/FAILURE))
- -
systemctl status mongod 출력 결과를 바탕으로 MongoDB가 갑자기 꺼진 문제를 분석하고 해결하는 방법을 단계별로 자세히 설명드리겠습니다.
원인 분석 방법, 조치 방법, 그리고 Python으로 자동 재시작하는 방법까지 모두!
× mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2025-03-08 13:18:42 KST; 1 day 21h ago
Docs: https://docs.mongodb.org/manual
Process: 2491485 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=1/FAILURE)
Main PID: 2491485 (code=exited, status=1/FAILURE)
CPU: 13min 3.358s

1. 원인 분석 방법
MongoDB가 갑자기 꺼진 이유를 파악하려면 로그와 시스템 상태를 점검해야 합니다. 아래 단계를 따라 진행하세요.
(1) MongoDB 로그 확인
MongoDB는 기본적으로 /var/log/mongodb/mongod.log에 로그를 남깁니다. 오류의 원인을 찾기 위해 다음 명령어를 실행하세요:
sudo cat /var/log/mongodb/mongod.log | tail -n 100
- - tail -n 100: 최근 100줄을 확인합니다. 필요하면 숫자를 조정해 더 많은 로그를 볼 수 있습니다.
- - 로그에서 "ERROR", "FATAL", "crash" 같은 키워드를 찾으세요.
- 예상 원인 예시:
- - 디스크 공간 부족: no space left on device 메시지가 보이면 디스크가 꽉 찼을 가능성이 높습니다.
- - 권한 문제: permission denied가 보이면 MongoDB가 필요한 파일에 접근하지 못한 경우입니다.
- - 설정 오류: /etc/mongod.conf 파일의 설정 문제로 실패할 수 있습니다.
- - 메모리 부족: OOM(Out Of Memory) Killer가 MongoDB를 종료했을 가능성도 있습니다.
(2) 시스템 저널 확인
systemctl status에 "journal has been rotated"라는 메시지가 있으므로, 전체 로그를 확인하려면 journalctl을 사용하세요:
sudo journalctl -u mongod.service --since "2025-03-08 13:00:00"
- --since: 문제가 발생한 시간(2025-03-08 13:18:42 KST) 직전부터 로그를 확인합니다.
- 여기서도 오류 메시지를 주의 깊게 보세요.
(3) 리소스 점검
- 디스크 공간: df -h로 디스크 사용량을 확인하세요. MongoDB 데이터 디렉토리(기본: /var/lib/mongodb)가 꽉 찼는지 확인합니다.
- 메모리: free -m으로 사용 가능한 메모리를 점검하세요. 메모리가 부족하면 MongoDB가 종료될 수 있습니다.
- CPU: top 또는 htop으로 CPU 부하를 확인하세요.
출력 결과 분석
- - Active: failed (Result: exit-code)와 status=1/FAILURE는 MongoDB가 비정상적으로 종료되었음을 나타냅니다.
- - 정확한 원인은 로그에서 확인해야 하지만, 일반적인 실패 원인은 위와 같습니다.
2. 조치 방법
원인에 따라 아래 조치를 적용하세요.
(1) 디스크 공간 부족
디스크가 꽉 찼다면, 불필요한 파일을 삭제하거나 디스크를 확장하세요:
sudo du -h /var/lib/mongodb | sort -rh | head -n 10
큰 파일을 찾아 정리합니다.
정리 후 MongoDB 재시작:
- sudo systemctl restart mongod
(2) 권한 문제
데이터 디렉토리와 로그 파일의 권한을 확인하고 수정:
- sudo chown -R mongodb:mongodb /var/lib/mongodb
- sudo chown -R mongodb:mongodb /var/log/mongodb
재시작:
- sudo systemctl restart mongod
(3) 설정 오류
/etc/mongod.conf 파일을 열어 확인:
sudo nano /etc/mongod.conf
bindIp, port, dbPath 등이 올바른지 점검하세요.
수정 후 저장하고 재시작:
sudo systemctl restart mongod
(4) 메모리 부족
dmesg | grep -i "killed"로 OOM Killer가 MongoDB를 종료했는지 확인하세요.
해결책:
Swap 공간 추가:
-
- sudo fallocate -l 2G /swapfile
- sudo chmod 600 /swapfile
- sudo mkswap /swapfile
- sudo swapon /swapfile
MongoDB 메모리 제한 설정(/etc/mongod.conf에 추가):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1 # 메모리 사용량 제한 (예: 1GB)
재시작:
sudo systemctl restart mongod
(5) 서비스 상태 확인
- 재시작 후 상태를 확인하세요:
sudo systemctl status mongod
- Active: active (running)이 나타나면 성공입니다.
3. Python으로 MongoDB 자동 재시작 구현
MongoDB가 꺼졌을 때 자동으로 재시작하려면 Python 스크립트를 작성해 모니터링 및 조치를 자동화할 수 있습니다.
예제 코드
import subprocess
import time
from pymongo import MongoClient
import logging
# 로깅 설정
logging.basicConfig(filename='mongodb_monitor.log', level=logging.INFO,
format='%(asctime)s - %(message)s')
def is_mongodb_running():
"""MongoDB 서비스 상태 확인"""
result = subprocess.run(['systemctl', 'is-active', 'mongod'],
capture_output=True, text=True)
return result.stdout.strip() == 'active'
def restart_mongodb():
"""MongoDB 서비스 재시작"""
try:
subprocess.run(['sudo', 'systemctl', 'restart', 'mongod'], check=True)
logging.info("MongoDB 재시작 성공")
return True
except subprocess.CalledProcessError as e:
logging.error(f"MongoDB 재시작 실패: {e}")
return False
def check_mongodb_connection():
"""MongoDB 연결 테스트"""
try:
client = MongoClient('mongodb://localhost:27017/', serverSelectionTimeoutMS=2000)
client.server_info() # 연결 테스트
return True
except Exception as e:
logging.warning(f"MongoDB 연결 실패: {e}")
return False
def monitor_mongodb():
"""MongoDB 모니터링 및 자동 재시작"""
while True:
if not is_mongodb_running():
logging.warning("MongoDB가 실행 중이 아님. 재시작 시도.")
if restart_mongodb():
time.sleep(5) # 재시작 후 대기
if check_mongodb_connection():
logging.info("MongoDB 정상 동작 확인")
else:
logging.error("MongoDB 재시작 후에도 연결 실패")
else:
logging.error("MongoDB 재시작 실패")
else:
if not check_mongodb_connection():
logging.warning("MongoDB 연결 문제 감지. 재시작 시도.")
restart_mongodb()
time.sleep(60) # 1분마다 체크
if __name__ == "__main__":
logging.info("MongoDB 모니터링 시작")
monitor_mongodb()
실행 방법
1. 필요한 패키지 설치:
pip install pymongo
2. 스크립트 저장: 예를 들어 monitor_mongodb.py로 저장.
3. 실행 권한 부여:
chmod +x monitor_mongodb.py
4. 백그라운드 실행:
nohup python3 monitor_mongodb.py &
5. 로그 확인:
tail -f mongodb_monitor.log
동작 설명
- - is_mongodb_running(): systemctl으로 서비스 상태를 확인합니다.
- - restart_mongodb(): 서비스를 재시작하고 결과를 로깅합니다.
- - check_mongodb_connection(): MongoDB에 연결을 시도해 정상 동작 여부를 확인합니다.
- - monitor_mongodb(): 1분마다 상태를 체크하고, 필요 시 재시작을 시도합니다.
추가 설정
sudo 권한: sudo를 비밀번호 없이 실행하려면 /etc/sudoers에 아래를 추가하세요:
your_username ALL=(ALL) NOPASSWD: /bin/systemctl restart mongod
- your_username을 실제 사용자 이름으로 변경하세요.
서비스로 등록: 스크립트를 systemd 서비스로 만들어 부팅 시 자동 실행되게 할 수 있습니다:
sudo nano /etc/systemd/system/mongodb-monitor.service
내용:
[Unit]
Description=MongoDB Monitor Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/monitor_mongodb.py
Restart=always
User=your_username
[Install]
WantedBy=multi-user.target
활성화:
sudo systemctl enable mongodb-monitor
sudo systemctl start mongodb-monitor
4. 종합 대응 요약
- 로그 분석: /var/log/mongodb/mongod.log와 journalctl로 원인 파악.
- 문제 해결: 디스크, 권한, 설정, 메모리 문제를 점검하고 수정.
- 자동화: Python 스크립트로 모니터링 및 재시작 설정.
- 모니터링: 서비스 상태와 로그를 주기적으로 확인.
'MongoDB > ERROR LOG' 카테고리의 다른 글
당신이 좋아할만한 콘텐츠
-
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017 2025.03.05
-
mongod.service - MongoDB Database Server Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) MongoDB 서비스 재시작 실패: 문제 해결 가이드 2024.08.26
-
ValueError: update only works with $ operators 2024.05.20
-
mongod.service: Failed with result 'exit-code'. 2022.07.31
소중한 공감 감사합니다
포스팅 주소를 복사했습니다
이 글이 도움이 되었다면 공감 부탁드립니다.