git clone https://github.com/ylake/mongodb-cluster-docker-compose.git
clone한 디렉토리로 이동하여 docker-compose up -d
(필요한 이미지들을 받아 컨테이너를 실행한다.)

config server에 대한 repl set을 구축한다.
docker-compose exec configsvr01 sh -c "mongo < /scripts/init-configserver.js"

각 샤드에 대한 repl set을 구축한다.
docker-compose exec shard01-a sh -c "mongo < /scripts/init-shard01.js"
docker-compose exec shard02-a sh -c "mongo < /scripts/init-shard02.js"
docker-compose exec shard03-a sh -c "mongo < /scripts/init-shard03.js"

라우터에 샤드를 인식시킨다.
dustin@Giwoonui-MacBookPro mongodb-cluster-docker-compose % docker-compose exec router01 sh -c "mongo < /scripts/init-router.js"
MongoDB shell version v5.0.25
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ee9fa277-8ae0-4c31-8bae-e11d27a43e2b") }
MongoDB server version: 5.0.25
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
{
"shardAdded" : "rs-shard-01",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129308, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129308, 4)
}
{
"shardAdded" : "rs-shard-01",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129308, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129308, 4)
}
{
"shardAdded" : "rs-shard-01",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129308, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129308, 4)
}
{
"shardAdded" : "rs-shard-02",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129310, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129310, 3)
}
{
"shardAdded" : "rs-shard-02",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129310, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129310, 3)
}
{
"shardAdded" : "rs-shard-02",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129310, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129310, 3)
}
{
"shardAdded" : "rs-shard-03",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129312, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129312, 3)
}
{
"shardAdded" : "rs-shard-03",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129312, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129312, 3)
}
{
"shardAdded" : "rs-shard-03",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1710129312, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1710129312, 3)
}
bye
mongosh에 접속하여 샤드 상태를 확인한다.
sh.status()

샤드를 설정한 즉시 데이터가 분산되는 것이 아니다. 테스트 데이터를 만들고 분산 설정을 진행하자
// 테스트 데이터베이스 생성 mongos> use test switched to db test // 테스트 데이터 삽입 mongos> db.abc.insertOne({a:1,b:2}) { "acknowledged" : true, "insertedId" : ObjectId("65ee80f6abd9ccac5a8d6aa5") } // 데이터베이스 확인 mongos> show dbs admin 0.000GB config 0.001GB test 0.000GB // Primary 샤드의 파티션이 아직 설정되지 않음 mongos> sh.status() { "_id" : "test", "primary" : "rs-shard-03", "partitioned" : false, "version" : { "uuid" : UUID("76381c7e-7888-48fb-b754-3a4e6ea56e74"), "timestamp" : Timestamp(1710129398, 3), "lastMod" : 1 } } // test 데이터베이스에 대한 샤딩 활성화 mongos> sh.enableSharding("test") // 컬렉션 단위로 샤딩을 진행한다. mongos> show collections abc // 데이터 검색 mongos> db.abc.find() { "_id" : ObjectId("65ee80f6abd9ccac5a8d6aa5"), "a" : 1, "b" : 2 } // 인덱스를 생성한다. mongos> db.abc.createIndex({a:1}) //abc 컬렉션을 a가 오름차순은 인덱스로 샤딩을 설정 mongos> sh.shardCollection("test.abc",{a:1}) { "collectionsharded" : "test.abc", "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1710129587, 71), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1710129587, 67) }
샤딩 설정 완료
