본문 바로가기

Computer Science/MongoDB

MongoDB 3.0 Sharding

sharding


- 여러 단말에 걸쳐 데이터를 저장하는 방법.


1. 목적 


 - 큰 dataset과 높은 처리속도는 단일 서버에서는 힘든일이다.

 - working set 크기가 램 크기보다 커지면 disk i/0로 인해 버벅거리게 된다.


 - 이를 해결하기위해 2가지 방법이 있다. Vertical scaling과 Sharding( horizontal scaling).



  - Sharding은 각 shared가 처리하는 operation 수를 줄여준다. 각 Shared 는 클러스터가 커짐에 따라 적은 operation을 수행하게 된다. 




2. 구성요소

 - Shard, Query router, config server



 - Shard : 데이터를 저장한다. 각 Shard는 replica set이다.

 - Query router(mongos) : 클라이언트와 오퍼레이션에 해당되는 사드의 인터페이스이다. operation에 해당되는 shared에 클라이언트 연산을 보내고, 연산결과를 되돌려 준다. Shard clusters 요청을 분산시키기 위해서 1개 이상의 query router를 사용한다. 


- config server : cluster의 metadata를 저장한다. metadata에는 cluster의 data와 shard의 maping 정보를 가진다. query router는 이 데이터를 이용하여 연산에 맞는 특정 shard를 찾는다. 


3. Data Parititioning


 - MongoDB는 collection 수준에서 데이터를 분산시킨다. Collection의 데이터를 shard key로 나눈다.


 - Shard key : collection들을 나누기 위해서 shard key를 선택해야한다. indexed field 이어야 한다. 


MongoDB는 shard key value를 chunk로 나누어서 각 shard에 균등하게 분산시킨다.


분산 시키는 방법은 ‘range based partitioning’, ‘hash based partitioning’이 있다.


 + shard key로 지정한 field의 값들을 가지고 collection의 document들을 chunk로 만들어서  각 shard에 나눈다.

 + chunk = 나눈 document들 

 + 1 collection => 여러개의 chunk in shard1 => 여러개의 chunk in shard 2 . . . .


range base partitioning은 document의 value(shard key) 의 범위에 따라서 해당 샤드에 분산시킨다.

예를 들어 chunk1 은 값 0 ~ 10 의 범위를 가진다하자.


* Hash Based Sharding

 - chunk 생성을 위해서 hash를 사용한다.

 - 비슷한 값을 가진 데이터여도 hash를 통해서 다른 chunk에 들어갈 수 있다.


 * Range와 Hash의 성능 차이 

 - range : shard의 장점을 무시하게된다.

 - hash : 


 * Tag Aware Sharding을 통해서  Custom data distritubtion도 가능하다. 


 

4. Maintaining a Balanced Data Distribution


 - 서버에 새로운 데이터를 추가할 경우 cluster에 분산 균형이 맞지 않을 수 있다. 

 - 이를 위해 splitting과 balancer 백그라운드 프로세스를 사용한다.


 * Splitting

 - Chunk가 정해놓은 chunk size를 넘을 경우, MongoDB가 chunk를 반으로 자른다. 


'Computer Science > MongoDB' 카테고리의 다른 글

Mongoose regex 사용하기  (0) 2016.06.20
MongoDB 3.0 replication  (0) 2015.02.19
MongoDB 3.0 release  (0) 2015.02.11
MongoDB java driver  (0) 2015.02.08