[MongoDB] Sharding (3) - shard key

MongoDB는 auto sharding을 해주기 때문에 사용자가 어떤 shard에 저장할지 신경 쓰지 않아도 된다. 그렇다면 어떤 document를 어떤 shard에 저장할지 어떻게 결정할까?

Shard Key

MongoDB는 shard key를 이용하여 구분한다. 별도로 지정하지 않았다면 shard key는 object ID(_id)이다. 하지만 해당 collection에 모든 document에 존재하는 field index 혹은 compound field index라면 shard key로 지정할 수 있다. 하지만 compound index는 shard key로 지정할 수 없다.

Shard key의 제약 조건

shard key에는 몇 가지 제약이 있다. 우선 shard key는 512 byte를 넘을 수 없다. 하지만 이는 시스템적 제약조건이지 실제로 512 byte를 넘는 field를 shard key로 만들 일은 거의 생기지 않는다. (사실 512 byte가 넘는 index를 지정하는 일도 거의 생기지 않는다.)

또한 한번 sharding한 collection에 shard key는 변경할 수 없다. 만약 변경하고 싶다면 새 collection을 만들어 shard key를 설정하고 collection 전체를 복사해서 새로운 collection을 만들어야 한다.

그다음 제약은 꽤 까다로운데 shard key로 지정된 field의 value는 변경할 수 없다. Update 때 document를 다른 shard로 옮겨야 할 일이 없도록 하기 위해서다. 변경할 일 없는 field들만을 shard key로 지정해야 한다. 특별히 튜닝해야 할 일이 없다면 기본값인 object id를 shard key로 사용하는 것을 추천한다.


댓글

  1. objectid는 시간정보를 담고 있어서 시간에 따라 단조증가하는 값인데, 얘를 shard key로 쓰면 비슷한 시간대에 생긴 데이터들은 모두 한 shard에 몰려버릴 수 있음. 이걸 해결하기 위한게 hashed shard key라는 게 있어서 얘를 쓰면 좋음. 자세한건 http://docs.mongodb.org/manual/core/sharding-shard-key/#write-scaling 여기에...

    답글삭제
  2. collaction 을 drop 후 같은 이름으로 collection 을 만들었습니다.

    해당 collaction 을 샤딩을 다시 걸어주려고 했더니 . already sharded 가 나오면서

    sharding 이 안걸리는데 ... .같은명으로 한경우 sharding 이 알아서 걸리는건가여? 아니면 다른 방법을 해야되는가요? 아시면 답변 부탁드려요 ㅠ

    답글삭제
    답글
    1. unshard 할 일은 가능하면 안 만드는 게 좋을 정도로 귀찮은 일입니다.
      일반적으로 unshard하는 방법은 다음과 같습니다.
      http://stackoverflow.com/questions/18576529/how-to-unshard-a-collection-on-mongodb
      만약 다 했는데도 안 된다면 모든 mongod를 종료 후 다시 시작해보시기 바랍니다.
      덧붙여서 mongo 커맨드는 실패했을 때 보통 에러메시지 뿐 아니라 에러코드도 같이 나옵니다. 그 에러 코드로 검색하면 더 많은 정보를 얻을 수 있습니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API