ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • docker + mongodb replSet 우분투 몽고디비 리플리카셋업 하기 with Docker
    개발일지/mongoDB 2019. 4. 16. 14:23

     

    지난 번에는 window 환경에서 테스트 성으로 replSet 하는 방법을 알아봤습니다

    아래 링크를 통해 확인할수 있습니다.

     

    window 로컬 환경에 mongoDB replSet 셋업하기.

    시스템 구축하는것은 할때마다 항상 까먹기도 하고 새롭기도 하기때문에 그때마다 구글링 youtube 를 뒤지곤한다 오늘은 윈도우 로컬 환경에 mongoDB replication 셋업을 기록하여 도움이 필요한 사람들 혹은 나..

    sudarlife.tistory.com

    자 이번에는 조금더 실무적으로 접근하여 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 환경을 구축해보았다.

    댓글

Designed by Tistory.