-
Sharding & ClusterDatabase/MongoDB 2023. 2. 2. 22:41
Sharding
Sharding 은 데이터를 여러서버에 분산해서 저장하고 처리하는 기술을 의미합니다.
일반적인 환경 구성시 Sharding 과 ReplicaSet 둘을 모두 구성합니다.
Sharded Cluster
- Shard : ReplicaSet 을 의미합니다.
- Mongos : Application 과 Sharded Cluster 간 인터페이스를 제공해주고 라우터와 같은 역활을 합니다.
- Config Servers : 설정 서버에서는 클러스터의 메타 데이터와 설정들을 저장합니다.
기본적인 Shareded Cluster 는 MongoDB 측에서 다음과 같은 구성을 권장합니다.
Shard Key
Shard Key 를 이용하여 Collection 의 Document 를 배포합니다.
별도로 지정하지 않을 경우 _id 가 됩니다.Shard Key를 지정하는 것은 범위로 균등하게 Chunk로 나뉘어져서 저장될 것이고, 특정 범위의 Shard Key에 요청이 몰리게 구성되는 경우 Sharded Cluster 의 성능은 하락하게 됩니다. 따라서 요청이 모든 범위에 균등하게 발생될 수 있는 정보가 Shard Key가 되는 것이 성능이 올라간다고 할 수 있습니다.
Chuncks
Sharding 된 데이터를 분할하며, 분할된 조각데이터들은 동일 Cluster 로 구성된 Shard 서버들에 분산하여 저장하며 이 때 이 조각데이터를 Chunks(청크) 라고 합니다. 청크는 균등해야 성능이 올라감에 따라서 분할과 병합의 과정을 거칩니다.
x 를 샤드 키로 설정하여 4개의 Chunks로 나누고, 각 Chunks 마다 범위를 가집니다.
Hashed Sharding
Hashed Index 를 이용해서 Sharded Cluster 에 데이터를 분배하는 샤딩
단조로운 1,2,3,4... 와 같은 키를 통해 샤딩할 경우 HashMap을 통해 균등하게 분배시키도록 도와줍니다.
//구성 방법 sh.enableSharding("<database>") sh.shardCollection("<database>,<collection>", {<shard key> : "hashed"})
Zones
샤드 키를 이용하여 각 범위별로 Zone을 설정할 수 있습니다.
Zone 을 설정할때는 샤드 키에 포함된 범위를 사용해야 합니다.
//Zone 추가 sh.addShardTag(<shard name>, <zone name>) sh.addShardToZone("shard0", "key1") sh.addShardToZone("shard1", "key1") sh.addShardToZone("shard2", "key2") sh.addShardToZone("shard2", "key3") //범위 설정 // namespace : [database-name].[collection or index name] sh.updateZoneKeyRange(<namespace>, <minimun(key:value)>, <maximun(key:value)>, <zone>) sh.updateZoneKeyRange("records.users", {zipcode:"10001"}, {zipcode:"10281"}, "key1") sh.updateZoneKeyRange("records.users", {zipcode:"11201"}, {zipcode:"11240"}, "key1") sh.updateZoneKeyRange("records.users", {zipcode:"94102"}, {zipcode:"94135"}, "key2") //범위 삭제 sh.removeRangeFromZone("records.user", {zipcode:"10001"}, {zipcode:"10281"}) //Zone 확인 use config db.shards.find({tags:"NTC"})
Sharded Cluster Balancer
Collection 의 Chunck 를 균등하게 재분배하는 역활을 합니다.
밸런서는 청크가 많은 샤드에서 청크가 적은 샤드로 마이그레이션 하며, 균등해질때까지 지속됩니다. 기본적으로 샤딩 설정시 활성화 상태로 유지됩니다.
이 밸런서의 동작은 스케쥴에 따라 활성화시킬수도 있으며, 불필요하다고 판단시 비활성화 할 수 있습니다.
// 스케쥴 추가방법 ( 모든 컬렉션에 적용되는 기능 ) db.settings.update( {_id : "balancer"}, {$set : { activeWindow : {start:"<start-time>", stop:"<stop-time>"}}}, {upsert:true} )
// 단일 Collection 밸런싱 활성화 sh.enableBalancing("<db.collection>")
// 수동 밸런싱 db.adminCommand({moveChunk:"<db.collection>", find:{key:value}, to : "<shard-server-name"})
'Database > MongoDB' 카테고리의 다른 글
ReplicaSet (0) 2023.02.02 2대의 서버로 구성하는 개발용 Shard Cluster (1) 2023.02.02 View (0) 2023.02.02 Index (1) 2023.02.02 MapReduce (0) 2023.02.02