목차
Data(Base) 분산
데이터를 한 곳에 저장한다면 관리에 용이하다. 다만, 데이터가 늘어갈수록 용량 및 성능에 지장이 생긴다.
다음은 이를 막기 위한 DB 분산 전략이다.
- 복제(Replication) : 전체 데이터베이스 또는 그 하위 집합을 여러 서버에 복사하여 각 서버가 읽기 요청을 독립적으로 처리할 수 있도록 분산. 한 서버의 데이터에 대한 모든 변경 사항은 다른 서버로 전파하여 처리한다.
- 페더레이션(Federation) : 사용자 기반의 서로 다른 부분을 제공하는 여러 개의 작은 데이터베이스로 구성된 데이터베이스 생성
- 파티셔닝(Partitioning), 샤딩(Sharding) : 데이터베이스를 작은 부분으로 나누어 분산 저장하는 방식
현대에서는 3번 방식을 주로 사용한다. 시스템의 특성에 따라 각 방식을 혼재해서 사용할 수도 있다.
오늘은 3번에 대해 다룬다. RDBMS 기준으로 작성했지만, DB 전체 범위에 적용되는 방법론이라고 한다.
파티셔닝(Partitioning)
특정 기준에 따라 같은 서버에 데이터를 분리하는 기법이다. 수직적/수평적 파티셔닝으로 구분된다.
Normalization (정규화)과의 차이점?
정규화는 주로 설계 단계에서의 데이터의 정형화, 중복/이상현상 방지 등 일관성 보장을 위한 기법이다.
파티셔닝은 이미 정규화가 된 DB를 대상으로하는 성능 최적화를 위한 기법이다.
수직 파티셔닝 (Vertical Partitioning)
컬럼을 분할하여 여러 개의 테이블로 나눈다.
성능 개선, 민감한 컬럼 분리, 비주류 컬럼 분리 등의 이점이 있다.
List Partitioning
속성의 값에 따라 구분한다. 성별 속성으로 나눈다면, 남자, 여자 등으로 구분한다.
Range Partitioning
속성의 범위에 따라 구분한다. 날짜 속성으로 나눈다면, 1~2월, 3~4월 등으로 구분한다.
Hash Partitioning
속성의 해시 값에 따라 구분한다. 적절한 해시 함수를 사용해야 할 것이며, 여러 컬럼을 사용하는 것은 권장하지 않는다.
Composite Partitioning
위의 방식들을 혼재해서 사용한다.
수평 파티셔닝 (Vertical Partitioning)
로우를 분할하여 여러 개의 테이블로 나눈다.
이전 데이터 분리로 DML의 성능이 향상된다.
데이터의 기간별로 구분할 수도 있고, 데이터의 사용 빈도로 구분할 수도 있다.
샤딩 (Sharding)
동일한 스키마를 가진 데이터를 다른 서버에 분리하는 기법이다. 샤딩으로 분리한 데이터 단위를 샤드라고 칭한다.
대규모 서비스에서 주로 사용하며, Scale-up의 한계로 인한 Scale-out 방식의 기법이다.
데이터 규모가 큰 테이블 혹은 많은 트래픽이 몰리는 저장소에 사용한다.
수직 파티셔닝과의 차이?
단편적으로는,
같은 서버에 분리하냐, 여러 서버에 분리하냐의 차이이다. (혹은 다른 물리적 단위)
목적으로는,
파티셔닝은 접근 패턴에 따라 데이터를 효율적 분리/관리 하는 것에 중점을 둔다.
샤딩은 데이터 저장소를 분리하여 부하 분산 및 확장성을 향상 하는 것에 중점을 둔다.
(물론 두 방식을 혼재할 수도 있고, 부하 분산을 위해 파티셔닝을 할 수도 있다. 언제나 선택은 개발자의 몫이다.)
샤딩 기법
클러스터링에서 사용한 대부분의 기법들은 샤딩에서도 적용할 수 있다. 기법은 "어떤 기준으로 나눌지" 이고, 클러스터링과 샤딩은 구분은 "무엇을 위해 나눌지", "어디에 나눌지" 이기 때문이다.
파티셔닝과 샤딩의 단점
데이터 분산 관리 하는데서 오는 조인의 복잡성, 무결성 유지의 어려움 등이 있다.
샤딩은 물리적 저장소까지 분리되기 때문에, 분산 서버의 통신에 대해서도 고려해야 한다.