728x90
MongoDB의 샤딩을 활성화(enable sharding)하고 샤딩된 클러스터에서 쿼리를 테스트하는 방법
MongoDB의 샤딩은 데이터베이스를 여러 서버에 분산 저장하고 대량의 데이터를 효율적으로 처리하기 위한 기술입니다.
- 샤딩 전략
- 해시 기반 샤딩(Hash-based sharding)
- 범위 기반 샤딩(Range-based sharding)
새 데이터베이스(exampleDB) 생성
use exampleDB
db.stats()
인덱스 생성
db.exampleCollection.createIndex({ name : 1 })
show collections
db.exampleCollection.getShardDistribution()
mongos> db.exampleCollection.getShardDistribution()
Collection exampleDB.exampleCollection is not sharded.
for(var i=1; i<=500000; i++) db.exampleCollection.insert({
"userid" : i,
"name": "user"+i,
"age": Math.floor(Math.random()*100),
"score": Math.floor(Math.random()*100),
"time": new Date()
})
해시 샤딩(hashed sharding)
새 데이터베이스(shardDB) 생성
use shardDB
db
db.stats()
데이터베이스 수준에서 샤딩 활성화(enable sharding)
sh.enableSharding("shardDB")
새 컬렉션(exampleCollection)을 만들고 해당 _id 키를 해시합니다.
db.exampleCollection.createIndex({ "_id" : "hashed" })
컬렉션 샤딩
sh.shardCollection("shardDB.exampleCollection", { _id : "hashed" })
데이터베이스(config) 전환
use config
db.databases.find()
mongos> db.databases.find()
{ "_id" : "shardDB", "primary" : "rs1", "partitioned" : true, "version" : { "uuid" : UUID("3609e37c-743c-46b7-80a9-0fceedcd06a1"), "lastMod" : 1 } }
데이터베이스(shardDB) 전환
use shardDB
샤드 배포 확인
db.exampleCollection.ensureIndex({ _id : "hashed" })
mongos> db.exampleCollection.ensureIndex({ _id : "hashed" })
{
"raw" : {
"rs1/shard11:27017,shard12:27017,shard13:27017" : {
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
},
"rs2/shard21:27017,shard22:27017,shard23:27017" : {
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
},
"ok" : 1,
"operationTime" : Timestamp(1672669632, 11),
"$clusterTime" : {
"clusterTime" : Timestamp(1672669634, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
for(var i=1; i<=500000; i++) db.exampleCollection.insert({
"userid" : i,
"name": "user"+i,
"age": Math.floor(Math.random()*100),
"score": Math.floor(Math.random()*100),
"time": new Date()
})
mongos> for(var i=1; i<=500000; i++) db.exampleCollection.insert({
... "userid" : i,
... "name": "user"+i,
... "age": Math.floor(Math.random()*100),
... "score": Math.floor(Math.random()*100),
... "time": new Date()
... })
데이터 분포 확인
db.exampleCollection.getShardDistribution()
mongos> db.exampleCollection.getShardDistribution()
Shard rs1 at rs1/shard11:27017,shard12:27017
data : 278KiB docs : 2883 chunks : 2
estimated data per chunk : 139KiB
estimated docs per chunk : 1441
Shard rs2 at rs2/shard21:27017,shard22:27017
data : 277KiB docs : 2876 chunks : 2
estimated data per chunk : 138KiB
estimated docs per chunk : 1438
Totals
data : 555KiB docs : 5759 chunks : 4
Shard rs1 contains 50.05% data, 50.06% docs in cluster, avg obj size on shard : 98B
Shard rs2 contains 49.94% data, 49.93% docs in cluster, avg obj size on shard : 98B
728x90
범위 기반 샤딩(Range-based sharding)
새 데이터베이스(shardDB) 생성
use shardDB
db
db.stats()
데이터베이스 수준에서 샤딩 활성화(enable sharding)
sh.enableSharding("shardDB")
mongos> sh.enableSharding("shardDB")
{
"ok" : 1,
"operationTime" : Timestamp(1672672587, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1672672587, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
새 컬렉션(exampleCollection)을 만들고 해당 _id 키를 해시합니다.
db.exampleCollection.createIndex({ "_id" : "hashed" })
mongos> db.exampleCollection.createIndex({ "_id" : "hashed" })
{
"raw" : {
"rs1/shard11:27017,shard12:27017,shard13:27017" : {
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"commitQuorum" : "votingMembers",
"ok" : 1
}
},
"ok" : 1,
"operationTime" : Timestamp(1672672596, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1672672596, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
컬렉션 샤딩
sh.shardCollection("shardDB.exampleCollection", { _id : "hashed" })
mongos> sh.shardCollection("shardDB.exampleCollection", { _id : "hashed" })
{
"collectionsharded" : "shardDB.exampleCollection",
"collectionUUID" : UUID("e2727f13-cc6c-4c95-ba43-9ad42d9017e9"),
"ok" : 1,
"operationTime" : Timestamp(1672672607, 13),
"$clusterTime" : {
"clusterTime" : Timestamp(1672672607, 13),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
데이터베이스(config) 전환
use config
db.databases.find()
mongos> db.databases.find()
{ "_id" : "shardDB", "primary" : "rs1", "partitioned" : true, "version" : { "uuid" : UUID("3aa05940-c903-4646-b89e-b8920055beab"), "lastMod" : 1 } }
데이터베이스(shardDB) 전환
use shardDB
샤드 배포 확인
db.exampleCollection.ensureIndex({ _id : "hashed" })
mongos> db.exampleCollection.ensureIndex({ _id : "hashed" })
{
"raw" : {
"rs1/shard11:27017,shard12:27017,shard13:27017" : {
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
},
"rs2/shard21:27017,shard22:27017,shard23:27017" : {
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
},
"ok" : 1,
"operationTime" : Timestamp(1672672816, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1672672817, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
for(var i=1; i<=500000; i++) db.exampleCollection.insert({
"userid" : i,
"name": "user"+i,
"age": Math.floor(Math.random()*100),
"score": Math.floor(Math.random()*100),
"time": new Date()
})
mongos> for(var i=1; i<=500000; i++) db.exampleCollection.insert({
... "userid" : i,
... "name": "user"+i,
... "age": Math.floor(Math.random()*100),
... "score": Math.floor(Math.random()*100),
... "time": new Date()
... })
데이터 분포 확인
db.exampleCollection.getShardDistribution()
mongos> db.exampleCollection.getShardDistribution()
Shard rs1 at rs1/shard11:27017,shard12:27017
data : 1.39MiB docs : 14639 chunks : 2
estimated data per chunk : 712KiB
estimated docs per chunk : 7319
Shard rs2 at rs2/shard21:27017,shard22:27017
data : 1.36MiB docs : 14360 chunks : 2
estimated data per chunk : 698KiB
estimated docs per chunk : 7180
Totals
data : 2.75MiB docs : 28999 chunks : 4
Shard rs1 contains 50.47% data, 50.48% docs in cluster, avg obj size on shard : 99B
Shard rs2 contains 49.52% data, 49.51% docs in cluster, avg obj size on shard : 99B
728x90
'리눅스' 카테고리의 다른 글
[draft] 우분투에 Composer를 설치하고 사용하는 방법 (0) | 2023.01.03 |
---|---|
growpart 명령어 (0) | 2023.01.03 |
주요 SQL과 NoSQL 데이터베이스 유형 및 특징 (0) | 2023.01.02 |
[draft] MongoDB 5.0+에는 AVX를 지원하는 CPU가 필요함 (0) | 2023.01.01 |
[리눅스] 도커 컨테이너로 몽고디비 클러스터 구성하기(mongodb shard cluster) (0) | 2023.01.01 |