-
docker + mongodb replSet 우분투 몽고디비 리플리카셋업 하기 with Docker개발일지/mongoDB 2019. 4. 16. 14:23
지난 번에는 window 환경에서 테스트 성으로 replSet 하는 방법을 알아봤습니다
아래 링크를 통해 확인할수 있습니다.
자 이번에는 조금더 실무적으로 접근하여 ubuntu 환경에 docker 를 활용하여 mongoDB 리플리카셋을 진행해보겠습니다
준비사항 : ubuntu 서버 , docker 설치 -> ( ubuntu 서버에 docker 설치 방법은 구글링 하시길 )
위 사항이 준비되었다면 바로 작업이 가능합니다.
우선 window에서 셋팅한것처럼 3개의 mongoDB 환경이 구축되어야 하기에
아래와 같이 폴더를 구성하겠습니다
mongo1 , mongo2, mongo3 은 db 데이터를 volume 으로 연결할 경로갈 될것입니다.
setup 폴더에는 mongo replset 를 하기위한 스크립트를 실행 할 용도로 사용될것입니다.
같은 경로에 docker-compose.yml 를 만들어줍니다.
>vi docker-compose.yml
docker-compose.yml 에 작성은 아래와 같이 작성합니다.
version: '3' services: mongo1: image: "mongo" ports: - "27020:27017" volumes: - $HOME/mongoRepl/mongo1:/data/db networks: - mongo-networks command: mongod --replSet replication mongo2: image: "mongo" ports: - "27021:27017" volumes: - $HOME/mongoRepl/mongo2:/data/db networks: - mongo-networks command: mongod --replSet replication depends_on: - mongo1 mongo3: image: "mongo" ports: - "27022:27017" volumes: - $HOME/mongoRepl/mongo3:/data/db networks: - mongo-networks command: mongod --replSet replication depends_on: - mongo2 mongosetup: image: "setup-rspl" depends_on: - mongo1 networks: - mongo-networks networks: mongo-networks: driver: bridge
mongo1~3까지 동일한 설정에 ports 와 volumes 가 다르고 동일하다
여기서 mongo2~3 서비스는 depends_on이 걸려있는데 mongosetup 서비스가 mongo 서비스가 모두가 뜬상태에서 실행되어야 하기에 순서대로 서비스가 띄워지기 위한 설정값이다. 사실 depends_on이 없어도 괜찮을것같다
다음으로는 mongo1~3 가 뜨고나서 mongo 접속하여 replSet 작업을 하기 위한 스크립트를 작성이 필요하다
아까 만들어놓았던 setup 폴더로 진입하자
1. replicaSet.js 파일을 만들자 ( > vi replicaSet.js )
config = { _id : "replication", members: [ {_id:0,host : "mongo1:27017"}, {_id:1,host : "mongo2:27017"}, {_id:2,host : "mongo3:27017"}, ] } rs.initiate(config); rs.conf();
이내용은 window 환경 셋팅할때와 동일하지만 다른 부분은 host 부분이다 이부분은 docker network 로 연결해줬기때문에 docker-compose 로 묶여있는 서비스 끼리 통신이 가능한상태이며 서로의 ip를 service 명으로 찾아갈수 있다
2. 쉘 스크립트 만들어준다 ( vi setup.sh )
#!/bin/bash sleep 10 | echo Sleeping mongo mongodb://mongo1:27017 replicaSet.js
해당 서비스가 실행되고 10초 뒤에 mongo 접속하여 replicaSet 를 해주기위한 쉘스크립트이다.
3. 이제 해당되는 이미지를 만들기위해 dockerfile을 만들어주자 ( > vi Dockerfile )
FROM mongo WORKDIR /usr/src RUN mkdir configs WORKDIR /usr/src/configs COPY replicaSet.js . COPY setup.sh . RUN chmod +x ./setup.sh CMD ["./setup.sh"]
해당 이미지는 mongo 이미지기반으로 돌아가는 도커 이미지로 만들어지며
실행시에 configs 폴더를 만들어서 그 위치에 replicaSet.js 와 setup.sh 를 복사해준다
그리고 권한 문제가 있을수 있으니 setup.sh 파일권한을 설정하고 쉘스크립트를 실행하는 이미지이다.
자 이제 replica set 스크립트를 돌릴 docker image 를 만들어 줄시간이다
Dockerfile 있는 경로에서 도컬 빌드 명령어 실행
> docker build -t setup-rspl .
-t < 옵션은 docker build 옵션중 image 에 테그를 걸어주는 것이며 docker-compose.yml에 mongosetup 서비스에서 사용될 이미지 명을 넣어주면 된다.
이미지가 만들어 졌으며 setup-rspl:latest 로 만들어졌음을 알수 있게된다
자 이제 모든 준비가 끝이 났다 이제 docker-compose 를 돌려주면 된다 docker-compose.yml 파일 있는 경로로 나와서
docker-compose up -d 을 실행해주면 된다 (-d 옵션을 background 로 돌리라는 것이다.)
이것과 같이 creating 되면서 로그가 찍히는 것을 확인하게 된다
다른 터미널을 열어 docker ps 를 쳐주면
이렇게 실행되고 있음을 확인할수 있고 각 이미지로 접속해보도록 하자
docker exec -it <container ID> mongo
접속하게 되면 3대중 한대는 PRIMARY 로 되어있을것이며
나머지 2대는 SECONDARY 로 되어있을것이다 이렇게 된다면 이제 셋팅이 끝이 난것이다
PRIMARY 에서 디비를 생성하여 데이터를 넣어보고 프리머리 DB 를 죽인뒤에 다른 SECONDARY 가 PRIMARY 로 됨을 확인 한뒤 데이터까지 유지 되는지 테스트 해보도록 하겠다
testdb를 생성하여 mycollection 생성하여 데이터를 하나 넣었다 그다음 해당하는 PRIMARY 프로세스를 죽이도록 하겠다
> docker stop <container ID>
다른 서버가 프리머리가 됨을 확인할수 있으며
캡처된 이미지에서는 확인이 어려워 보이지만 위 이미지는 이전에 SECONDARY 였던 컨테이너였으며 지금은 PRIMARY 로 변경되었으며 데이터 역시 유지 되고 있는것을 확인 할수 있다
이것으로 ubuntu 환경에서 docker-compose 를 활용하여 3대의 mongo replica set 환경을 구축해보았다.
'개발일지 > mongoDB' 카테고리의 다른 글
[ MongoDB + ElasticSearch + Monstache ] 도커 기본 셋팅을 해보자 (4) 2019.10.02 [ mongodb Sharding] 몽고디비 샤딩 적용하기 / config sever + replica set (0) 2019.04.22 MongoDB 기본 이론 정리 (관계형 데이터 베이스와 몽고디비 차이??) (0) 2019.04.19 mongoDB replicaSet 환경을 실 서비스에 적용해보자 with mongoose (1) 2019.04.17 window 로컬 환경에 mongoDB replSet 셋업하기. (0) 2019.04.16