본문 바로가기
AWS

Parse DB를 AWS MongoDB로 이동하기

by RyanGomdoriPooh 2016. 5. 4.

저번 글의 내용은 Parse를 AWS로 migration하기 위해서 일단 그 기본 환경을 셋팅하는 작업을 진행했습니다.


이제는 AWS로 migration하는 절차중 step 0: 인 내가 가지고 있는 DB의 mongoDB로 기존의 parse DB를 대체하는 방법에 대해서 설명할 것입니다.


일단은 MongoDB  3.0을 설치해주도록 합니다. parse는 node.js로 구현되어 있으면서 mongodb 2.6 또는 3.0 버전을 택하여 사용되고 있습니다.


물론 2.6을 설치해도 사용하는데에는 지장이 없지만 그래도 둘 중에 최신인 3.0을 사용해야 더 많은 안정성과 기능들을 사용할 수 있기 때문에 그렇게 하시는것을 추천합니다.


여기서 안정성이라고 표현한 이유는 글을 쓰는 현재 시점에서 가장 최신 버전이 3.2버전이기 때문에 어느정도 안정성을 검증받았다는 의미에서 쓰게 된 표현입니다.


그리고 이유는 하나 더 있습니다. MongoDB 성능을 향상시키기 위해서 3.0부터는 스토리지 엔진 API를 지원하게 되어서 DB를 사용하는 속도가 한층 업그레이드가 되었기 때문에 3.0을 선택 안할 이유가 없습니다. 


여기서는 그중 유명한 rockdb engine을 이용해서 mongodb를 튜닝할 예정입니다.


MongoDB Strorage Engine에 대해서 더 알아 보시면 다른 종류들도 존재한다는 것을 알 수 있습니다. 여기서는 그 이야기는 주제가 아니기 때문에 일단은 넘어가겠습니다.


Ubuntu 14.04 LTS 기준으로 MongoDB 3.0을 설치하겠습니다.


* 그런데 여기서 중요한 게 있습니다. 3.0이상 부터는 engine으로 data를 다루는 방식을 다르게 할 수 있습니다.


첫번째는, 그냥 디폴트로 사용하는 것이고,


두번째는, MongoDB의 engine인 wiredTiger를 사용하는 것 입니다.


--------------------------------------------------------------

첫번째, 디폴트로 사용하는 것입니다.

--------------------------------------------------------------

1) $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10


2) $ echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list


3) $ sudo apt-get update


4) $ sudo apt-get install -y mongodb-org (이건 최신버전이고 parse의 경우는 3.0.X 버전만 호환가능합니다. 밑에 명령어사용합니다.)

특정 mongodb-org=3.0.11 버전을 설치하고 싶은 경우

($ sudo apt-get install -y mongodb-org=3.0.11 mongodb-org-server=3.0.11 mongodb-org-shell=3.0.11 mongodb-org-mongos=3.0.11 mongodb-org-tools=3.0.11 )


5) $ sudo service mongod start 로 시작 할 수 있습니다. 그리고 start=>stop(멈춤)=>restart(재시작)할 수 있습니다.


6) $ mongo 로 '>'가 나오면 Mongo database shell이 시작되어 mongodb 명령어를 사용해서 접근이 가능합니다.


-------------------삭제방법------------------

$ sudo service mongod stop

$ sudo apt-get remove mongodb* --purge

$ sudo rm -r /var/log/mongodb & sudo rm -r /var/lib/mongodb

----------------------------------------------------------------------------------------------------

두번째는, Engine 을 가지고있는 percona의 MongoDB를 사용하는 것 입니다.

----------------------------------------------------------------------------------------------------

1) $ curl -s -O https://www.percona.com/downloads/percona-server-mongodb/percona-server-mongodb-3.0.10-1.5/binary/debian/trusty/x86_64/percona-server-mongodb-3.0.10-1.5-r376fb62-trusty-x86_64-bundle.tar


3.0 버전으로 받아 주어야합니다.

Curl은 Client URL로 파일은 url을 통해서 받게 해주는 명령어 입니다.


2) $ tar -xf percona-server-mongodb-3.0.10-1.5-r376fb62-trusty-x86_64-bundle.tar

tar명령어는 다운 받은 tar 압축파일을 풀어주는 명령어 입니다.


3) $ sudo dpkg -i percona-server-mongodb*

dpkg는 디패키징의 줄임방로 원래 리눅스 데비안 계열의 설치파일들을 설치해주는 것입니다. 

위에 2) 과정에서 압축이 풀린 .deb 파일들을 설치해줍니다.


