라벨이 MongoDB인 게시물 표시

[MongoDB] ObjectId에 대해서

지난번에 shard key를 설명한 글을 썼을 때 댓글ObjectId에 관한 얘기가 나왔었다.
 그래서 sharding과 큰 연관은 없지만, 이번 기회에 ObjectId에 관해서 먼저 설명하고 가는 게 좋을 것 같아서 sharding에 관한 것은 뒤로 미루고 이번에는 ObjectId에 대해 먼저 설명하고 가도록 하겠다.

ObjectId란 무엇인가 ObjectId는 같은 document 내에서 유일함이 보장되는 12 byte binary data다.
 전통적인 centralized 되어 있는 시스템이라면 한 collection 내에서 유일함을 보장하는 것을 쉽게 할 수 있다. 하지만 sharding을 하는 MongoDB에서 유일함을 보장하는 것은 기존과는 다른 솔루션이 필요하다. 그리고 이 방법을 설명하는 게 사실상 ObjectId의 모든 것을 설명하는 것이다.

왜 ObjectId를 사용하는가 전통적인 RDBMS에서 Primary key를 만들 때는 DB 서버로 data를 보내서 중복되지 않는 key를 골라서1) 그 값을 key로 저장하는 방식을 이용한다.
 하지만 MongoDB와 같은 분산 database에서는 key를 서버에서 만들지 않고 클라이언트에서 만든다.
 그 이유는 MongoDB가 query를 날릴 shard를 결정하는 방식을 보면 알 수 있다.
 MongoDB는 자신이 필요한 shard에게만 query를 요청한다. 다시 말해서 client에 해당하는 mongos2)config server의 data를 토대로 어떤 shard가 어느 범위의 값을 가졌는지를 저장하고 있다가 query를 요청할 때 자신이 필요로 하는 shard에게만 요청한다.
 따라서 shard key에 해당하는 data가 미완성인 상태로 서버에 저장하도록 요청할 수 없고, client가 ObjectId를 생성하여 값을 저장하도록 요청한다. 3)

ObjectId의 구성 ObjectId는 크게 4부분으로 구성되어 있다.

 ObjectId의 처음 4 byte는 시간정보를 담고 있다.

[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로 사용하는 것을 추천한다.
MongoDB Sharding

[MongoDB] Sharding (2) - Primary shard

MongoDB는 collection 별로 sharding을 할지 안 할지를 결정할 수 있다.
 이때 sharding되지 않은 collection들이 저장되는 shard를 "Primary Shard"라고 부른다.

 sharding되지 않은 data들이 들어 있기 때문에 이는 Single point of failure이다.

 혹시 primary shard인 머신을 down시켜야 한다면 movePrimary command로 다른 shard를 primary로 만들고 down시켜야 한다. movePrimary는 sharding되지 않은 collection들을 모두 copy해가기 때문에 무거운 작업이다. 될 수 있으면 movePrimary를 호출할 상황이 오지 않도록 노력해야 한다.

 별도로 primary shard를 정하지 않았다면, 가장 먼저 cluster에 붙은 shard가 primary shard가 된다.

 p.s. 솔직히 말하면 난 아직 primary shard를 사용해야 하는 경우를 보지 못했다.
 아마 내 MongoDB 튜닝 경험이 적어서 그럴 것이다.
 혹시 primary shard를 이용해야 했던 경험이 있다면 공유해주기 바란다. MongoDB Sharding

[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가지 군으로 나뉜다. ShardsConfig ServersQuery Routers ShardShard는 실제 data가 저장되는 곳이다. MongoDB는 보통 하나의 data를 세 군데의 shard에 저장하여 특정 shard가 Single point of failure(a.k.a. SPOF)가 되는 것을 막는다. Scaling을 위해 수를 줄이고 늘리고 하는 것이 이 shard이다.
Config ServerConfig 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를 실행하는 것을 기본으로 하고, 만약 하나의…