로컬에 Replica-set 을 구축하는 방법, Sharded Cluster 배포하는 방법을 알 수 있습니다.
mkdir -p ~/mongodb-folder
mkdir -p ~/mongodb-folder/mongodb/data{1,2,3}
mkdir -p ~/mongodb-folder/mongodb/config
mkdir -p ~/mongodb-folder/mongodb/log
Terminal 3개를 열어서 각각 실행합니다.
# Terminal 1번
cd ~/mongodb-folder/mongodb-macos-x86_64-5.0.15/bin
./mongod --replSet rs1 --port 27017 --bind_ip "0.0.0.0" -dbpath ~/mongodb-folder/mongodb/data1 --oplogSize 128
# Terminal 2번
cd ~/mongodb-folder/mongodb-macos-x86_64-5.0.15/bin
./mongod --replSet rs1 --port 27018 --bind_ip "0.0.0.0" -dbpath ~/mongodb-folder/mongodb/data2 --oplogSize 128
# Terminal 3번
cd ~/mongodb-folder/mongodb-macos-x86_64-5.0.15/bin
./mongod --replSet rs1 --port 27019 --bind_ip "0.0.0.0" -dbpath ~/mongodb-folder/mongodb/data3 --oplogSize 128
각 mongodb server 는 port 27017, 27018, 27019 로 실행되며, 각 데이터베이스 데이터 저장 디렉토리는 data1, data2, data3 로 지정합니다.
replSet 옵션을 주어서 동작시켰지만, replica initiazation 이 안된 상황이라 다음과 같이 에러가 발생합니다. 정상입니다.
Terminal 하나 더 켜서 Shell 을 통해 MongoDB Server 에 접근합니다.
cd ~/mongodb-folder/mongosh-1.8.0-darwin-x64/bin
./mongosh "mongodb://localhost:27017"
접속이 되면 Replica-set 을 Initialize 합니다.
rs.initiate({
_id: "rs1",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" },
],
});
rs.status;
Ref : https://github.com/minhhungit/mongodb-cluster-docker-compose
Docker Compose 를 통해 Local 에 배포하도록 하겠습니다. Git Clone 을 ~/mongodb-folder 에 해줍니다.
cd ~/mongodb-folder
git clone https://github.com/minhhungit/mongodb-cluster-docker-compose.git
cd ~/mongodb-folder/mongodb-cluster-docker-compose
docker compose up -d
docker-compose exec configsvr01 sh -c "mongosh < /scripts/init-configserver.js"
docker-compose exec shard01-a sh -c "mongosh < /scripts/init-shard01.js"
docker-compose exec shard02-a sh -c "mongosh < /scripts/init-shard02.js"
docker-compose exec shard03-a sh -c "mongosh < /scripts/init-shard03.js"
docker-compose exec router01 sh -c "mongosh < /scripts/init-router.js"
docker-compose exec router01 mongosh --port 27017
위처럼 구성해도 직접 sharding 을 활성화하지 않으면, partition 되어 데이터가 저장되지 않습니다. 따라서 직접 활성화를 해줘야 합니다.
use test
db.abc.insertOne({ a: 1, b:2})
sh.status()
test database 생성 후, abc 로 데이터를 하나 넣고, sh.status() 를 확인합니다.
database section 을 확인하면 아래에 빨간 영역이 false 로 되어있을겁니다.
sh.enableSharding("test")
sh.status()
sharding 을 활성화하면 partitioned 가 true 로 변경된걸 확인할 수 있습니다. 데이터는 Collection 단위로 분산할 수 있고, Collection 에 대한 Sharding 도 설정해줘야 합니다.
db.abc.createIndex({a: 1})
sh.shardCollection("test.abc", {a: 1})
shard 를 설정하기 위해서는 index 가 필요합니다.
위처럼 Collection 에 Shard 를 지정하면 a 컬럼에 대한 range shard 로 설정이 됩니다.