들어가며
작은 규모의 시스템은 기술 스택과 구조에 대한 차이가 어떤 임팩트를 가져올지에 대해 생각하기 어렵습니다. 점점 볼륨이 커지면서 생각지 못했던 여러 가지 문제가 발생하게 되는데요. 특히 속도와 확장성에 대한 고민은 필연적입니다. 데이터가 쌓일수록 데이터베이스의 읽기/쓰기의 성능은 감소하고 병목 지점이 됩니다.
데이터베이스 파티셔닝, 샤딩, 레플리케이션은 대규모 데이터베이스 시스템에서 확장성을 높이기 위해 사용되는 기술들입니다. 각각의 기술은 데이터의 분산, 복제, 분할 등을 통해 데이터베이스 시스템의 성능과 가용성을 향상하는데 목적이 있습니다. 오늘은 이러한 문제를 해결하는 기법의 개념과 종류 그리고 차이점에 대해서 알아보려 합니다.
💡 고가용성
서버와 네트워크, 프로그램 등의 정보 시스템이 지속적, 안정적으로 운영되는 특성
데이터베이스 분산 기법
위와 같은 데이터베이스를 구축하여 운영 중이라고 가정합니다. 문제없이 운영 중이었지만 서비스의 크기가 증가하게 되면 성능이슈가 발생하게 될 수 있습니다. 이때 위 테이블의 성능을 개선하기 위한 작업을 예시로 들어봅니다.
파티셔닝, Partitioning
데이터베이스 파티셔닝은 데이터베이스의 테이블을 분할하여 분산 저장하는 기술입니다. 파티셔닝을 사용하면 데이터베이스의 용량이 증가해도 처리량이 유지될 수 있으며, 데이터의 논리적 분할에 따라 분산 처리를 수행할 수 있습니다. 이러한 기술은 수직 파티셔닝과 수평 파티셔닝 두 가지 방법으로 구현될 수 있습니다.
수직 파티셔닝, Vertical
수직 파티셔닝은 테이블의 Column을 분할하여 여러 개의 서로 다른 테이블로 나누는 방법입니다.
성능 개선 이외에도 이미 정규화가 되어있는 테이블을 퍼포먼스를 위해서, 또는 민감한 정보에 제한을 걸어서 접근을 방지하기 위해서, 자주 사용되지 않는 Column을 모으기 위해서 수직 파티셔닝을 수행할 수 있습니다.
수평 파티셔닝, Horizontal
데이터베이스에서 테이블의 Row를 분할하여 여러 개의 서로 다른 테이블로 나누는 방법입니다. 주로 데이터베이스의 용량이 커지면서 성능 저하를 막기 위해 사용됩니다.
파티셔닝은 DML( 데이터 조작어, SELECT, INSERT, UPDATE, DELETE )의 성능이 개선되고 유지보수성, 가용성이 향상된다는 장점이 있지만 join 복잡도가 증가하는 것과 분산으로 관리와 무결성 유지가 어려워지는 단점이 있습니다.
파티셔닝 범위
1. 범위 분할, Range Partitioning
- 연속적인 값을 범위를 기준으로 하여 분할
- 우편 번호, 날짜, 분기 등의 데이터에 적합
2. 목록 분할, List Partitioning
- 데이터 값이 특정 목록에 포함된 경우 데이터를 분리
- 나라, 지역 등의 데이터에 적합
3. 해시 분할, Hash Partitioning
- Key값 등 특정 Column의 값을 Hashing 하여 분할
- 균등한 데이터 분할이 가능
- 범위가 없는 데이터에 적합
4. 합성 분할, Composite Partitioning
- 위 종류 중 2개 이상을 사용하여 분할
샤딩, Sharding
샤딩은 동일한 스키마를 가지고 있는 데이터를 다수의 데이터베이스에 분산하여 저장하는 기법입니다.
어떻게 보면 샤딩은 수평 파티셔닝과 비슷하지만 차이점은 수평 파티셔닝의 경우 동일한 서버에 저장되어 있지만 샤딩은 서로 다른 서버에 분산하여 저장한다는 점입니다. 따라서 쿼리 성능 향상뿐만 아니라 부하가 분산되는 효과까지 얻을 수 있습니다. 즉, 샤딩은 데이터베이스 차원의 수평 확장( scale-out )입니다.
위처럼 모든 파티션을 같은 DB 서버에 저장하는 수평 파티셔닝과 다르게 샤딩은 각 파티션들을 서로 다른 DB 서버에 저장함으로서 DB서버의 부하( Load )를 분산시키는 목적이 있습니다. 이때 파티션 키( Partition Key )를 샤드 키( Shard Key )라고 부르고 각 파티션을 샤드( Shard )라고 부릅니다. 규모가 큰 서비스, 데이터가 많이 쌓이는 테이블, 트래픽이 많이 몰리는 경우에 사용합니다.
레플리케이션, Replication
레플리케이션은 데이터베이스 시스템에서 데이터의 복제를 통해 데이터베이스의 가용성과 안정성을 높이는 기술입니다. 레플리케이션을 사용하면 데이터베이스 시스템에서 발생한 데이터의 변경 사항을 여러 대의 서버에 동일하게 복제하여 데이터 손실을 방지하고, 읽기 작업의 성능을 높일 수 있습니다.
원본의 서버는 Master / Primary / Leader 등으로 불리며 복제된 서버는 Slave / Secondary / Replica 등으로 불립니다. 복제된 서버는 한대 이상의 서버가 있을 수 있습니다.
Leader 데이터베이스에 장애가 발생할 경우 Replica를 Leader로 승격시켜 빠른 서비스 복구가 가능하다는 장점이 있지만 서버가 다르기 때문에 동기화에 대한 어려움이 있습니다.
같이 보면 좋은 글
Reference