MongoDb migration 기록
상황: 서버 머신 한대가 자꾸 죽어서 더 안정적인 머신으로 데이터와 데몬 이전
작업 계획:
1. 서버A (old) 에서 서버B로 mongodump로 데이터 수동으로 복제
2. 이후 서버B를 서버A의 replica로 등록하면 데이터 싱크됨
3. 적절한 시점에 서버B를 primary로, 서버A를 secondary로 만들고
4. 서버A는 자연사 할 때 까지 굴리면서 read only replica로 사용
* 서버A에 접속 후 다이렉트로 mongodump -u --out=$HOME/mongo.d 시전
* 이러면 알아서 전에 덤프한다.
* --db를 붙이라는 자료도 있는데 이러면 restore할 때 문제가 있었다.
* 왜 문제인진 정확히 모르겠고, 서버A는 mongodb5, 서버B는 mongodb6이라 그랬던가? 원인을 정확히 파악하기 귀찮다. 에러메시지도 이제와서 남아있진 않네 ㄷㄷ
* 여튼 버전간의 차이는 우려와 달리 무사히 되었다.
그리고 서버A를 버전업 했다. replica하려는데 버전간 차이가 있어서 안 됐기 때문.
그런데... 서버A가 버전5이던 시절에 replica 세팅을 만들어 둔 탓에 문제가 발생함.
rs.status() 로 보면 서버 B가 계속 RECOVERING이라고 뜨고 아무것도 안 됐다.
이 상태로는 서버A의 rs 세팅을 건들 수도 없었음.
우선 서버A의 /etc/mongod.conf 에 들어가서
replication:
replSetName: rs0
라고 되어있는데 이거 코멘트아웃해서 서버A를 standalone으로 만듦.
그리고 구글링 해서 rs 설정을 override해서 서버B항목 삭제.
다시 rs0 켜고 서버B를 다시 추가.
금요일 밤은 여기까지 하고 월요일이 됨.
서버 A에서 rs.stepDown() 함.
이러면 서버A는 SECONDARY가 되고 read only db가 된다.
서버 B는 자동으로 PRIMARY가 됨.
이후 mongodb를 사용하는 클라이언트들은 (human user들의 NoSqlBooster나, cron job들) 서버B로 접속하게 차차 접속 정보를 수정하면 됨.
이후 일어난 일:
* 이 구성은 서버가 홀수 대수이다. 둘 중 하나가 뻗으면 mongodb가 readonly로도 접속이 안 됨.
* 홀수대로, 아비터를 도입을 하느냐, replica하나 더 만드느냐 문제가 됨.
* 결국 불안정한 replica를 제거함. production에서 쓰는 mongodb도 아니고 개발 용도여서.