https://techblog.woowahan.com/2687/ https://aws.amazon.com/ko/what-is/database-sharding/

데이터와 쿼리가 증가함에 따라 성능이 저하되고, 전체 테이블 스캔과 같은 비효율적인 작업이 발생할 수 있다. 수직 확장은 비용이 비싸고 물리적 한계로 인해 확장성이 떨어진다. 단일 데이터베이스를 사용하면 장애 발생 시 전체 서비스가 중단되는 SPOF(Single Point of Failure) 문제가 생기며, 데이터 양이 많아질수록 백업과 복구 시간이 길어져 운영 관리가 복잡해진다.

이러한 문제를 샤딩을 통해 해결할 수 있다.

샤딩은 데이터베이스를 여러 개의 작은 단위(샤드)로 분할하여 각각 독립된 데이터베이스에 저장하는 기술이다. 특정 기준(샤드 키)에 따라 데이터를 나누고, 애플리케이션은 이 기준을 기반으로 필요한 샤드에 접근한다.

샤딩을 도입하면 데이터가 분산 저장되어 데이터 양이 증가하더라도 성능을 유지할 수 있고, 확장성이 크게 개선된다. 각 샤드가 독립적으로 작동하므로 수평 확장이 용이하며, 특정 샤드에서 장애가 발생하더라도 전체 시스템에 미치는 영향을 최소화할 수 있다.

모듈러 샤딩 (Modular Sharding)

모듈러 샤딩은 PK를 샤드 개수로 나눈 나머지 값을 기반으로 데이터를 저장할 샤드를 결정하는 방식이다. 예를 들어, PK가 123이고 샤드가 3개라면 123 % 3 = 0이므로 첫 번째 샤드에 데이터가 저장된다. 이 방식은 데이터를 균등하게 분산시킬 수 있어 각 샤드의 부하를 비슷하게 유지할 수 있다는 장점이 있다.

하지만, 샤드를 추가하는 경우 모듈러 연산의 기준(샤드 개수)이 바뀌면서 기존 데이터를 재분배해야 하는 데이터 재정렬 비용이 발생할 수 있다. 예를 들어, 샤드가 3개에서 4개로 늘어나면 이전에 저장된 데이터의 저장 위치가 모두 변경되므로, 이를 재배치하는 작업이 필요하다. 이러한 특성 때문에 모듈러 샤딩은 데이터량이 일정하거나 증가 속도가 느린 경우에 적합하다.

레인지 샤딩 (Range Sharding)

레인지 샤딩은 PK의 특정 범위를 기준으로 데이터를 저장할 샤드를 결정하는 방식이다. 예를 들어, 샤드 1은 PK가 1~1000, 샤드 2는 1001~2000과 같이 설정할 수 있다. 이 방식은 샤드를 추가하거나 증설할 때 기존 데이터를 재배치할 필요가 없다는 점에서 운영 비용이 낮고 확장성이 뛰어나다는 장점이 있다.

그러나 데이터 분포가 균일하지 않을 경우, 특정 샤드에 데이터와 트래픽이 몰리는 Hot Spot Issue가 발생할 가능성이 있다. 예를 들어, 최근 생성된 데이터가 특정 샤드에 집중될 경우 부하 분산을 위해 해당 샤드를 분리하거나 조정해야 하는 추가 작업이 필요하다. 따라서 레인지 샤딩은 데이터가 빠르게 증가하거나, 트래픽 패턴이 예측 가능한 환경에 적합한 방식이다.