Mongo Replica 설정 도입을 함으로써 생겼던 이슈의 원인 및 해결 과정에 대해 정리해보겠습니다~ 😁
💙 이슈 관련 개발건
Mongo DB Replica 설정하는 스크립트를 개발하였다.
[상황]
- 기존에는 Mongo 에 데이터를 넣는 부분들이 Loopback API 를 통해 동작하도록 되어 있어, Mongo 트랜잭션을 직접적으로 적용할 필요가 없었다.
- 신규로 추가되는 기능에서 데이터 정합성이 중요하여, 이를 보장하기 위해 트랜잭션 도입이 반드시 필요했다.
[개발 방향]
- 공식 문서를 확인해보니 트랜잭션은 Mongo Replica 설정이 된 상태여야만 기능이 정상 동작하도록 되어있었다.
- 따라서 Mongo 에 Replica 설정이 되어 있지 않은 경우에는 Replica 설정을 하고 넘어가도록 스크립트를 개발했다.
여러 사정으로 인해, 자체 테스트만 진행된 채로 급하게 패치하게 되었다.. (사건의 시작.. 😄)
📌 이슈 히스토리
1. 최초 발생 시점 : 고객사 패치
- 일시 : 2025.05.20 (화) 15:30 ~ 18:00
- Mongo Replica 설정 스크립트 실행 단계에서, 설정 중 뭔가 꼬인 흔적이 보임.
- Mongo 는 켜져 있으나, 거의 모든 명령이 막힌 상태로.. 정상 동작하지 않음.
2. 이슈 대응
- Mongo Shell 연결하여 rs.initiate 다시 시도했으나, 그마저도 꼬여 Mongo 접속 자체가 불안정해짐.
- Mongo 히스토리 삭제 후, 127.0.0.1 로 rs.initiate 하며 임시조치함.
- 날아간 데이터는 기존에 백업해둔 데이터로 복구함
🚧 삽질
(삽질의 흔적 ..ㅎㅎ..)
추측 1) "Mongo 가 자기 자신을 dbserver 로 인식하지 않았기 때문? "
- 예상 시나리오
1. rs.initiate() 할 때, dbserver:20771 로 등록함.
mongo --port 20771 --eval 'rs.initiate({
_id: "rep0",
members: [{ _id: 0, host: "dbserver:20771" }]
})'
2. mongo 는 자기 자신이 dbserver 가 아니라고 판단함. ("db.isMaster().me" ≠ "rs.initiate().host")
3. 따라서, Replica Set에 자신을 포함하지 않음.
위 내용이 /etc/hosts 나 ip addr 순서와 연관된 것 같아, 아래와 같이 테스트 진행해봄.
1. ip addr, /etc/hosts 에서 ip 하나 삭제 후, replica 설정 시도 👉 재현 실패
2. ip addr 에서 ip 순서 변경 후, replica 설정 시도 👉 재현 실패
#ip 변경 명령어
ip addr del 10.0.37.41/24 dev ens32
ip addr add 10.0.37.51/24 brd 10.0.37.255 dev ens32
ip addr del 10.0.37.51/24 dev ens34
ip addr add 10.0.37.41/24 brd 10.0.37.255 dev ens34
ip route add default via 10.0.37.1 dev ens32 metric 100
ip route add default via 10.0.37.1 dev ens34 metric 101
재현 실패함에 따라, 위 내용으로 인한 문제가 아닌 것으로 판단함.
이대로는 답이 없을 것 같아서 ㅋㅋㅋ 로그 분석부터 다시 시작함.
🔥 로그 분석 & 원인 파악

기존 Mongo 스크립트는 인증 없이 먼저 사용자 계정 존재 여부를 확인한 뒤, Mongo를 종료하고 --auth 옵션을 활성화하여 재실행함으로써, 인증을 거쳐야만 접속할 수 있도록 동작하고 있다.
나는 mongo 종료 전에 replica 확인 및 설정 로직과 sleep 5 를 추가해두었다.
여기서,, replica 설정이 끝나기 전에 mongo 스크립트 내에서 kill -9 로 mongo 를 종료해버리는 부분이 문제가 되었다.
다른 고객사들은 5초 내 replica 설정이 운좋게 잘 끝나, 다시 켜질 때 정상 적용된 상태였던 거고, 이 고객사는 데이터가 많고 cpu 사용량이 높아 replica 설정이 다 완료되지 않은 채로 강제 종료되어,, 설정이 꼬이게 된 거였다.
- 한 줄 요약 : replica 설정 중 stop 명령어 실행되며 kill -9 으로 강제 종료되어 문제 발생
(그 이후에는 이미 내부 상태가 꼬였다고 판단하여, 설정 시도 반복해도 안됨)
💚 해결
- mongo 에서 권장하는 방식으로 mongo 프로세스를 종료하도록 스크립트 수정
db.shutdownServer()
💙 느낀점
mongo 로그에 접근하기 어렵고, 불필요한 데이터가 많아 더 시간이 걸렸던 것 같다.
ip addr 에 꽂혀서 더 시간이 걸리기도 했던 것 같은데, 로그 중심으로 분석하는 데에 더 집중하면 좋을 듯 하다.
웹은 로그 보고 잘 따라가면서,, 이번에 기본적인 걸 좀 놓쳐서 아쉽기도 했다.
그래도 그만큼 mongo replica 에 대해 더 공부할 수 있었으니, 좋게 생각하면 될 것 같다. ㅎㅎ 앞으로 잘 개선해보자!
'📑성장 일기' 카테고리의 다른 글
| [공지] 신입 일기에서 성장 일기로 변경합니당. (0) | 2025.09.22 |
|---|---|
| [신입일기 - 100주차] 자동 로그인과 다국어 (2) (1) | 2024.11.27 |
| [신입일기 - 99주차] 자동 로그인과 다국어 (1) | 2024.11.26 |
| [신입일기 - 98주차] 계속 이어지는 인터럽트.. 😊 (0) | 2024.11.22 |
| [신입일기 - 97주차] 계속 수정 😊 (0) | 2024.11.21 |