-------------------삭제방법------------------

$ sudo service mongod stop

$ sudo apt-get remove percona-server-mongodb*

$ sudo apt-get purge percona-server-mongodb*

로 삭제를 해줍니다.


mongodb engine rocksdb 참고 : 

https://github.com/ParsePlatform/parse-server/wiki/MongoRocks

http://darkswing82.blogspot.kr/2016/03/


----------------------------------------------------------------------------


* 공통과정 (MongoDB 종류 상관없이)

1) $ sudo service mongod stop

으로 일단 mongodb를 멈추게 한 후


2) $ vi /etc/mongod.conf 파일로 가서 설정을 바꾸어 줍니다.

* engine(rocksdb, wiredTiger)에 대해서 고려를 했으나 오류가 많이 나서 나중에 고려하기로 했습니다.


일단 mongod.conf 파일안으로 들어옵니다.


bind IP : 0.0.0.0 으로 바꾸어주거나 아예 주석처리를 해줍니다. 해당하는 ip만 접근을 허용하겠다는 뜻입니다.

default의 127.0.0.1은 localhost로 자기 IP입니다.


바꾸어주는 이유는 DB를 옮기는 작업도 하는데 나중에는 특정한 ip와 port를 이용해서 접근을 하게 하겠지만 일단은 정하지 않았기 때문에 0.0.0.0으로 Any where 어디서든 접근할 수 있게 일단은 구성합니다.


여기서 맨위 처음 dbpath랑 logpath정도는 나중에 db를 구성할 때 쓰이는 부분이기 때문에 한번 기억해둡니다.



3) 이제 마지막으로 저장하고 나와서 $ service mongod restart 로 서비스를 실행시켜줍니다.



다음과 같이 stop했다가 다시 start표시가 나와야 정상입니다. 버전마다 조금씩 나오는 로그가 다르지만 글자는 같으니 확인해보아야합니다.


마찬가지로 $ mongo 로 접속했을 때, '>'가 나오면 성공입니다.


혹시 중간중간에 dependancy error가 나면 $ sudo apt-get -f install 로 해결하시면 됩니다.









MongoDB를 설치하는 과정은 마쳤고 이제는 parse DB를 AWS MongoDB로 가져오는 작업을 하겠습니다.


일단 여기서 Migration 필요한 조건과 현재 실습 환경에 대해서 이야기하고 시작하겠습니다.


- Ubuntu 14.04 server 에서 구축을 할 예정입니다.

- root 권한을 가진 사용자를 이용해서 작업을 합니다. - root 권한이 있어야 permission에 대해서 걸릴 것이 ㅇ

- MongoDB 3.0.X 버전이 설치되어있어야 합니다.

- domain name이 있다면 그것은 server를 가리키게 등록되어 있어야 합니다.

- migration 될 Parse App이 있어야 합니다.


SSL을 사용하려고 하는데 Web Server를 돌리는 프로그램이 있어야 합니다. 그래서 nginx라는 프로그램을 일단 설치하려고 합니다.

nginx는 서버로 오는 request들을 적절하게 분배시켜서 처리시키는 정도의 역할을 한다고 보면 됩니다.

그러니까 그 최전방에서 nginx 레벨에서 SSL을 설정해야합니다.


$ sudo apt-get update

$ sudo apt-get install nginx

로 설치가 되고 자동으로 웹서버 실행시에 켜지게 됩니다.


nginx 사용법은 다음과 같습니다.

$ sudo service nginx stop[start,restart]    // nginx를 stop, start, restart 시킬 수 있습니다.

일단 기본으로 웹서버 실행시 자동으로 프로그램이 실행되지만 그래도 명시적으로 자동 실행을 선언할 수 있습니다.

$ sudo update-rc.d nginx defaults

이미 자동실행이 선언되어 있는 경우는 다음과 같은 메세지를 보실 수 있습니다.

System start/stop links for /etc/init.d/nginx already exist.


해당 서버의 도메인이나 공인 IP를 사용해서 접속해보시면 다음과 같이 나오면 성공하신겁니다.



이제 nginx의 설정은 끝났고 인증서를 발급 받는 절차로 넘어 가시면 됩니다.



** 위의 조건을 만족하셨으면 SSL(Secure Socket Layer)을 설치 할 것인지에 대한 선택을 하셔야 합니다.

--------------------------------------

선택을 하신다면 조건을 충족하셔야 하는데, 실제 Domain Name이 있어야 인증을 해주기 때문에 Domain Name이 없으신 경우는 그냥 Skip하시고 나중에 고려하셔야 합니다.

