[데이터베이스] 샤딩

Narcoker·2023년 7월 18일
0

데이터베이스

목록 보기
11/17
post-custom-banner

샤딩이란

데이터베이스 샤딩은 큰 데이터베이스를 작은 부분,
샤드 로 분할하는 방식을 말한다.

샤딩은 각 샤드를 다른 데이터베이스 서버에 위치시켜
수평적으로 스케일링 할 수 있는 방법을 제공한다.

대규모 데이터셋높은 트래픽을 처리하는 애플리케이션에 유용하다.

샤딩이 중요한 이유

애플리케이션이 성장함에 따라,
애플리케이션 사용자 수와 애플리케이션에 저장되는 데이터의 양도
시간이 갈수록 증가한다.

데이터 양이 증가함에 따라 쿼리 실행속도가 느려지고
또한 애플리케이션을 동시에 사용하여 읽거나 저장하는 경우 병목현상이 발생한다.

이러한 이유로 사용자 경험의 질이 떨어진다.
샤딩을 이용하면 이러한 점을 해결할 수 있다.

샤딩을 통해 얻을 수 있는 이점

응답 시간 개선

대규모의 단일 데이터베이스에서는 데이터를 검색하는 데 시간이 더 오래 걸린다.

샤딩을 통해 데이터베이스를 분산시키면 행의 수가 줄어드게 되므로
특정 정보를 검색하거나 쿼리를 실행할때 걸리는 시간이 단축된다.

전체 서비스 중단 방지

데이터베이스를 호스팅하는 컴퓨터에서 장애가 발생하면
데이터베이스를 사용하는 애플리케이션에서도 오류가 발생한다.

샤딩을 통해 데이터베이스의 일부를 다른 컴퓨터에 배포할 수 있는데
이로써 이 같은 문제를 방지할 수 있다.

또한 데이터 복제(Replication)과 같이 사용되는 경우가 많다.

즉 샤드 중 하나를 사용할 수 없게 되더라도
대체 사드에서 데이터에 엑세스하고 복원 할 수 있다.

효율적인 크기 조정

데이터 베이스가 확장되면 더 많은 컴퓨팅 리소스를 소비하고
스토리지의 최대 용량에 도달하게 될 것이다.

이 경우 샤딩을 사용하여 더 많은 컴퓨팅 리소슬르 추가함으로써 데이터베이스의 확장을 지원한다.

유지 관리를 위해 애플리케이션을 종료하지 않고도
런타임에 새 샤드를 추가할 수 있다.

샤딩의 문제점

데이터 핫스팟

데이터 분포가 고르지 않아 일부 샤드가 불균형하게 된다.

예를 들어, A로 시작하는 고객 이름을 포함하는 단일 물리적 샤드는
다른 샤드보다 많은 데이터를 수신한다.
따라서 이 물리적 샤드는 다른 샤드보다 더 많은 컴퓨팅 리소스를 사용한다.

AWS에서 제안한 해결책

최적의 샤드 키를 사용하여 데이터를 고르게 분산할 수 있다.
다른 데이터 세트보다 샤딩에 더 적합한 데이터 세트가 있습니다.

운영의 복잡성

개발자가 단일 데이터베이스를 관리하는 것이 아니라 여러 데이터베이스 노드를 관리해야 한다.
정보를 검색할 때 개발자는 여러 샤드를 쿼리하고 정보를 결합해야 한다.
이러한 검색 작업은 분석을 복잡하게 만들 수 있다.

AWS에서 제안한 해결책

AWS 데이터베이스 포트폴리오는 데이터베이스 설정과 운영이 대폭 자동화되어 있다.
따라서 샤딩된 데이터베이스 아키텍처와 관련한 태스크도 간소화된다.

AWS 클라우드 데이터베이스를 사용하라는 말인 것 같다.

인프라 비용

조직에서 물리적 샤드로 추가하는 컴퓨터가 많을수록 인프라 비용이 더 많이 발생한다.
온프레미스 데이터 센터의 시스템 수를 늘리면 유지 관리 비용이 가중될 수 있다.

AWS에서 제안한 해결책

개발자가 Amazon Elastic Compute Cloud(Amazon EC2)를 사용하여
클라우드에서 샤드를 호스팅하고 확장한다.

AWS가 전적으로 관리하는 가상 인프라를 사용하면 비용을 절감할 수 있다.

