서로 다른 세 대의 컴퓨터(서버) 위에서 Docker Container MongoDB 클러스터를 구축하는 방법에 대해 설명한다.

 

 

 

1.

spark 이미지를 받는다.

 

sudo docker docker pull mongo

 

받는데 시간이 좀 걸림

아래 명령어로 image 가 잘 받아졌는지 확인한다.

 

sudo docker images

 

 

 

 

 

 

2.

네트워크를 만든다.

가장 마지막에 있는 "cw-net" 이 지금 만들고자 하는 네트워크의 이름이다.

 

sudo docker network create --subnet 11.11.11.0/24 cw-net

 

아래 명령어로 network 잘 만들어졌는지 확인한다.

 

sudo docker network ls

 

subnet 옵션으로, 8bit 네개로 구성된 ip 에서 얼마만큼의 범위로 ip 를 사용할 수 있는지 정할 수 있다.

뒤에 slash 다음에 나오는 숫자만큼, ip 의 앞단 범위가 고정되고, 나머지가 우리가 사용할 수 있는 ip 범위가 된다.

이를테면

 

11.11.11.0/8 는 11.11.11.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 11.11.11.1 ~ 11.255.255.254 만큼 사용 가능하다.

 

11.11.11.0/16 은 11.11.11.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 11.11.11.1 ~ 11.11.255.254 만큼 사용 가능하다.

 

11.11.11.0/24 은 11.11.11.0 bold 한 곳은 고정되고 나머지 부분이 사용가능하기 때문에,

 11.11.11.1 ~ 11.11.11.254 만큼 사용 가능하다.

 

11.11.11.0 ~ 11.11.11.255 가 아닐까?

왜냐면 사용 가능한 ip 중 가장 앞의 ip (11.11.11.0) 은 Network-ID 으로 사용되고,

사용 가능한 ip 중 가장 뒤의 ip (11.11.11.255) 는 Broadcast 에 사용되기 때문이다.

저 두 ip 는 특수 목적용이기 때문에, 우리 자체적으로 사용할 수 없음.

 

 

참고로 Docker swarm 을 한 상태에서 overlay network 를 만들고 싶다면 아래 명령어 참고

 

sudo docker network create -d=overlay --subnet 11.11.11.0/24 --attachable my-net

 

 

 

 

 

3.

router server 역할을 하는 mongo-router 와

config server 역할을 하는 mongo-cnf 를 아래처럼 만든다.

 

 

< mongo-cnf Container >

sudo docker run -d --name mongo-cnf --network cw-net --ip 11.11.11.9 mongo mongod --replSet cnf-serv --configsvr --port 27017

 

< mongo-router Container >
sudo docker run -d --name mongo-router --net cw-net --ip 11.11.11.11 -p 37017:27017 mongo mongos --configdb cnf-serv/mongo-cnf:27017 --bind_ip_all

 

 

 

 

 

 

 

 

4.

mongo-cnf 의 mongo shell 로 접속한 후 replica 를 등록.

실상 replica 는 여러 대가 될 수 있겠지만, 여기 포스트에서는 하나만 등록한다.

 

sudo docker exec -it mongo-cnf mongo

 

rs.initiate( {
_id: "cnf-serv",
configsvr: true,
members: [
{ "_id": 0, "host": "mongo-cnf:27017" }]
} )

 

등록 후 secondary 가 primary 로 바뀌는 것을 확인한다.

" cnf-serv:SECONDARY> " => " cnf-serv:PRIMARY> "

또한, "ok" : 1 란 응답이 와야 한다.

 

shell 에서 나가려면 Ctrl+C 를 누르거나 exit 을 타이핑한다.

 

 

 

5.

아래 명령어로 데이터를 분배할 shard node 를 3개 만든다.

 

 

sudo docker run -d --name mongo1 --network cw-net --ip 11.11.11.12 mongo mongod --shardsvr --port 27017

sudo docker run -d --name mongo2 --network cw-net --ip 11.11.11.13 mongo mongod --shardsvr --port 27017

sudo docker run -d --name mongo3 --network cw-net --ip 11.11.11.16 mongo mongod --shardsvr --port 27017

 

 

 

 

 

 

6.

mongo router server 에 접속한 후 5번에서 만든 shard node 들을 등록한다.

 

sudo docker exec -it mongo-router mongo

 

sh.addShard("mongo1:27017")

sh.addShard("mongo2:27017")

sh.addShard("mongo3:27017")

 

 

addShard 할 때마다 "ok" : 1 이란 응답이 와야한다.

 

모두 넣은 후,

sh.status()

우의 명령어를 통해 shards 에 3개의 mongo shards 가 잘 들어갔는지 확인한다.

 

 

 

 

 

 

 

지금까지 Docker 를 이용하여 MongoDB Cluster 를 만들어보았다.

간단한 예제 데이터를 넣고 쿼리를 한 번 날려보자.

 

MongoDB Sharding 하는 방법은 여기 참고.

 

 

 

 

1.

mongo router server 의 mongo shell 에 접속한다.

sudo docker exec -it mongo-router mongo

 

 

 

2.

아래 명령어로 mydb 라는 이름의 database 를 사용하기로 한다.

use mydb

 

 

3.

아래 명령어로 세 가지 데이터를 넣는다.

collection 의 이름은 mycoll 이다.

 

db.mycoll.insertOne({"name":"eyeballs","number":"010-0000-0000"})

db.mycoll.insertOne({"name":"chocolates","number":"010-1111-1111"})

db.mycoll.insertOne({"name":"bigdata","number":"010-2222-2222"})

 

 

 

4.

아래 명령어로 mycoll 을 전체 스캔 해본다.

_id 는 자동으로 추가되었다.

db.mycoll.find()

 

 

5.

방금 만든 db 와 collections 이 잘 있는지 확인한다.

 

show dbs

show collections

 

 

 

 

+ Recent posts