새소식

반응형
MongoDB/ERROR LOG

MongoDB 에러 대응 총정리 (/etc/mongod.conf (code=exited, status=1/FAILURE))

  • -
반응형

MongoDB 에러 대응 총정리

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
/etc/mongod.conf (code=exited, status=1/FAILURE)

 

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가 종료될 수 있습니다.
  • CPUtop 또는 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. 종합 대응 요약

  1. 로그 분석/var/log/mongodb/mongod.log와 journalctl로 원인 파악.
  2. 문제 해결: 디스크, 권한, 설정, 메모리 문제를 점검하고 수정.
  3. 자동화: Python 스크립트로 모니터링 및 재시작 설정.
  4. 모니터링: 서비스 상태와 로그를 주기적으로 확인.
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.