MongoDB에서 쉽게 데이터 옮기기

작년에 한창 텔레그램 봇이 주목받을때  같이 스터디 하는 분들과
개인 토이 프로젝트를 만든다음 공유하는 자리를 가졌었다.

나는 그때 당시에 클리앙 알뜰구매 봇 을 하나 공유했는데. http://telegram.me/hotdeal_bot

대략 Node.js 랑 MongoDB 를 이용해서 만들었었다.

사실 간단하게 웹페이지 크롤링 한다음 저장해놓고 있고 저장할때 ( 새로운놈이라고 판단되면)
봇 사용자한테 알려주는 로직인데 당시에 webhook 형태로 만드려고 ( https만 지원) 이것저것 설정을 바꾸어서 재밌게 만들었다.

이 봇이 대략적으로 지금 10개월 정도 운영중인데..
( 사용자는 500명 좀 안됨 당시에 한번 글 쓰고 나서 공유 안하는데도 계속 사용자는 조금씩 증가한다. )
채널 형태로 만들 수도 있었지만 나중에 확장성(?) 을 생각해서 봇 형태로 유지했었다.

그리고 사용자들이 내 봇한테 /noti 를 날리면 해당 유저를 등록해놓고 그 유저한테 개인 메시지 보내듯이 할 수 있어서 뭔가 더 뿌듯하기도 했고..

아무튼 히스토리는 이렇고 위 봇이 돌고있는 서버는 DigtialOcean의 가장 낮은 사양 ( 한달에 5불) 이다.

이 가상서버는 512메가의 메모리를 가지고 있는데.
최근에 클리앙도 업데이트했고 간혹가다가 Node 가 뻗는 이슈가 있어서 마음의 짐처럼  가지고 있다가 로그를 좀 살펴봤는데

뻗는 이유가 2개 였다.

1. DB 에 url을 업데이트 하고 user 정보를 업데이트 하는데 mongoDB 서비스가 갑자기 죽어 버릴때 노드가 재시작
2. 텔레그램  API를 통해 메시지를 전달할때 정의되지 않은 오류 또는 가상버서 메모리 leak이 발생해서 노드가 재시작

위 2가지 이유였는데. 일단 1번이 시급했기 때문에
digitalOcean이 아닌 fun25 란 곳의 가상서버로 mongoDB 서비스를  옮기는 작업이 필요했다. ( 여기는 메모리가 4기가. 다만 포트가 제한적이다. 1년치가 66000원 인데 이것저것 개인 프로젝트 하고 놀기 딱 좋다.
이 블로그도 fun25에서 돌고 있다. 사실 봇도 fun25에서 돌리고 싶은데.. 포트가 digitialOcean은 다 열려있어서 더 해보고싶은게 있다. )

그래서 mongoDB 의 데이터를 이전하는 찾아 봤는데 생각보다 간단해서 놀라웠다.

우선 해당 서버에서 아래와 같이 치고   이전하고 싶은  db와 collection을 찾아둔다.

$ mongose
> show dbs;
> show collections; 

여기서 만약 mongoDB 가 port가 다르게 되어있다면 --port 12000 와 같이 mongose 명령어 뒤에 붙혀 주면 된다. 

그다음 다시 mongose를 나가서 아래와 같이 명령어를 입력하면 된다.
$ mongoexport -h 127.0.0.1:27000 -d dbName -c collectionName -o filename.json

위에서 127.0.0.1:27000은 mongoDB가 돌고있는 서비스 호스트와 포트고 dbName은 해당 데이터가 저장되어있는 db이름 그리고 collectionName은 저장되어있는 collection이름으로
변경해주면 된다. 물론 filename은 원하는데로 변경해주면 된다.

  • mongoexport 의 옵션
-h[--host] 호스트
-u[--username] 아이디 인증이 없다면 없어도 된다. 
-p[--password] 비밀번호
-d[--db] 디비이름
-c[--collection] 사용할 컬렉션명
-q[--query] query필터
-o[--out] output 파일

그 다음 이전하게 될 서버에 mongoDB가 떠있는지 확인하고 아래와 같이 명령어를 입력해주면 된다.

$ mongoimport -h 127.0.0.1:27017 -d dbName -c collectionName --file filename.json

  • mongoimport 의 옵션은
-h[--host] 호스트
-u[--username] 아이디 인증 없다면 없어도 된다.
-p[--password] 비밀번호 
-d[--db] 디비이름
-c[--collection]  컬렉션명
-f[--fields] 필드명
--file 파일명
--drop 컬렉션을 처음 드랍할때
--upsert 이미 존재할때는 update 아닐경우 insert

위 명령어만 끝나면 생각보다 이전이 쉽게 된다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>