ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Sharding & Cluster
    Database/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
Designed by Tistory.