Architecture

효율적인 데이터 분산 저장 전략: 샤딩과 리밸런싱의 이해

백엔드 유성 2023. 8. 11. 22:30

해당 내용은 샤딩에 대한 내용으로 비유적인 설명이 많습니다.

이해를 위해서만 봐주시고, 더 궁금하신 내용은 댓글을 남겨주세요.

 

 

 

 

 

위에처럼 노트북을 보관해 주는 회사가 있고, 노트북을 1000대 보관할 수 있는 창고가 있습니다.

 

1. 데이터 분산 저장을 위한 새로운 창고의 추가 (샤딩)

보관해야 할 1000대의 노트북이 추가로 들어와서 창고 B를 만들었습니다.

창고 A와 B는 모두 노트북이 들어온 순서대로 보관을 하고 있습니다.

 

만약 고객이 창고에 들어와 노트북을 찾으려면 2000대의 노트북을 하나씩 확인해야만 합니다.

 

2. 최적화 전략 개발 (샤딩 키 구성)

노트북을 찾는 시간이 너무 오래걸려, 시리얼 번호를 기준으로 분류합니다.

 

시리얼 번호는 한번 정해지면 변경되지 않는 값이므로

시리얼 번호가 홀수로 끝나는 노트북을 A 창고에,

시리얼 번호가 짝수로 끝나는 노트북을 B 창고

넣어보겠습니다.

 

이 방법을 사용했더니 노트북을 찾아야 할 때 소모되는 시간은 반으로 줄었습니다.

그러나, 고객들은 노트북을 어느 창고에 보관해야 하는지 어느 창고에서 가져와야 하는지 외우고 있어야 하므로 복잡합니다.

 

3. 새로운 문제와 해결책 (리밸런싱)

1000대의 노트북이 추가로 들어와 C 창고가 필요해졌고, C 창고가 추가되었습니다.

창고가 3개이므로 홀짝 알고리즘을 사용할 수 없습니다.

"시리얼 번호 % 창고의 개수" 라는 샤딩키 알고리즘을 개발합니다.

시리얼 번호를 창고의 개수인 3으로 나눈 나머지가 0이면 A창고, 1이면 B창고, 2이면 C창고 로 보관이 됩니다.

 

그럼 이제 A와 B 창고에 있던 노트북들을 다시 분류하여 A, B, C 창고로 분산 저장합니다.

이 과정을 "리밸런싱"이라고 부릅니다.

 

4.  효율적인 검색 기능 도입(파티셔닝)

하나의 창고에 1000대의 노트북이 있는데 노트북을 하나하나씩 찾는것이 시간이 너무 많이 든다고 판단하여

10개의 파티션을 다음과 같이 만듦니다.

  • 시리얼 번호가 0001~1000으로 끝나면 a 파티션
  • 시리얼 번호가 1001~2000으로 끝나면 b 파티션
  • c, d, ... j 파티션

각각의 창고에 있는 노특북을 a부터 j까지 파티션으로 벽을 쳐서 물리적으로 분할합니다.

 

검색 시간이 1/10로 줄어들었습니다.

(1/10은 대략적인 값이며, 일부의 경우 파티셔닝 전보다 검색시간이 증가 할 수 있습니다.)

 

5. 창고의 복잡성 관리 (코드레벨의 복잡성 증가 -> 단일 엔드포인트 사용으로 개선)

창고가 3개이므로 고객이 오면 어느 창고에서 노트북을 찾아야 되는지 외우고 있기가 복잡해집니다.

 

이를 해결하기 위해 고객에게서 시리얼 번호를 받으면 해당 노트북이 있는 창고와 파티션을 알려주는 직원을 고용했습니다.

해당 직원을 "샤딩 미들웨어"라고 부릅니다.

(샤딩 미들웨어라는 용어는 흔히 쓰이는 용어는 아닙니다.)

 

이제 샤딩 미들웨어 직원에게 찾고싶은 노트북의 시리얼 번호를 말해주면

어느 창고의 어느 파티션에 있는지 가르켜줍니다.

 

이제 더이상 고객들은 창고가 어떻게 구성되어있고, 파티션이 어떻게 구성되어 있는지 몰라도 됩니다.

 

 

 

여기까지 효율적인 샤딩 구현 방법을 비유로 알아보았고,

DB 클러스터링 중 Shared-Nothing 아키텍처와 AWS DynamoDB 도 기본적인 작동 원리는 위 설명과 동일합니다.

 

 

또한, NoSQL 뿐 아니라 MySQL 등의 RDBMS도 동일하게 구성이 가능합니다.

 

감사합니다.