일반적으로 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









Posted by bloodguy
,