애플리케이션 복잡성

대부분의 데이터베이스 관리 시스템에는 샤딩 기능이 내장되어 있지 않는다.
따라서 데이터베이스 설계자와 소프트웨어 개발자가
데이터베이스를 수동으로 분할하고 분산하고 관리해야 합니다.

샤딩을 하기전에 고려해야할 점

샤딩은 복잡성을 증가시킬 수 있다.

샤딩 전략을 설계하고 샤드 간에 데이터를 균등하게 분배하는 것은 쉽지 않으며,
잘못된 샤딩 전략은 성능 저하를 초래할 수 있다.

또한, 각 샤드가 독립적으로 작동하므로
트랜잭션과 같은 여러 샤드에 걸친 작업을 처리하는 것이 더 복잡해질 수 있습니다.

동작 방식

데이터베이스는 열과 행으로 구현된 데이터 세트이다.
샤딩을 통해 단일 데이터 세트를 파티션이나 샤드로 분할한다.

이때 하나의 물리적 샤드에는 여러 개의 논리적 샤드를 포함할 수 있다.

또한 각 물리적 샤드는 독립적으로 동작하며 다른 샤드를 인식하지 못한다.

즉, 요청한 데이터가 들어있는 물리적 샤드만 해당 데이터를 병렬로 처리한다.

각 샤드에는 노드라고 하는 여러 컴퓨터에 개별적으로 저장할 수 있는 정보의
고유의 행이 포함되어있다.

모든 샤드는 각각 개별 노드(컴퓨터)에서 실행되지만
원래 데이터베이스의 스키마를 공유한다.

샤딩을 하는 방법

범위 샤딩

각 샤드는 특정 범위의 값을 저장한다.

예를 들어, 사용자 ID를 기준으로 샤딩하는 경우,
특정 범위의 ID (1-1000, 1001-2000 등)를 가진 사용자 정보는 해당 범위의 샤드에 저장된다.

단순하고 직관적이지만, 특정 범위의 데이터가 많이 사용되면
즉, 특정 샤딩에 몰리면 해당 샤드에 과도한 부하가 발생할 수 있다.

가장 큰 장점은 증설 작업에 드는 큰 비용이 들지 않는다는 점이다.
데이터가 급격히 증가할 여지가 있다면 범위 샤딩은 좋은 선택이 될 것이다.

모듈러 샤딩

PK 를 모듈러 연산한 겨로가로 DB를 라우팅하는 방식

  • 범위 샤딩에 비해 데이터가 균일하게 분산된다.
  • DB를 추가 증설하는 과정에서 이미 적재된 데이터의 재정렬이 필요하다.

데이터가 늘어남에 따라 샤딩을 추가적으로 해야하는 상황이 자주 생기면 큰 부하가 발생한다.

그렇기 때문에 데이터량이 일정 수준에서 유지될 것으로 예상되는 데이터 성격을 가진 곳에 적용할 때 어울린다.

해시 샤딩

각 행의 샤드 위치는 특정 값의 해시 함수를 통해 결정된다.

해시 샤딩은 각 샤드에 데이터를 균등하게 분배하는 데 효과적이다.

하지만 해시 함수를 통해 데이터 위치를 결정하기 때문에,
범위 기반의 쿼리가 느려질 수 있다.

목록 샤딩

이 방식에서 각 샤드는 명시적으로 정의된 값들의 목록을 저장한다.

예를 들어, 국가 코드를 기준으로 샤딩하면,
각 국가의 데이터는 해당 국가 코드에 매칭된 샤드에 저장된다.

지리적 샤딩

데이터베이스의 위치를 기반으로한 샤딩 방법이다.

데이터를 위치에 따라 분할하여,
지리적으로 가까운 곳에서 데이터 액세스를 빠르게 만드는 것이 주 목적이다.

예를 들어, 북미 사용자의 데이터는 북미에 위치한 서버에,
유럽 사용자의 데이터는 유럽에 위치한 서버에 저장될 수 있다.

이 방식은 지연 시간을 줄이고, 법률 및 규정(데이터 주권 등)을 준수하는데 도움을 줄 수 있다.

샤딩은 일반적으로 DBMS가 지원하는 기능이 아니다.
그래서 ORM을 사용하거나 DB에 접근하는 서버에서 구현해주는 작업이 필요하다.