DNS 시스템인 예를 들어, AWS Route53같은 서비스로 현재 서버의 ip와 연결해주시면 연결에 훨씬 수월합니다.

선택 하지 않으실 것이면 이 부분을 건너뛰어서 바로 아래에 MongoDB migration 하기로 넘어가시면 됩니다.


SSL 인증서는 웹사이트의 Host Header 값 즉 Domain Name을 기준으로 인증서를 발급합니다.

그래서 IP서버이름 으로 신청을 하면 발급을 받더라도 인증서에서 오류가 발생합니다.

 

또한, 코모도 SSL 인증서를 발급 받기 위해서 도메인소유자검증(DCV) 절차가 필수 인데, 도메인이 아니거나 소유가 아니면 통과 자체가 안됩니다.

그래서 신청할 때는 무조건 정확한 보유하고 있는 Domain Name을 써야합니다.


개념에 대해서 조금 더 설명하자면,


SSL이라는 것은 우리가 구축해놓은 Server에 한단계의 절차를 더 두어서 Socket Level의 Layer를 하나 더 두어서 보안을 향상 시키는것입니다.

Client들이 보낸 request 요청은 WAN, LAN를 통해 전파되고 스위치나 라우터를 통해서 결국 상대방에게 도착하게됩니다. 그리고 처리된 결과를 response합니다.

이 과정에서 흔히 말하는 해커들이 wire shark같은 응용프로그램을 이용해서 WAN, LAN으로 전송되는 request와 response의 내용을 해킹합니다.

이러한 HTTP 프로토콜의 보안이 취약한 부작용을 막기위해서 암호화를 통해서 보내고 받을 필요가 생겼습니다.

그걸 가능하게 해주는 통신방법이 HTTPS프로토콜을 이용해서 port 번호 433로 데이터를 통신하는 방법입니다.


이를 위해서는 HTTPS 통신이 가능하려면 SSL 보안 인증서를 발급 받아서 적용해야합니다.

SSL 보안 인증서는 유료도 있고 무료도 있는데 그 차이는 그 보안을 하는 과정에서 암호화의 수준의 차이라고 말할 수 있습니다.

그렇다고 무료라고 해서 엄청 쉽게 보안에 뚫리진 않습니다.


AWS의 경우 Security Group에 HTTPS Port# 433을 열어줍니다.

-->>>> 요부분 부터 수정

일단은 유료사이트는 설명에 착오가 있을 수 있어서 무료인증사이트인 letsencrypt을 이용해서 SSL을 설정하는 방법에 대해서 설명 하겠습니다.


1) $ sudo apt-get -y install git bc

로 git 과 bc를 사용할 것이기 때문에 설치해줍니다.


2) $ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

git을 이용해서 github로부터 /opt/letsencrypt로 파일을 저장합니다.


3) $ cd /opt/letsencrypt

해당 설치한 폴더로 이동합니다.


4) $ ./letsencrypt-auto certonly --standalone

명령어를 통해서 다운로드 받은 프로그램을 실행 시키는 것입니다.


처음에는 SSL 인증서를 발급받기 위해서 이메일(이 이메일은 신속하게 SSL키를 대처할 수 있는 DBA와 같은 사람들에게 맡기는게 통상적입니다.)을 입력합니다. 이유는 인증서를 잃어버렸을때 다시 인증을 받을 목적으로 이메일을 입력하는 것입니다.


그리고 이용약관같은게 나오는데 Agree해주셔야 진행하실 수 있습니다.

그리고 Domain Name을 넣어주시고 엔터를 치시면 인증서가 발급이 됩니다.

하지만

----------------------------------------------------

*여기서 Domain을 현재 사용하고 있는 서버에 할당을 해놓지 않으면 다음과 같은 에러를 만나게 되실 겁니다.


이 에러는 위에 SSL이론에서 이야기 했던 DCV절차가 확인이 안되어서 그렇습니다.


확인이 되게 만들기 위해서는 현재 인증서를 받을 곳의 IP정보와 DNS정보가 같아야합니다.

간단하게 같게 만드는 절차에 대해서 이야기 해보겠습니다.


AWS와 같은 경우는 DNS management를 Router53이 해줍니다. 이것은 프리티어가 아니고 유료서비스입니다. 사용해주셔야 진행이 가능합니다.

약 $ 0.53 정도 비용이 발생합니다.


1) 일단 현재 도메인을 가지고 있는 관리 사이트에 들어가서 도메인 정보에 네임서버정보를 봅니다. 총 1~4차 까지 4개를 보실 수 있습니다.

