일반적으로 MongoDB에서 sharding을 할 때,
첫번째는 cardinality 두번째는 secondary ID 정도의 조합으로 복합인덱스를 만들어
샤드키로 사용한다. (나만 그런가;;)
ex) 날짜-아이디 같은 형태.
이런 형태는 range query 시 query가 들어가는 샤드의 수를 줄여서 read에는 유리한 면이 있으나,
write 시에 한쪽 샤드에만 몰린다는 단점이 존재한다. (Hot Shard)
range query 가 없는 상태에서 heavy-write 를 하는 상황+샤드별 chunk 균등분배를 위해,
MongoDB 2.4 에서 부터 Hash-based Sharding 을 지원한다.
간단하게 말해 cardinality가 없는 특정 인덱스의 타입을 'hashed' 로 지정하면,
MongoDB 가 알아서 randomize시켜 샤딩을 적절하게 시켜준다는 것.
정확히는 해당 필드의 md5 hash의 최초 64-bit 를 이용하여 NumberLong 타입으로 저장한다.
range query 없이 특정 키를 기준으로 query를 넣는 heavy-write 상황에서 가장 적절한 선택이 아닐까 싶다.
물론 range query 들어가면 거의 무조건 전체 샤드에 query를 넣는다는 단점이 존재하므로 상황별로 적절히 선택해서 사용해야 한다.
[참조]
http://www.slideshare.net/fullscreen/mongodb/hash-based-sharding-21289231/3
http://blog.mongodb.org/post/47633823714/new-hash-based-sharding-feature-in-mongodb-2-4
'DataBase' 카테고리의 다른 글
[MongoDB] document에 expire time 적용하기 (expire, TTL) (0) | 2013.07.25 |
---|---|
[MongoDB] 샤딩된 레플리카셋 멤버변경 (sharded replica set reconfig) (0) | 2013.07.24 |
[MongoDB] 문서 내부 배열의 특정 원소만 가져오기 (get specific element from sub array) (4) | 2013.05.21 |
[SQLite3] 테이블 존재 여부 체크 (check table exists) (0) | 2013.04.15 |
[SQLite3] INSERT/UPDATE 속도 높이기 (increase write speed) (0) | 2013.01.17 |