자바의 경우 AbstractRoutingDataSource를 구현함으로써 풀어낼 수 있다.

필요하다면 아래 우아한형제들 기술 블로그를 참고하자.
Spring AOP를 활용해서 샤딩 기능을 독립적인 관점으로 구현하였다.

디렉터리 샤딩

디렉토리 서비스가 어느 샤드에 어떤 데이터가 있는지를 추적한다.

사용자가 데이터를 요청하면,
디렉토리 서비스는 해당 데이터가 어느 샤드에 위치해 있는지를 가리키는 정보를 제공한다.

이 방식은 샤드간에 데이터를 재분배할 때 유용하다.

하지만 디렉토리 서비스 자체가 병목 현상을 일으키거나,
장애 지점이 될 수 있으므로 이에 대한 관리가 중요합니다.

복합 샤딩

복합 샤딩은 위의 방법들을 결합한 형태이다.

예를 들어, 먼저 해시 샤딩을 수행한 다음,
각 해시 범위 내에서 추가적인 범위 샤딩을 수행할 수 있다.

샤딩의 대안

데이터베이스 샤딩은 애플리케이션의 워크로드를 공유할 추가 노드,
또는 컴퓨터를 할당하는 수평 조정 전략이다.

즉, 컴퓨터 중에 하나에서 장애가 발생하더라도 대체 샤드를 사용함으로써
애플리케이션의 중단 없이 작동시킬 수 있다.

단, 샤딩은 여러 조정 전략 중에 하나이다.
다른 전략도 살펴보자.

수직 조정

수직 조정은 단일 시스템의 컴퓨팅 파워를 높이는 것을 말한다.

예를 들어, IT 팀이 증가하는 트래픽을 처리하기 위해
데이터베이스 서버에 CPU, RAM 및 하드 디스크를 추가하는 경우가 있다.

샤딩과 수직 조정의 비교

수직 조정은 비용이 적게 들지만,
수직적으로 조정할 수 있는 컴퓨팅 리소스에는 제한이 있다.

반면 수평 조정 전략인 샤딩은 구현하기가 더 쉽습니다.

IT 팀이 오래된 컴퓨터 하드웨어를 업그레이드하는 대신,
여러 대의 컴퓨터를 설치하는 경우를 예로 들 수 있습니다.

복제(Replication)

복제는 데이터베이스와 정확히 일치하는 복사본을 만들어 여러 컴퓨터에 저장하는 기법이다.
복제는 분산 컴퓨팅 시스템에 흔히 사용되는 방식이다.

데이터베이스 설계자는 복제를 사용하여
내결함성을 갖춘 관계형 데이터베이스 관리 시스템을 설계할 수 있다.

데이터베이스를 호스팅하는 컴퓨터 중 하나에 장애가 발생해도 다른 복제본은 계속 작동한다.

샤딩과 복제(Replication)의 비교

데이터베이스 샤딩은 동일한 정보의 복사본을 생성하지 않는다.
대신 하나의 데이터베이스를 여러 부분으로 분할하여 서로 다른 컴퓨터에 저장한다.

복제와 달리 데이터베이스 샤딩 자체는 고가용성을 제공하지 않는다.
샤딩을 복제와 함께 사용하면 확장성과 고가용성을 모두 실현할 수 있다.

고가용성
샤딩은 데이터를 여러 서버나 클러스터에 분할하여 저장하므로,
특정 서버나 클러스터에 장애가 발생하면 해당 샤드에 저장된 데이터에 액세스할 수 없게 된다.
이는 샤딩이 자체적으로 고가용성을 제공하지 않음을 의미한다.

분할(파티셔닝)

파티셔닝은 데이터베이스 테이블을 여러 그룹으로 분할하는 프로세스이다.
파티셔닝은 2가지 유형으로 분류된다.

  • 수평 파티셔닝 : 행 별로 분할
  • 수직 파티셔닝 : 열 별로 분할

샤딩과 분할(파티셔닝)의 비교

데이터베이스 샤딩은 수평 파티셔닝과 같다.

두 프로세스 모두 데이터베이스를 여러 개의 고유 행 그룹으로 분할힌다.
파티셔닝은 모든 데이터 그룹을 동일한 컴퓨터에 저장하지만,
샤딩서로 다른 컴퓨터에 분산합니다.

참고

profile
열정, 끈기, 집념의 Frontend Developer
post-custom-banner

0개의 댓글