* 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 |