데이터베이스 샤딩을 이해하기 위한 입문서

게시 됨: 2022-11-05

웹사이트를 만드는 것은 인터넷에서 귀하의 존재를 설정하는 첫 번째 단계입니다. 장기적으로 번창하려면 사이트가 성장에 맞게 확장될 수 있는지도 확인해야 합니다. 그리고 첫 번째 단계 중 하나는 귀하와 함께 확장할 수 있는 데이터베이스를 구현하는 것입니다. 그렇지 않으면 쿼리 성능이 느려지고 데이터베이스가 중단될 위험이 있습니다.

이 게시물에서는 데이터베이스 샤딩을 사용하여 데이터의 높은 확장성과 가용성을 달성하는 방법에 대해 설명합니다. 또한 샤딩의 단점과 사용할 수 있는 다양한 샤딩 아키텍처에 대해서도 설명합니다.

데이터베이스 샤딩이란 무엇입니까?

샤딩은 다른 데이터베이스 서버에 테이블을 분산하는 최적화 기술입니다. 이는 둘 다 데이터를 더 작은 하위 집합으로 나누는 것을 포함한다는 점에서 분할과 같습니다. 차이점은 분할은 이러한 하위 집합을 다른 서버에 배포하는 반면 분할은 하나의 데이터베이스에 저장한다는 것입니다. 이러한 서버는 동일한 데이터베이스 엔진 및 하드웨어 유형을 사용하여 모든 샤드에 대해 유사한 성능 수준을 달성합니다.

샤딩은 무공유 아키텍처를 달성하여 처리 병목 현상과 단일 실패 지점을 제거하는 것을 목표로 합니다.

데이터베이스 샤딩을 설명하는 그림입니다.
샤딩의 예. (이미지 출처: Analytics Vidhya)

수평 및 수직의 두 가지 방법으로 샤딩을 구현할 수 있습니다. 수평 샤딩은 행을 기준으로 테이블을 나누는 반면 수직 샤딩은 열을 기준으로 테이블을 나눕니다.

이와 관련하여 샤딩은 큰 테이블을 작은 테이블로 나누는 파티셔닝과 같습니다.

수평 분할은 데이터(이름, 주소, 이메일 등)를 한 번에 반환하는 고객 데이터베이스와 같이 대부분의 쿼리가 행의 하위 집합을 반환하는 데이터베이스에 효과적입니다.

수직 분할은 쿼리가 단일 열을 반환하는 데이터베이스에 효과적입니다. 예를 들어 고객 데이터베이스가 고객의 이름이나 이메일을 별도로 반환한 경우 이름과 이메일을 다른 클러스터로 분리할 수 있습니다.

데이터베이스 샤딩의 이점

다음은 데이터베이스 샤딩의 장점 중 일부입니다.

향상된 수평 확장

데이터베이스를 수직 또는 수평으로 확장할 수 있습니다. 수직적 확장은 성능 향상을 위해 서버에 더 많은 CPU(중앙 처리 장치)와 RAM(RAM)을 추가하는 것을 의미합니다. 수직 확장은 중소 규모 데이터베이스에 유용한 솔루션입니다. 그러나 데이터가 증가하면 수직 확장이 불가능해집니다. 단일 서버에 추가할 수 있는 기능은 매우 많습니다.

수평 확장은 더 유연합니다. 시스템에 더 많은 서버를 추가하여 필요에 따라 데이터베이스를 확장할 수 있습니다. 이러한 각 서버는 서로 다른 데이터베이스 샤드에 리소스를 제공합니다. 이렇게 하면 작업 부하가 분산되고 더 많은 요청을 처리할 수 있는 시스템 기능이 향상됩니다.

더 빠른 쿼리 응답 시간

샤드에는 몇 개의 행과 열만 있습니다. 이 때문에 데이터베이스 쿼리를 처리하는 데 시간이 덜 걸립니다. 대조적으로, 샤딩되지 않은 데이터베이스의 쿼리는 수백 또는 수천 개의 행을 검색해야 할 수 있습니다.

정전 상황에서 안정성 향상

데이터베이스 중단은 우발적인 데이터 삭제, 연결 오류, 사이버 보안 공격 등 다양한 이유로 발생합니다. 샤딩은 중단의 영향을 최소화합니다. 각 샤드는 자율적이므로 영향을 받는 샤드만 가동 중지됩니다. 예를 들어, 4개의 샤드가 있고 그 중 하나에서 중단이 발생하면 작업의 25%만 영향을 받습니다.

샤딩의 단점

샤딩은 데이터베이스의 안정성과 가용성을 향상시키지만 구현하는 것은 복잡합니다. 잘못된 샤딩 아키텍처를 사용하면 성능이 저하되고 데이터가 손실될 수 있습니다.

모든 샤드에 걸쳐 균형 잡힌 데이터 배포를 허용하는 샤딩 기술을 선택해야 합니다. 이 균형이 없으면 한 샤드가 대부분의 데이터를 저장하고 다른 샤드가 거의 비어 있을 때 발생하는 데이터베이스 핫스팟을 생성할 위험이 있습니다. 이는 단일 샤드에 대한 쓰기 처리량을 줄입니다.

이 문제를 해결하기 위해 불균형 샤드를 더 분할할 수 있지만 이 프로세스는 까다롭고 데이터를 마이그레이션하는 동안 데이터베이스가 다운될 수 있습니다.

샤딩의 또 다른 단점은 다른 샤드의 여러 테이블과 관련된 SQL 조인이 너무 느려지고 성능이 저하될 수 있다는 것입니다. 그러나 올바른 아키텍처를 사용하면 이 문제를 피할 수 있습니다.

샤딩 아키텍처

