Contents
01 아키텍처
- Config Server
- Router
02 Sharding
- Range Sharding
- Hash Sharding
- Zone Sharding
03 Chunk Balancing
- Chunk
- Chunk Migration
- Secondary Throttling
- Jumbo Chunk
아키텍처
아키텍처 - Config Server
What?
shard cluster의 metadata를 저장하는 component이다.
중요한 정보인 metadata를 저장하고 있기 때문에 안정성을 위해
3대 이상의 노드로 이루어진 replica set으로 운영한다.
balancer는 config server에 위치해 있는 background process로
metadata를 기반으로 각 shard의 chunk 분포를 모니터링하면서
불균형이 감지되면 chunk migration을 수행한다.
아키텍처 - Router
What?
client와 shard cluster 간 중간 proxy 역할을 하는 component이다.
client의 요청을 어떤 shard로 보낼지 정하고 shard로 부터 받은 결과를
병합해서 반환한다.
How?
1. query가 참조하는 collection의 chunk 정보를 config server로부터 가져온다.
해당 정보는 캐싱된다.
2. query 조건에 shard key가 있으면 chunk 정보를 검색해서
해당 shard로 요청을 보내고 shard key가 없으면 모든 shard로 요청을 보낸다.
3. shard로부터 결과를 받아서 병합 후 반환한다.
아키텍처 - Router
Sharding - Range Sharding
What?
shard key 값의 범위를 기준으로 데이터를 분할하는 전략이다.
Sharding - Range Sharding
How?
해당 database의 sharding을 활성화하고 sharding을 적용할 collection에
index를 생성하고 sharding을 적용한다.
Sharding - Range Sharding
Feature
범위기반의 query에 효율적이다.
특정 범위의 데이터를 조회할 때 특정 shard들만 조회할 수 있다.
shard key가 순차적으로 증가하거나 특정 값의 데이터가 많아질 경우
부하가 심해지는 문제가 발생할 수 있다.
Sharding - Hash Sharding
What?
shard key 값의 hash 값을 기준으로 데이터를 분할하는 전략이다.
MD5와 같은 hash 함수를 사용해서 값을 구하고 64bit만 잘라서 정수형으로 사용한다.
Sharding - Hash Sharding
How?
해당 database의 sharding을 활성화하고 sharding을 적용할 collection에
index를 생성하고 sharding을 적용한다.
Sharding - Hash Sharding
Feature
hash 함수를 통해 균일하게 값을 생성할 수 있기 때문에 데이터를 고르게 분산할 수 있다.
범위 쿼리에는 비효율적이다.
특정 범위의 데이터가 몰려있지 않고 분산되어있기 때문에 조회시 broadcast 해야한다.
Sharding - Zone Sharding
What?
range sharding이나 hash sharding과 함께 쓰일 수 있으며
특정 범위의 데이터를 zone으로 정의해서 샤드에 할당할 수 있다.
데이터의 물리적 위치를 제어할 때 사용한다.
Sharding - Zone Sharding
How?
zone을 정의하고 shard에 zone을 할당한다.
shard key 범위를 zone에 할당한다.
Chunk Balancing - Chunk
What?
sharding cluster에서 데이터를 분산 저장하기 위한 논리적인 데이터 단위이다.
기본 크기는 64MB로 처음에는 음의 무한대와 양의 무한대 범위로 이루어진
단일 chunk로 시작해서 데이터 추가되면서 64MB를 넘을 경우 split 된다.
mongodb 6.0부터는 128MB로 변경되었다.
chunk size는 config server에서 관리하는 metadata로
다음과 같은 명령어로 변경 가능하다.
Chunk Balancing - Chunk Migration
What?
config server의 balancer는 각 shard의 chunk 갯수를 모니터링하면서
임계치 이상 차이가 생기면 chunk를 이동시킨다.
Chunk Balancing - Secondary Throttling
What?
chunk migration이 일어나서 primary 간 chunk가 이동이 되면
secondary도 동기화가 되어야한다.
chunk 이동과 관련된 작업은 oplog에 기록되고 secondary는 이를 통해 동기화를 한다.
chunk 이동이 너무 빠를 경우 복제 지연이 생기는데 이를 막기 위해
동기화 상태를 확인하면서 chunk 이동을 제한하는데
이를 secondary throttling이라고 한다.
Chunk Balancing - Jumbo Chunk
What?
chunk의 크기가 임계치보다 커지거나 chunk에 속한 document가
임계치보다 많아지면 jumbo chunk flag가 활성화된다.
jumbo chunk flag가 활성화되면 해당 chunk는 split될 수 없고
다른 shard로 이동도 불가능하다.
How?
하나의 shard key는 2개 이상의 chunk에 포함될 수 없다.
단일값으로 jumbo chunk가 생기면 split이 불가능하다.
이렇게 되면 다른 shard로 이동이 불가능하다.
위 경우가 아니면 수동으로 jumbo chunk를 split하고 다른 shard로 이동시켜야한다.