[신입일기] Mongo Replica 설정 실패 이슈

2025. 9. 22. 22:50·📑성장 일기

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
'📑성장 일기' 카테고리의 다른 글
  • [공지] 신입 일기에서 성장 일기로 변경합니당.
  • [신입일기 - 100주차] 자동 로그인과 다국어 (2)
  • [신입일기 - 99주차] 자동 로그인과 다국어
  • [신입일기 - 98주차] 계속 이어지는 인터럽트.. 😊
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (269)
      • 📑성장 일기 (38)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 📘 독서 (0)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    codeup
    코민이
    코드업
    오버워치
    파이썬
    스프링 부트
    충무로
    50문답
    프로그래머스
    스프링부트
    정보처리기사
    폰켓몬
    연습문제
    백준
    일기
    nodejs
    컨텐더스
    피보나치수
    til
    정처기
    찬양추천
    티스토리챌린지
    6월 목표
    코테
    행렬덧셈
    오블완
    카카오
    BOJ
    신입일기
    코린이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[신입일기] Mongo Replica 설정 실패 이슈
상단으로

티스토리툴바