2023. 3. 19. 00:00ㆍmongodb
0. 서론
Mongodb는 왠만해서 에러가 나지 않는다. 하지만 나면 좆된다.
나는 종종 몽고디비의 에러를 본적이 있다.
그 중 가장 겁나는건, 재부팅 실패에러이다..
IT기계들은 껐다 켜면 모든 고장이 풀린다는 어르신들의 말씀은 거진 틀린적이 없다.
하지만, 그 기계가 꺼지가 안 켜지면...??
좆된거다!!
Mongodb에서 종종 그런 현상을 발견했다.
오늘은 그 사례와 조치 방안에 대해서 알아보겠다.
100프로 내 이야기다 ㅎㅎ
1. 사연 - reindex 했더닌 좆되었어요 ㅎㅎ
슬픈 사연이였다. mongodb가 용량을 반환하지 않아, 반환방법을 찾던 중 mongodb index를 재 생성하는 명령어를 날렸다.
용량과 인덱스가 무슨 관계냐고 할 수 있겠지만, database에서 index는 꽤 많은 용량을 잡아 먹는다.
그리고!!! reindex를 하면... 혹시 delete 해도 반환 되지 않는 용량이...반환될까 하는 작은 희망에 해당 명령어를 날렸다.
하지만, 이 명령어... 커다란 문제가 있다.
바로 운영중에 날리면, database가 락이 걸리는 것이다.
당시 database는 운영 중이 였고, 모든 서비스는 명령어와 함께 중단되었다.
그래서 당시 담당자인 나는 맨붕이 왔다.
그래서 reindex가 끝나길 기다리지 못하고... 강제 종료 후, 재부팅 하기로 마음 먹는다.
그리고 날린 명령어는... sudo kill -9 mong...o..........
그 후, 그 mongodb를 본 사람은 없었다.
당시 나는 참 멍청했다..
모든 it 기기의 고장 원인 중 하나가.. 비정상 종료라는걸...
mongodb는 비정상 종료에 취약하다..
2. 에러 내역 및 삽질 내역
{"ok": 0, "errmsg": "Found an open, non-mongod.lock file in the data directory /data/db. Please ensure no other instances of MongoDB are running.", "code": 72}
딱 봐도 mongodb가 lock 걸렸다는 내용이다.
쉬워보이지만 어려운 에러이다.
운영중에 database가 락이 걸린 것을 봤어도, 종료된 database가 lock 이라니..??
이 새끼 살아있는거 아니야??
그리고 열심히 ps -ef | grep mongo 를 했지만, 돌아오지 않는 메아리였다.
그래서 처음 생각나는 조치는 바로 mongodb 재 설치!!
mongodb에서 데이터를 남기고, 프로그램만 지울 수 있다.
그래서 mongodb의 데이터를 남기고, 단순 프로그램만 재설치 했다.
하지만 mongodb는 살아나지 못했다...
등줄기에 식은땀이 나기 시작했다..
3. 찾은 해답..
rm -r mongod.lock
바로 mongod.lock file 삭제 이다.
이 조치는 재부팅 만큼 무서운 조치다.
당시 나는 mongodb에 있는 모든 데이터를 걸고, 해당 파일을 지웠다.
그리고 나는 무사히 현재도 그 회사를 잘 다니고 있다.
3-1. 여기서 mongod.lock 파일이란?
mongod.lock 파일은 MongoDB의 락 파일이며, MongoDB가 실행 중인 데이터베이스 디렉토리에 저장된다.
이 파일은 현재 MongoDB 인스턴스가 데이터 디렉토리를 독점적으로 사용하고 있음을 나타낸다.
즉, 데이터베이스의 일괄성을 유지해주는 파일이다.
당시 나는 생각했다.
이미 죽은 mongodb인데 무슨 일괄성이야?
그냥 저거만 지우면 되는거 아니야..??
하지만, rm -r 이라는 명령어가 참 날리기 어려웠다.
그리고 몇 시간의 고민 끝에 결국 나는 sudo rm -r mongod.lock 를 날렸다.
그리고.. 재부팅이 되었다.
참고로 [sudo rm -r mongod.lock]이 명령어 잘 못 날리면 진짜 좆 될 수 있다.
퇴사 각오로 날려라..
3-2. mongod.lock 파일이 재부팅을 막은 원인
mongod.lock 파일은 MongoDB 인스턴스가 종료될 때 자동으로 삭제된다.
그러나 예기치 않은 서버 종료 또는 시스템 오류와 같은 문제가 발생할 경우, 이 파일은 삭제되지 않을 수 있다.
즉, 재부팅이 되지 않는 원인은 시스템 종료 시, mongod.lock 이 삭제되지 않아 생긴 문제이다.
주로 나같은 비정상 종료를 하면 나타나는 문제이다.
4. 해당 파일 경로
해당 mongod.lock 파일 위치는 운영 환경 마다 다르다.
하지만, 디폴트 설정이면 아래와 같다.
Linux 및 macOS: /data/db
Windows: C:\data\db
만약, 해당 경로에 없다면 mongodb config 파일을 찾아야 한다.
mongodb.config 파일에서 dbPath 값을 확인하면 된다.
5. 용기
이제 이 파일 경로랑...원인 파악도 끝났다.
해당 명령어를 날릴 용기가 필요하다.
아마 이 글을 발견했다면...
당신도 상당히 좆된 상황일 것이다.
내가 해 줄 말은..행운을 빈다...
나는 이 상황에서 살아 남았으니, 당신도 해답을 찾을 수 있을 것이다.
만약 이 조치가 성공했으면, 내 블로그 광고나 한번 눌러주길 바란다.
'mongodb' 카테고리의 다른 글
MongoDB 모니터링 명령어 ( currentOp ) (0) | 2023.03.29 |
---|---|
mongodb에서 인덱스 안 걸린 실행 쿼리 찾기( currentOp, explain 사용 ) (0) | 2023.03.28 |
Comment récupérer l'espace disque après la suppression de données dans MongoDB (0) | 2023.03.15 |
Managing MongoDB Logs with Logrotate ( Logs Delete ) (0) | 2023.03.15 |
After deleting data in MongoDB, how to reclaim disk space using the compact comm (0) | 2023.03.15 |