꾸물꾸물 졔의 개발공부

[MongoDB] 샤딩(Sharding)이란 본문

Database/MongoDB

[MongoDB] 샤딩(Sharding)이란

체제 2023. 5. 12. 14:13

샤딩이란?

데이터를 여러 서버에 분산하여 저장하고 처리하는 개념. 

  • 한대의 서버에 대규모 빅데이터를 저장하게 되면 I/O가 한대에서 일어난다. (제한된 양의 데이터만 저장하고 처리) 
  • 서버를 여러개 두고 분산 저장한다면 I/O가 여러 대에서 일어나기 때문에 효율이 좋아진다.

 

즉, 샤딩은 데이터를 샤드라고 하는 더 작은 청크로 분할하고 여러 데이터베이스 서버에 저장함으로써 단일 서버의 한계를 극복할 수 있다. 

 

 

샤딩의 목적 

애플리케이션이 성장함에 따라 애플리케이션 사용자 수와 저장하는 데이터의 양이 점차 증가한다. 데이터 볼륨이 너무 커지고 너무 많은 사용자가 애플리케이션에 동시 접근하여 정보를 읽거나 저장하려고 한다면, 데이터베이스에 병목 현상이 발생할 수 있다. 이러한 현상은 속도가 저하되고 성능을 떨어트린다. 데이터베이스 샤딩은 샤드 전체에서 더 작은 데이터셋의 병렬 처리를 가능하게 하기 때문에 이러한 문제점을 해결하는 방법 중 하나이다. 

 

1) 데이터 분산 : 데이터를 분산하여 순차적으로 저장한다면 한 대 이상에서 트래픽을 감당하기 때문에 부하를 분산할 수 있다. 

2) 백업과 복구 전략 : 미리 데이터를 분산하여 저장해둔다면 리스크로부터 보호받고, 효과적인 시스템 운영이 가능해진다.

3) 빠른 성능 : 여러 대의 독립된 프로세스가 병렬로 작업을 동시 처리 하기 때문에 이상적으로 빠른 처리 효과를 보장한다. 

 


몽고DB의 샤딩 구성요소

Shard

분산된 데이터 저장 공간.

 

몽고DB는 샤딩을 통해 많은 장비(샤드)의 클러스터를 생성하고, 각 샤드에 데이터의 서브셋을 넣음으로써 데이터를 여러 단위로 쪼갤 수 있다. 샤딩을 통해 2,3개 심지어는 1000개의 샤드 클러스터를 구성할 수 있으며, 이러한 세부사항을 애플리케이션으로부터 숨기고 마치 하나의 장비처럼 보이게 하기 위해 앞단에 mongos라는 라우팅 프로세스를 둔다. 

 

Mongos 

다수 구성된 샤드의 인터페이스 역할, 애플리케이션으로부터 요청된 일을 알맞은 샤드로 라우팅 

 

어떤 샤드가 어떤 데이터를 포함하고 있는지 알 수 있는 '컨텐츠 목차'(=Config servers)가 있다. 애플리케이션은 라우터로 연결해 요청을 발행하는데, 라우터는 어떤 데이터가 어떤 샤드에 있는지 알기 때문에 요청을 적절한 샤드로 전달할 수 있다. 요청에 대한 응답이 있으면 라우터를 응답을 수집하고 필요에 따라 통합하여 애플리케이션으로 되돌려 보낸다. 

 

Config servers 

샤드에 대한 메타 데이터(목차 또는 인덱싱) 저장/관리, 구성 설정을 저장하는 서버 

 

출처 : https://devfunny.tistory.com/907

 

 


몽고DB의 샤딩 

 

 

🙋‍♀️ user : 1~9 까지의 데이터를 저장해줘 ! 

 

1️⃣ 요청을 빠르게 처리하고 싶을 경우 

: 분산 저장한다. 분산 저장은 1~9의 데이터를 샤드의 갯수 3개로 나누어서 저장하는 것이다. (123, 456, 789) 병렬 처리를 통해 동시 저장하기 때문에 빠름. 

각 샤드에 저장되는 데이터는 같은 데이터가 아니라 다른 데이터를 가지고 있기 때문에 분산 저장이라고 한다. ( 복제 x )

 

2️⃣ Mongos(라우터 서버)는 어떻게 요청을 분배할까? 만약, user가 5번 데이터를 요청한다면 라우터는 수많은 샤드 중 어떻게 원하는 정보를 얻을 수 있을까? 

: Mongos는 Config Server에 메타데이터들을 저장 즉, 인덱싱 해둔다. (메타데이터 : 데이터의 목차라고 생각하면 됨.) 라우터의 역할은 클라이언트에게 받은 요청을 분배해서 이동시킨다. 그러기 위해서 라우터는 어떤 샤드에 어떤 정보가 들어있는지 알아야 한다. Mongos(라우터 서버)는 Config Server에다가 [ A : 1~3 / B : 4~6 / C : 7~9 ] 의 정보를 인덱싱 해둔다. 

 

그래서 만약 user 로 부터 5번 데이터를 찾는 요청이 들어올 경우, 

  1. Mongos(라우터 서버) → Config Server에게 5번이 어떤 샤드에 있는지 요청한다.
  2. Config Server → Mongos에게 5번은 B에 있다고 응답한다. 

 

3️⃣ 왜 Mongos 는 직접 데이터를 찾지 않고 Config Server에 메타데이터를 저장하고 찾는 과정을 거쳐갈까?

: Mongos의 주 역할은 요청받은 일을 분배하여 알맞은 샤드로 이동시키는 것이기 때문에 만약 데이터를 찾는 일까지 한다면 속도나 성능이 느려질 수 있다. 그래서 Config Server을 활용하여 메타데이터를 저장하고 필요시 요청하는 것이다.

 

4️⃣ 만약 서버가 하나라도 다운되거나 망가지면 데이터가 유실되고 시스템 전체가 망할 수 있다는 문제점이 있다. 어떻게 해결해야 할까?

: 리플리카 라는 복제 방법을 사용한다. 샤딩에서 리플리카를 만들때에는 3개를 1쌍으로 만든다. 이 3개를 묶어 리플리카 셋 (Replicaset) 이라고 한다. 

 

리플리카를 통해 시스템 다운 문제를 해결할 수 있다. 

만약 3개씩 복제된 상태에서 1번 서버가 다운되었다면, 2번 서버가 작동하고 그 과정동안 1번 서버는 복구를 할 수 있다.