도커를 이용하여 MongoDB cluster(sharding)를  만드는 작업을 하고 있었다.


shard 역할을 하는 mongo container 2 개를 만들고

config server 역할을 하는 mongo config server 1개를 만들고

router 역할을 하는 mongo router 1개를 만들었음.



sudo docker network create my-mongo-cluster sudo docker run -d --name mongo-1 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-2 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-cnf --network my-mongo-cluster mongo mongod --configsvr --port 27017 sudo docker run -d --name mongo-router --net my-mongo-cluster -p 27017:27017 mongo mongos --configdb mongo-cnf:27017 --bind_ip_all



근데 이상하게 mongo router 만 만들면 계속 docker가 Exited 되는거라


이상하게 생각해서 MongoDB 문서를 검색해 봄.


https://docs.mongodb.com/manual/sharding/#sharded-cluster

Sharded Cluster

A MongoDB sharded cluster consists of the following components:

  • shard: Each shard contains a subset of the sharded data. Each shard can be deployed as a replica set.
  • mongos: The mongos acts as a query router, providing an interface between client applications and the sharded cluster.
  • config servers: Config servers store metadata and configuration settings for the cluster. As of MongoDB 3.4, config servers must be deployed as a replica set (CSRS).

 





즉, MongoDB 3.4 버전 이상부터, config server 는 무조건 replica set 이어야 한다.


standalone mode 는 더 이상 지원되지 않는다.




그래서 config server를 replica set 으로 만들고 다시 mongo cluster 를 만들어보았다.


sudo docker network create my-mongo-cluster sudo docker run -d --name mongo-1 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-2 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-cnf --network my-mongo-cluster mongo mongod --replSet cnf-serv --configsvr --port 27017 docker exec -it mongo-cnf mongo rs.initiate( { _id: "cnf-serv", configsvr: true, members: [ { "_id": 0, "host": "mongo-cnf:27017" }] } ) sudo docker run -d --name mongo-router --net my-mongo-cluster -p 27017:27017 mongo mongos --configdb cnf-serv/mongo-cnf:27017 --bind_ip_all



mongo-cnf 를 run 할 때 --replSet [레플리카 이름] 옵션을 넣는다.

위에선 cnf-serv 를 이름으로 사용함.


mongo-cnf 의 mongo 로 들어가서 위에처럼 initiate 해준다.


mongo router를 run 할 때 --configdb [레플리카 이름]/mongo-cnf:27017 옵션을 넣는다.








만약 레플리카를 더 넣고 싶다면 아래처럼 하면 된다.




sudo docker network create my-mongo-cluster sudo docker run -d --name mongo-1 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-2 --network my-mongo-cluster mongo mongod --shardsvr --port 27017 sudo docker run -d --name mongo-cnf-1 --network my-mongo-cluster mongo mongod --replSet cnf-serv --configsvr --port 27017 sudo docker run -d --name mongo-cnf-2 --network my-mongo-cluster mongo mongod --replSet cnf-serv --configsvr --port 27017 sudo docker run -d --name mongo-cnf-3 --network my-mongo-cluster mongo mongod --replSet cnf-serv --configsvr --port 27017 docker exec -it mongo-cnf mongo rs.initiate( { _id: "cnf-serv", configsvr: true, members: [ { "_id": 0, "host": "mongo-cnf-1:27017" }, { "_id": 1, "host": "mongo-cnf-2:27017" }, { "_id": 2, "host": "mongo-cnf-3:27017" }] } ) sudo docker run -d --name mongo-router --net my-mongo-cluster -p 27017:27017 mongo mongos --configdb cnf-serv/mongo-cnf-1:27017, mongo-cnf-2:27017, mongo-cnf-3:27017 --bind_ip_all








+ Recent posts