[데이터베이스] 샤딩(Sharding)
Sharding이란?
하나의 데이터베이스 데이터가 커지게 되면 병목현상, 용량 부족 등의 성능에 안좋은 영향을 미치게 된다. 또한 이 문제들은 실제 서비스의 CRUD를 느리게 만드는 원인이 되고 사용자 경험까지 영향을 준다. 이런 문제를 해결하기 위해 사용되는 것이 샤딩이다.
샤딩은 데이터베이스를 작은 그룹들로 나누고 데이터들 또한 각 데이터베이스에 나누어 분할하는 것을 의미한다. 각 분할된 부분을 샤드라고 하고 여러 데이터베이스 서버에 분할하여 저장함으로써 부하 문제를 해결한다.
파티셔닝의 수평 분할(Horizontal partitioning)을 생각해 볼 수 있는데, 수평 분할이 하나의 데이터베이스 내에서 테이블의 데이터를 분할하는 방식이었다면 샤딩은 분할된 데이터를 다수의 데이터베이스에 보관한다.
샤딩의 장점
- 응답 시간 개선
- 단일 데이터베이스에서는 크기가 커질수록 조회 속도에 걸리는 시간이 증가하게 된다. 하지만 샤딩을 통해 데이터를 분산하여 쿼리 시 소요되는 시간을 줄일 수 있다.
- 서비스 중단 방지
- 단일 데이터베이스의 경우 호스팅 컴퓨터에 장애가 발생할 경우 서비스가 중단될 수 있다. 하지만 샤딩을 사용한다면 각 서버에 샤드가 따로 존재하기 때문에 문제가 발생된 샤드 외에는 정상적인 서비스가 가능하다.
- 효율적인 크기 조정
- 데이터베이스의 크기가 증가하게 되면 한계 용량에 다다르게 된다. 이 경우 샤딩을 통해 데이터베이스의 수평적 확장을 진행할 수 있다. 서비스를 종료하지 않고 런타임에서 샤드를 추가할 수도 있다.
샤딩의 단점
- 데이터의 분포가 샤드마다 달라 특정 샤드에 더 많은 데이터를 수신할 수 있다.
- 데이터베이스의 샤딩은 운영에서 복잡성을 증가시킨다. 다수의 데이터베이스를 관리해야하기 때문에 분석과 같은 작업을 진행할 경우 데이터 취합하는 과정이 더 복잡할 수 있다.
- 물리적으로 샤드를 추가하게 될 수록 PC를 추가하는 것이기 때문에 비용이 증가하게 된다.
- 대부분의 DBMS에는 샤딩 기능이 내장되어 있지 않으므로, DBA와 개발자가 직접 다수의 데이터베이스를 분리하고 데이터를 분산, 관리해야 한다. 따라서 애플리케이션의 복잡성이 증가하게 된다.
샤딩의 작동 방식
샤드
분할된 데이터의 청크를 논리적 샤드라 하며, 이런 논리적 샤드를 저장하는 시스템을 물리적 샤드 또는 데이터베이스 노드라고 한다. 논리적 샤드는 물리적 샤드 내에 여러개가 존재할 수 있다.
샤드 키
샤드 키는 어떻게 데이터를 분할하고 각 샤드에 어떻게 할당할 지를 정하는 키다. 샤드 키는 데이터의 분산 정도, 쿼리 성능, 샤드 간 데이터 이동 등에 영향을 미친다.
데이터 분할 및 할당
샤드 키를 선택한 후엔 해당 샤드 키를 기준으로 샤드를 분할하고 각 샤드에 데이터를 할당한다. 각 샤드는 독립적인 데이터베이스로 작동하게 되어, 독립적인 처리를 수행할 수 있게 된다.
데이터베이스에 쿼리를 수행할 때, 샤드 키가 어떤 샤드에 접근해야 하는지를 결정한다.
쿼리의 조건이 다른 샤드들을 탐색해야 하는 경우라면 추가적인 로직이 필요하다. 각각의 샤드는 독립적인 데이터베이스로 작동하기 때문에 해당 쿼리처럼 여러 샤드를 탐색해야 한다면 복잡성이 증가하고 오히려 성능이 저하될 수 있다.