이 네임서버 정보를 복사해줍니다.


2) AWS에 Route53 서비스를 들어가서 DNS Management를 들어가셔서 현재 소유하고 있는 도메인과 네임서버를 등록해주겠습니다.

"Create Hosted Zone" 를 클릭해서 들어가서 우측에 Domain Name에 소유하고 있는 도메인을 넣고 "Create" 해줍니다.

이로써 type NS, SOA가 생성됩니다.


3) 아직 IP를 사용해서 DNS와 Server를 연결해주는 작업이 남았습니다.

일단, 해당 호스트 존에서 Recoed를 추가 하겠습니다. [Create Record Set] 버튼을 클릭하고, 오른쪽 Create Record Set 영역을 채웁니다.

Name : 서브 도메인 네임을 입력합니다. 이번 예제에서는 루트 도메인을 사용하기 위해 비워 두겠습니다. 비우면 example.com 과 같은 형태로 접속하게 됩니다.

Type : A레코드를 생성하기 위해 'A - IPv5 address' 를 선택합니다.

Alias : 'No' 를 선택합니다.

TTL : 도메인 이름 캐싱 시간을 정합니다. 그대로 둡니다.

Value : 여기에 Elastic IP (고정IP)을 입력합니다.

"Create"를 클릭합니다.


이로써 연결해주는 작업이 끝났습니다. 시간은 보통 30분정도 걸린다고 합니다.


연결이되면 서버를 설정할 때 썼던 nodejs port인 9000으로 한번 접속해보고 똑같은 결과가 나오는지 확인합니다.

결과가 정상적이라면 다시 위로가서 인증을 받아 봅니다.



추가적인 정보는 이곳을 확인합니다.

http://wingsnote.com/57


----------------------------------------------------


다시 SSL인증서를 받아보겠습니다.


* 혹시 The program nginx ~ 라는 내용이 나오면서 마지막에 try again이라는 말을 하면 다시 나가셔서 nginx를 종료하시고 다시 4) 과정을 하시면 됩니다.

이 과정에서는 당연히 방화벽 포트허용을 해주셔야합니다.(HTTPS 443)


여기까지 letsencrypt 인증서를 받는 부분이고 안타깝게도 이 무료 인증서는 기간이 3개월이 전부입니다. 그래서 갱신을 해주어야 합니다.

그런데 Auto-renewal 을 원하시는 분은 

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04

여기를 참고해서 진행하시기 바랍니다.


5) 위 과정에서 인증서 발급은 마쳤고 이제 MongoDB에 외부에서 접근할 때, 발급받은 SSL 인증서를 가지고 SSL을 통해서 접속할 수 있도록 만들겠습니다.

사실 이 과정이 SSL 사용하는 이유라고 생각할 수 있습니다. 결국 동적인 데이터의 전부가 DB에서 나가기 마련인데 이 과정을 안해주면 의미가 없게 됩니다.

이제 그 과정을 보겠습니다.


6) $ sudo cat /etc/letsencrypt/archive/domain_name/{fullchain1.pem,privkey1.pem} | sudo tee /etc/ssl/mongo.pem

본인의 도메인 네임으로 domain_name을 바꾸어 줍니다.


7) $ sudo chown mongodb:mongodb /etc/ssl/mongo.pem

/etc/ssl/mongo.pem 의 키를 소유자를 mongodb:mongodb로 바꾸겠다는 것입니다.

$ sudo chmod 600 /etc/ssl/mongo.pem

그리고 mongo.pem 키의 접근자 제어를 600으로 합니다.


8) 이제 /etc/mongod.conf 에 들어가서 ssl을 사용하시 위해서 해당부분을 바꾸어주고  추가해줍니다.

# network interfaces

net:

  port: 27017

  bindIp: 0.0.0.0

  ssl:

    mode: requireSSL

    PEMKeyFile: /etc/ssl/mongo.pem


# security

security:

  authorization: enabled




---------------------------------------




* MongoDB migration 하기


1) $ mongod --setParameter failIndexKeyTooLong=false

이 설정을 해주는 이유는 MongoDB는 failIndexKeyTooLong의 파라미터가 default로 true가 되어있습니다.  이 파라미티가 의미하는 것이 Index Key중 너무 큰게 있으면 저장되는 것을 fail 시켜라라고 하는 파라미터입니다.

기존에 Parse에 있는 DB가 1024bytes가 넘는 index를 가지고 있을 수도 있다라고 생각이 되어서 그 모든 것들을 fail되지 않고 옮길 수 있도록 임의적으로 failIndexKeyTooLong parameter를 바꾸어 주는 것입니다.