세 가지 아키텍처를 사용하여 샤딩을 구현할 수 있습니다.

  • 키 기반 샤딩
  • 범위 기반 샤딩
  • 디렉토리 기반 샤딩

선택하는 아키텍처는 사용 사례에 따라 다릅니다.

키 기반 샤딩

키 또는 해시 기반 샤딩 아키텍처에서 데이터베이스 애플리케이션은 샤드 키를 사용하여 샤드를 찾습니다. 해싱 함수는 샤딩 키 값을 해시하고 출력은 데이터를 특정 샤드에 매핑합니다. 간단한 해싱 함수는 키의 모듈러스와 샤드의 수일 수 있습니다.

해시 함수는 하나 이상의 샤딩 키를 사용할 수 있습니다. 이 때문에 키 기반 샤딩은 공유 키가 있을 수 있는 데이터 레코드에 적합합니다. 데이터를 알고리즘적으로 배포하면 한 샤드에 다른 샤드보다 더 많은 데이터가 포함된 데이터베이스 핫스팟이 생성될 가능성이 최소화됩니다.

그러나 분산은 해싱 함수에만 의존하기 때문에 논리적으로 데이터를 그룹화하는 것은 불가능합니다. 따라서 여러 샤드의 데이터가 필요한 데이터베이스 작업은 각 샤드에서 데이터를 읽어야 하므로 비효율적일 수 있습니다.

범위 기반 샤딩

범위 기반 샤딩에는 지정된 값 범위에 따라 데이터베이스 샤딩이 포함됩니다.

샤딩 키를 사용하여 값을 할당할 샤드를 결정합니다. 데이터베이스 응용 프로그램은 룩업 테이블에서 샤딩 키에 해당하는 샤드를 확인하고 데이터를 저장합니다. 이 때문에 범위 기반 샤딩은 설계 및 구현이 쉽습니다.

예를 들어 사용자 데이터베이스의 사용자 ID 값을 샤딩 키로 사용할 수 있습니다. ID가 0-2,000인 사용자를 한 샤드에, 2,000-4,000 사이의 사용자를 다른 샤드에 저장할 수 있습니다.

범위 기반 샤딩은 데이터베이스 핫스팟을 유발할 수 있습니다. 대부분의 사용자 ID가 2,001에서 4,000 사이에 있는 사용자 데이터베이스를 고려하십시오. 프로세스는 그것들을 단일 샤드에 할당하여 시간이 지남에 따라 불균형을 만듭니다. 따라서 범위 기반 샤딩은 고르게 분산된 데이터에 가장 적합합니다.

디렉토리 기반 샤딩

디렉터리 기반 샤딩은 논리적으로 관련된 데이터를 동일한 샤드에서 그룹화합니다. 데이터베이스의 각 엔터티에 대한 매핑 목록이 포함된 조회 테이블을 사용합니다. 각 매핑은 데이터베이스 샤드에 해당합니다.

디렉터리 기반 샤딩은 데이터를 샤드에 동적으로 추가할 수 있기 때문에 범위 기반 또는 키 기반 샤딩보다 더 유연합니다. 따라야 할 샤딩 기능이나 범위 내에서 값을 지정할 수 없습니다. 이러한 유연성은 데이터베이스 효율성을 높입니다. 관련 데이터를 하나의 샤드에 저장할 수 있습니다. 즉, 일반 쿼리를 실행하는 데 시간이 덜 걸립니다.

예를 들어 디렉터리 기반 샤딩을 사용하고 위치에 따라 사용자를 그룹화하여 특정 위치에서 사용자를 검색하는 경우 단일 샤드만 쿼리합니다.

Kinsta를 사용한 데이터베이스 샤딩

대부분의 최신 데이터베이스 엔진은 데이터베이스 샤딩 지원을 제공합니다. 이러한 데이터베이스 엔진 중 하나는 상업적으로 지원되는 MySQL 포크인 MariaDB입니다. IBM, GitHub 및 Wikimedia와 같은 회사에서 채택한 고성능 오픈 소스 데이터베이스 시스템입니다. 또한 Kinsta의 고성능 서버 스택의 일부입니다.

MariaDB는 스파이더 스토리지 엔진을 통해 내장된 샤딩 기능을 제공합니다. 스파이더 스토리지 엔진은 파티셔닝 및 확장 아키텍처(XA) 트랜잭션을 지원하는 클러스터 형성 엔진입니다. 이를 통해 서로 다른 인스턴스의 원격 테이블을 동일한 인스턴스에 있는 것처럼 처리할 수 있습니다. 스파이더 스토리지 엔진에서 테이블을 생성하면 테이블은 원격 MariaDB 서버의 다른 테이블에 연결됩니다. 연결이 설정되면 스토리지 엔진은 동일한 트랜잭션의 일부인 모든 테이블과 링크를 공유합니다.

요약

데이터베이스 샤딩은 테이블을 더 작은 하위 집합으로 분할하고 샤드라고 하는 다른 서버에 배포하는 확장 기술입니다. 키 기반 샤딩, ​​범위 기반 샤딩, ​​디렉터리 기반 샤딩 등 다양한 수단을 통해 샤딩을 구현할 수 있다.

샤딩은 데이터베이스의 확장성, 안정성 및 가용성을 개선하지만 구현하기가 매우 복잡합니다. 또한 샤드를 생성하면 데이터베이스를 샤딩되지 않은 상태로 되돌리기가 쉽지 않습니다. 이 때문에 다른 확장성 옵션이 작동하지 않을 것이라고 확신하는 경우에만 최적화를 위해 샤딩을 사용하십시오.

귀하의 비즈니스가 비영리 조직이든 엔터프라이즈 수준의 사업이든 상관없이 Kinsta의 전문 솔루션은 사이트 호스팅에 대한 걱정을 없애고 가장 중요한 일에 집중할 수 있도록 합니다.