본문 바로가기

기타

[mongodb] docker container로 mongo cluster 구성하기

728x90

안녕하세요 선생님들 진짜 진짜 오랜만입니다.

 

최근에 여유가 부족하다보니 엄청 오랜만에 글을 쓰게 됩니다.

 

오늘의 주제는 되게 뜬금없지만 mongo cluster 구성입니다.

 

mongo cluster란 간단하게 말해서 mongodb로 클러스터 구성을 하는겁니다.

 

몽고 클러스터를 알기 위해선 샤딩과 레플리카 셋의 개념을 좀 알아두면 좋습니다.

 

레플리카 셋은 복제 세트 라는 의미인데 두 가지 구조로 되어있습니다.

 

1. PSA 구조

2. PSS 구조 입니다.

 

P는 Primary S는 Secondary A은 Arbiter 입니다.  (본문에서는 PSS 구조)

 

각각 서버를 의미하고 프라이머리에서 작동이 이루어지다가 프라이머리에 문제가 생기면 세컨더리가 프라이머리가 되는 방식입니다. 아비터는 프라이머리의 상태를 체크하는 역할을 합니다.

 

간단하게 말해서 레플리카 셋은 백업을 만들어 둔다고 보시면됩니다.

 

샤딩은 조각내다 라는 의미의 저장기법으로 세 개의 샤드 클러스터가 있으면 여러 개의 데이터를 세 개의 클러스터에 조각내서 저장하여 분산저장 및 분산처리를 통해 속도를 증가 시키기 위한 방법이라고 보시면 될 거 같습니다. 

 

본문에서는 샤드 클러스터 구성시 서버의 구성을 레플리카 셋을 이용하여 구성하였습니다. (밑에 그림을 첨부하겠습니다.)

 

www.youtube.com/watch?v=7Lp6R4CmuKE&list=LL&index=4&t=1150s&ab_channel=JustmeandOpensource

 

해당 유튜브가 정말 설명이 잘 되어있습니다. 이 유튜브를 보시고 따라하시면 쉽게 구성하실 수 있으리라 믿어의심치않습니다.

 

 

몽고 클러스터 구성

저 같은 경우 위 그림처럼 구성하였습니다.

 

서버는 크게 세 개를 사용하였고 각각의 서버에 도커 컨테이너를 사용하여 컨테이너를 열었습니다.

 

아 일단 몽고 클러스터에서 세 가지의 기능을 알아야합니다.

 

mongos : 라우터의 역할로 사용자가 접속하는 포인트로 쿼리를 받아 config server의 분산 정보를 참조하여 샤드로 전달해 주고 사용자들에게 결과를 리턴해주는 역할

config server : 샤드 클러스터에서 분산된 샤드 정보를 저장하고 관리

sharded server : 데이터가 실제 저장되는 곳

 

이라고 보시면됩니다. 보시는 것처럼 컨피그 서버와 샤드 서버의 경우 다 레플리카 셋으로 구성하였습니다. 실제로 서버1의 프라이머리가 죽으면 서버2나 3의 세컨더리들이 프라이머리가 됩니다.

 

자 이제 대략적인 구성도는 알았으니 실제로 구성해봅시다.

 

각각의 서버 123에 우선 docker-compose파일을 작성합니다.

 

우선 config 서버부터 열어줍시다. config 서버에 대한 도커 컴포즈 파일을 각각 서버 1 2 3 에서 실행해줍니다.(알아서 편집해서 사용해 주세요 ^^ )

 

저처럼 세가지 서버에 사용하시려면 이 밑에 도커 컴포즈 파일을 세 개로 분리하여 컨피그 서버 1 2 3을 각각 서버 1 2 3에 나눠서 뿌려야합니다. 참고해주세요! 

version: '3'