2) MongoDB는 default로 27017 port를 사용합니다. AWS나 PC의 방화벽(AWS경우 security group)을 열어서 사용하여서 port를 허용해주어서 방화벽을 열어줍니다.



3) $ mongo --port 27017  로 mongodb port # 27017 에 접속합니다.

그리고 다음과 같은 작업을 합니다.

> use admin

::  나중에 Parse를 migration할 때, 사용하기 위한 database이다.

db.createUser({ user: "관리자용 ID", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })

:: username, password는 DB에 접근 권한을 가진 사용자( 4)단계의 로그인 아이디, 패스워크) 를 생성하는 과정입니다.

원하는 것으로 입력합니다. 다만 4) 단계에 사용하실 것이기에 기억해 둡니다.

>exit



4) $ sudo service mongod restart

명령어로 변경하고 추가한 사용자들에 대한 적용을 합니다. 4-1)과 4-2)는 구분되어 있으니 둘중 하나로 접속을 하시고 4-3)은 공통입니다.


4-1) SSL 설정을 한 경우, ssl mode로 접속이 가능합니다. 위에 3)에서 사용한 명령어 $ mongo --port 27017 이 이제 안쓰이고

mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username username --password password

로 접속을 합니다.


4-2) SSL 설정을 안 한경우, ssl mode가 아니기 때문에 기존의 $ mongo --port 27017 을 사용해서 접속을 합니다.


4-3) 그리고 다시 mongoDB에 접속이 되면 이제 migration할 database를 만듦니다.

> use migration_database_name    //원하는 migration용 DB name

> db.createUser({ user: "migration parameter로 들어갈 ID", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })

// 원하는 migration ID, password 권한을 가진 사용자를 만듦니다.


해당 DB에 사용자가 등록되었는지 확인하시려면

> use [데이터베이스 이름]

> show users

를 입력하면 해당하는 DB에 접근할 수 있는 사용자 정보를 볼 수 있습니다.



여기서 만든 것들은

mongodb://migration parameter로 들어갈 ID:password@your_domain/migration_database_name 이러한 형식으로 다음 단계의 parameter로 들어갑니다.



5) 모든 DB의 셋팅이 마치게 되었으면 이제는 Parse dashboard로 갑니다.

Parse dashboard => https://dashboard.parse.com/apps

dashboard => App Settings => General => 하단부의 migration을 누르고 예시되어있는 mongodb://username:password@your_domain/database_name 을 설정하고 마이그레이션을 시작합니다.


mongodb://username:password@your_domain/database_name 에서

username, password, databases_name 은 위에 4)과정에서 정했던 것을 그대로 넣으면 되고,


your_domain은 AWS같은 경우는 Public DNS를 넣으면 됩니다.


SSL을 사용하신다면 맨뒤에 ?ss=true 를 추가로 넣으시고 진행하시면 됩니다.


그렇게 완성된 parameter를 가지고 migration을 시작합니다.





다음과 같은 화면이 나오면 일단 Parse DB가 AWS DB로 이동하는 것은 완료가 된 것입니다.

아직 Finalize는 누르지 않습니다.


6) 이제 데이터가 MongoDB 에 정상적으로 등록이 되었는지 확인한다.

$ mongo    // mongodb shell 접속


> use database_name    // 그 해당 migration database로 이동.


> show collections    // database 안에 collection이 무엇이 있는지 알 수 있는 명령어

혹시 명령어가 error가 발생한다면 > db.auth("접근사용자 id","접근사용자의 password"); 를 입력해주면 됩니다.


> db.getCollection("해당 collection 이름").count()    // 이 과정을 통해서 collection 안에 있는 document의 수를 확인할 수 있습니다.


> exit    //mongodb shell 종료



7) mongod --setParameter failIndexKeyTooLong=true

이제 모두 DB가 옮겨진 것을 확인했으니 다시 failIndexKeyTooLong key를 true로 바꾸어서 1024 bytes의 index들이 못 만들게 닫아줍니다.



8) 마지막으로 DB의 이동이 완료되고, 어플리케이션의 구동이 완료되었다고 생각되었을때, Finalize를 눌러서 최종 이동을 해줍니다.



이제 DB를 마이그레이션 하는 작업을 완료가 되었습니다.


지금까지는 Parse DB를 AWS에 구성하였습니다.


다음으로는 Parse-Server를 AWS에 구성하는 것을 하겠습니다.


댓글0