[MongoDB] Sharding (1) - Sharded cluster의 구성

Scale up과 Scale out

한 머신이 처리하지 못할 정도로 부하가 들어왔을 때의 해결책을 크게 scale up과 scale out 두가지로 분류한다. Scale up은 머신 자체의 성능을 올리는 것으로 vertical scaling이라고 불린다. 효과는 확실하지만, scale out보다 비용이 많이 든다. Scale out은 기존의 머신을 그대로 두고 새로운 머신을 추가하는 방식이다. 다른 말로는 horizontal scaling이라고 부른다.

Sharding은 scale out의 일종으로 data를 여러 서버에 나눠서 저장하는 방식을 말한다. 이때 data가 저장된 서버들을 shard라고 부르고 shard들을 포함한 몽고디비 환경을 sharded cluster라고 부른다.

Sharded cluster

MongoDB의 sharded cluster는 크게 3가지 군으로 나뉜다.

  1. Shards
  2. Config Servers
  3. Query Routers

Shard

Shard는 실제 data가 저장되는 곳이다. MongoDB는 보통 하나의 data를 세 군데의 shard에 저장하여 특정 shard가 Single point of failure(a.k.a. SPOF)가 되는 것을 막는다. Scaling을 위해 수를 줄이고 늘리고 하는 것이 이 shard이다.

Config Server

Config server에는 shard된 data들의 metadata. 즉, 어떤 data가 어떤 shard들에 저장되어 있는지에 관한 정보가 저장되어 있다. 하나의 Config server만을 이용할 수도 있지만 보통 3개의 Config server를 사용하여 특정 Config server가 SPOF가 되는 것을 막는다.

Config server에 저장되는 정보는 two-phase commit으로 저장하여 consistency를 보장해준다. Config server는 shard와 달리 scaling의 대상이 아니다. 보통 3개의 Config Server를 실행하는 것을 기본으로 하고, 만약 하나의 config server라도 name 혹은 address가 변하면 모든 mongod(shard + config server)와 mongos(query router)를 재 시작하여야 한다. 혹시 address가 변경될 것을 대비하여 CNAME을 사용하는 것을 권장한다.

Query Router

Query router는 Query router를 실행시키는 binary의 이름을 따서 mongos라고 부르기도 한다. Query router는 일종의 client interface이다. client는 data가 들어 있는 shard에게 직접 command를 날릴 수 없고, router를 통해서만 요청할 수 있다. Router는 client가 요청한 command를 어떤 shard에게 명령해야 하는지를 보고 필요한 shard에게 명령을 날리고 수행된 결과를 취합한다.

Router가 어떤 shard에 어떤 data가 들어 있는지 알기 위해 항상 Config server에 물어보는 것은 아니다. Router는 Config server에 저장된 metadata를 cache 해둔다.


댓글

이 블로그의 인기 게시물

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

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

RAII는 무엇인가

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

[Web] SpeechSynthesis - TTS API