services:

  cfgsvr1:
    container_name: cfgsvr1
    image: mongo
    command: mongod --configsvr --replSet cfgrs --port 27017 --dbpath /data/db
    ports:
      - 40001:27017
    volumes:
      - cfgsvr1:/data/db

  cfgsvr2:
    container_name: cfgsvr2
    image: mongo
    command: mongod --configsvr --replSet cfgrs --port 27017 --dbpath /data/db
    ports:
      - 40002:27017
    volumes:
      - cfgsvr2:/data/db

  cfgsvr3:
    container_name: cfgsvr3
    image: mongo
    command: mongod --configsvr --replSet cfgrs --port 27017 --dbpath /data/db
    ports:
      - 40003:27017
    volumes:
      - cfgsvr3:/data/db

volumes:
  cfgsvr1: {}
  cfgsvr2: {}
  cfgsvr3: {}

 

컨피그 파일이 실행되면 컨피그 서버1로 접속하여 레플리카 셋을 구성해야합니다.

 

$ mongo mongodb://<서버1ip>:<포트>
rs.initiate(
  {
    _id: "cfgrs",
    configsvr: true,
    members: [
      { _id : 0, host : "<서버1ip>:40001" },
      { _id : 1, host : "<서버2ip>:40002" },
      { _id : 2, host : "<서버3ip>:40003" }
    ]
  }
)

rs.status()

위 처럼 레플리카셋 구성이 완료되고 rs.status()를 입력하면 결과가 뜹니다. 

 

 

다음은 샤드 클러스터를 구성해야합니다. 컨피그 서버와 마찬가지로 샤드서버 1 2 3 을 각각 서버에 맞게 뿌려야합니다. 원하시는 구성에 맞게 편집해서 사용하세요

version: '3'

services:

  shard1svr1:
    container_name: shard1svr1
    image: mongo
    command: mongod --shardsvr --replSet shard1rs --port 27017 --dbpath /data/db
    ports:
      - 50001:27017
    volumes:
      - shard1svr1:/data/db

  shard1svr2:
    container_name: shard1svr2
    image: mongo
    command: mongod --shardsvr --replSet shard1rs --port 27017 --dbpath /data/db
    ports:
      - 50002:27017
    volumes:
      - shard1svr2:/data/db

  shard1svr3:
    container_name: shard1svr3
    image: mongo
    command: mongod --shardsvr --replSet shard1rs --port 27017 --dbpath /data/db
    ports:
      - 50003:27017
    volumes:
      - shard1svr3:/data/db

volumes:
  shard1svr1: {}
  shard1svr2: {}
  shard1svr3: {}

 

 

$ mongo mongodb://<서버1ip>:50001
rs.initiate(
  {
    _id: "shard1rs",
    members: [
      { _id : 0, host : "<서버1ip>:50001" },
      { _id : 1, host : "<서버2ip>:50002" },
      { _id : 2, host : "<서버3ip>:50003" }
    ]
  }
)

rs.status()

똑같습니다 샤드서버에 따라 추가적으로 더해줍니다.

 

 

 

마지막은 mongos 라우터를 구성합시다.

version: '3'

services:

  mongos:
    container_name: mongos
    image: mongo
    command: mongos --configdb cfgrs/<내부ip>:<포트>,<내부ip>:<포트>,<내부ip>:<포트> --bind_ip 0.0.0.0 --port 27017
    ports:
      - 60000:27017

 

여기까지 구성했으면 이제 mongos에 들어가 구성한 샤드클러스터들을 등록해줘야합니다.

$ mongo mongodb://<mongos가 구성된 서버 ip>:60000

mongos> sh.addShard("shard2rs/192.168.1.81:50004,192.168.1.81:50005,192.168.1.81:50006")
mongos> sh.status()

요건 제가 예시로 해줬습니다. 샤드클러스터에 대한 이름과 ip 포트를 입력해주고 등록해주면됩니다.

 

 

 

자 이렇게 해주고 데이터를 넣고 확인까지 해봐야 진짜 마무리입니다.

mongos 에 접속하셔서 아무 데이터나 만들어 넣어보시고 데이터가 분배되서 저장되면 성공입니다.

 

다음엔 청크와 청크사이즈 및 샤드 키 규칙에 관한 걸 공부해보고 올려보겠습니다. 감사합니다.

반응형