Rest API서버와 DB서버가 각기 다른 서버에서 운영되는건 매우 흔한일이며
지극히 정상적인 일이라고 볼수있다.
서비스의 규모가 절대로 커질일이 없는것이 아니라면 일단은 분리하는게 좋다는 생각이다.
그럼에도 개발속도와 편의성 측면에서 한 서버에서 API서버와 DB를 운영하고는 하는데 (제가 그랬습니다...)
두 서버를 분리시키고 데이터 마이그레이션하는 방법에대해 소개하도록 하겠습니다.
1. DB서버 생성 및 몽고 환경 셋업
이 부분에서 사실 제일많은 시간비용이 소모됩니다.
왜냐면 1~10까지 구구절절 설명해주는 자료가 많이 부족하기 때문이죠.
아래와 같은 작업을 해야합니다.
1) EC2환경설정
2) 몽고디비 설치
3) 몽고디비 실행
4) 몽고디비 관리자 계정 설정 및 readwrite계정 추가
5) .conf파일 수정
6) 몽고디비 재실행
7) DB서버에 연결 테스트
8) 데이터 덤프 및 마이그레이션
1) EC2환경설정
여기서 할것은 보안그룹설정인데요
몽고의 기본포트인 27017포트를 개방해줍니다.
2) 몽고디비 설치
각 OS마다 설치방법은 다르지만, 설치와 관련해서는 Mongo에서 매우 친절하게 안내해주고있으니 참고하시기 바랍니다
docs.mongodb.com/manual/installation/
3) 몽고디비 실행
실행, 정지, 재실행, 상태확인에 대해서 간단히 명령어를 알아보도록 하겠습니다.
두가지 버전이 있는데요, systemctl / service 두개의 키워드를 통해 가능합니다.
(실행) stystemctl start mongod
(중지) systemctl stop mongod
(재실행) systemctl restart mongod
(상태확인) systemctl status mongod
일단 설치했으면 실행해줍니다.
systemctl status mongod 를 입력해 정상적으로 동작중이며, mongo를 입력했을때 몽고디비로 진입된다면
잘 설치 및 실행되었다고 볼 수 있습니다
4) 몽고디비 관리자 계정 설정 및 readwrite계정추가
여기서 많이 헤매게됩니다.
기본적으로 로컬에 있는 몽고에서는 해주지않아도 되는데 (단, 하지않았을때 보안의 위험이있습니다)
리모트 서버의 DB에 연결하려면 반드시 계정설정을 해주어야됩니다.
외부에서 연결을 요청하면 몽고에서 사용자 권한을 확인하기 때문입니다.
먼저, 관리자 계정을 생성해주어야합니다.
관리자 계정이란 정말로 슈퍼어드민을 의미하며 DB를 드랍,추가 하는것까지 가능하니 계정관리에 주의해야합니다.
몽고에는 기본적으로 admin이라는 db가 생성되어있는데요. 다음과 같은 절차를 밟도록 하겠습니다.
가) admin db 사용: use admin
나) 어드민 계정 생성: db.createUser({ user: 'admin', pwd: '패스워드', roles: [{ role: 'root', db: 'admin' }] })
다) 생성된 계정 확인: db.getUser('admin')
라) 일반 readwrite계정 생성: db.createUser({ user: 'manager', pwd: '패스워드', roles: [{ role: 'readWrite', db: 'myFirstDb' }, { role: 'readWrite', db: 'mySecondDb' } ] })
마) 생성된 계정 확인: db.getUser('manager')
5) .conf 파일 설정
거의 다 왔습니다. 리모트에서 연결해주기 위해서는 보안설정을 셋업한 상태로 몽고를 실행해주어야만 합니다.
방법은 두가진데요. 제가 확실히 말씀드릴수 있는건 .conf 파일 설정이니 이것을 따르시길 추천드립니다.
mongod.conf 파일은 기본적으로 /etc/mongod.conf 경로에 생성됩니다.
몽고를 설치했지만 해당위치에 mongod.conf파일이 보이지 않는다면 찾아보시기 바랍니다.
mongod.conf 파일에서 아래의 파트를 정확하게, 아주 똑같이 작성합니다.
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
(mongod --auth 라는 방법도 있다는데 제가 확신할수없어 아주 개인적으로 권장하지 않습니다.)
여기서 0.0.0.0은 모든 IP에서의 요청을 받겠다는 의미인데, 보안계정을 생성해주었으니 믿고 가도록 합니다.
API서버 주소인 13.x.x.x,192.x.x.x 등을 입력할수도 있다고 하지만 에러가 나는 경험을 했습니다.
관련하여 아시는 분이 있다면 댓글 부탁드립니다.
6) 몽고디비 재실행
systemctl restart mongo
재실행 했다면 반드시 상태도 확인해주세요
systemctl status mongo
여기까지 잘 되셨나요?
7) DB서버에 연결 테스트
자, 대망의 연결 테스트입니다.
로컬 서버에서 테스트하셔도 전혀 무방합니다.
연결 주소는 아래와 같이 작성합니다.
mongod://아이디:패스워드@도메인혹은아이피:27017/디비명
예제입니다.
mongod://manager:openpassword@cup.camil.com:27017/coffee
API서버에서 직접 연결을 체크해봐도 좋고
MongoBB Compass같은 툴을 통해 연결을 시도해 봐도 괜찮은 방법입니다.
후자의 경우 다른 코드에서 발생하는 에러와 분리하여 테스트할 수 있다는 장점이 있습니다.
8) 데이터 덤프 및 마이그레이션
여기는, 기존의 DB가 있는경우에만 진행해주시면 됩니다.
기존의 API서버에서 먼저 데이터를 덤프하는데요, 덤프란 기존의 데이터를 백업하기위해 카피한다고 생각하시면 됩니다.
BSON 타입으로 하는방법과 JSON 타입으로 하는방법 2가지가 있는데요.
여기서는 속도가 더 빠르다고하는 BSON 타입을 채택하여 진행하도록 하겠습니다.
아래의 명령어를 사용하면 내 현재 위치(경로)에 dump라는 폴더 내에 데이터가 덤프가 됩니다.
mongodump --host 127.0.0.1 --out /data/db/backup
덤프된 데이터를 FileZila와 같은 프로그램을 이용해 새 DB서버로 이전해줍니다.
이 때, 덤프된 파일들을 어디로 이전하는지 정확히 위치를 체크하도록 합니다.
* /home/root/ 정도의 경로에 backups폴더를 생성하여 이전하는것을 추천드립니다.
데이터를 옮겼다면, 콘솔에서 해당 경로로 이동합니다.
위와 같이 했다면
cd /home/root/backups
가 되겠죠?
마지막입니다. 데이터 마이그레이션을 진행해주면 되는데요, 지금 디비가 텅텅 비어있으니 간단히 처리할 수 있습니다.
단, 진행 전 잠시 mongod.conf 파일의 security파트를 주석처리 하도록 합니다.
#security:
#authorization: enabled
systemctl restart mongo
systemctl status mongo
몽고의 상태가 정상이라면 마이그레이션을 진행합니다.
mongorestore --host 127.0.0.1 --port 27017 --db 복구하려는 db명 덤프된 디렉터리 위치
예제입니다.
mongorestore --host 127.0.0.1 --port 27017 --db coffee ./coffee
*********** 수정***********
덤프될 디렉터리 위치를 잡을 필요없이 간단히 아래와 같이 복원가능합니다.
mongorestore -d db db
************************************
정상적으로 마이그레이션 됐는지를 먼저 체크해볼까요?
mongo
show databases
>> coffee DB가 존재하나요?
use coffee
show collections
>> collection들은 잘 이전되었나요?
잘 되었다면 다시 security설정을 해줍니다.
security:
authorization: enabled
systemctl restart mongo
systemctl status mongo
============================
고생하셨습니다. 여기까지입니다.
이 글이 몽고 원격 연결 및 마이그레이션의 성지가 되기를 바라며
부족한 글 많은 분들의 댓글로 꽉꽉 채워지기를 바라겠습니다.