처리량이 매우 높다면 파티션으로 쪼갤 필요가 있다.
이러한 작업을 샤딩이라고한다.
파티션을 나눌 때는 보통 각 데이터 단위(레코드, 로우, 문서)가 하나의 파티션에 속하게 한다. 여러 파티션을 동시에 건드리는 연산을 지원할 수 있지만, 결과적으로 각 파티션은 그 자체로 작은 데이터베이스가 된다.
파티셔닝을 원하는 주된 이유는 확장성이다. 비공유 클러스터에서 다른 파티션은 다른 노드에 저장될 수 있다. 따라서 여러 디스크에 분산 시켜 질의 부하를 여러 프로세서에 분산시킬 수 있다.
단일 파티션에 실행되는 질의를 생각해보면, 독립적으로 실행할 수 있으므로 노드를 추가함으로써 질의 처리량을 늘릴 수 있다. (Scale out)

파티셔닝의 목적
A 파티션이 B 파티션보다 데이터가 많거나 질의를 많이 받는 파티션이 있다면 쏠렸다(skewed)고 말한다.
레코드를 할당할 노드를 무작위로 선택하면 핫스팟을 피할 수 있다. 하지만 어떤 레코드를 읽으려고 할 때 레코드가 어느 노드에 저장되어있는지 찾기 위해 모든 노드에서 병렬적으로 질의를 실행해야 한다.
방법 하나는 각 파티션에 연속된 범위의 키를 할당하는 것이다.
범위들 사이의 경계를 알면 어떤 키가 어느 파티션에 속하는지 알 수 있다.

파티션 경계는 관리자가 수동으로 하거나, 자동으로 DB가 선택하게 할 수 있다.
각 파티션 내에서는 키를 정렬된 순서로 저장할 수 있다.
장점
key로 사용하게 되면 범위 스캔이 매우 유용하다.단점
key라면 파티션은 시간 범위에 대응된다.키의 첫 번째 요소로 타임스탬프가 아닌 다른 것을 사용해야 한다.
키의 파티션을 정하는 데 해시 함수를 사용한다.
해시 함수는 쏠린 데이터를 입력으로 받아 균일하게 분산되게 한다. 해시 함수를 사용하면 입력 문자열이 거의 유사해도, 해시값은 숫자 범위 내에서 균일하게 분산된다.
해시 함수를 정한 후 해시값 범위를 할당하고 해시값이 파티션의 범위에 속하는 모든 키를 파티션에 할당하면 된다.
파티션 경계
일관성 해싱
CDN과 같이 인터넷 규모의 캐시 시스템에서 부하를 균등하게 분산시키는 방법.
단점
카산드라
핫스팟은 완벽히 제거할 수 없다. 항상 동일한 키를 읽고 쓰는 극단적인 상황에서는 모든 요청이 동일한 파티션으로 쏠리게 된다.
ex) 유명인 A의 게시글에 많은 사람들이 댓글을 달 경우 -> A게시글의 해싱 값을 계속 사용하기 때문에 핫스팟이 생긴다.
이러한 경우 애플리케이션에서 완화시켜야 함. 가장 간단한 해결책은 키의 시작이나 끝에 임의의 숫자를 붙이는 것이다. 한 키에 대한 쓰기 작업을 다른 키로 균등하게 분산시키고 그 키들은 다른 파티션으로 분산될 수 있다.(????)
다른 키에 쪼개서 쓰면 읽기를 실행할 때 추가적인 작업이 필요하다.
트레이드 오프를 잘 고려하여 필요한 부분에만 적용시키는 것이 좋다. 아무곳이나 적용하면 오버헤드가 발생하고, 어디에도 적용하지 않으면 핫스팟이 발생함.
보조 색인은 레코드를 유일하게 식별하는 용도가 아닌, 특정한 값이 발생한 항목을 검색하는 수단이다.
ex)
보조 색인은 RDB에선 핵심이며, 문서 DB에서도 흔하다. 또한 ELK나 솔라 같은 전문 검색에서는 존재의 이유다.
보조 색인은 2가지 방법으로 나뉜다.

이렇게 하면 각 파티션이 완전히 독립적으로 동작한다. 각 파티션은 자신의 보조 색인을 유지하며, 그 파티션에 속하는 문서만 담당한다. 다른 파티션은 전혀 신경쓰지 않을 수 있다.
지역 색인(Local Index)이라고도 부름
하지만 이렇게 할 경우 모든 파티션에 질의를 보내 얻은 결과를 모아야 한다. 이러한 방식을 스캐터/개더(scatter/gather) 라고 한다. 스캐터/개더는 꼬리 지연 시간이 증폭하기 쉽다.
대부분은 단일 파티션에서만 사용하도록 하는것을 권장하며 많은 DB에서 이러한 방식을 사용한다.
자신만의 보조 색인을 갖게하는 대신, 모든 파티션의 데이터를 담당하는 전역 색인을 만들 수 있다.
이러한 색인을 파티셔닝 할 때 용어의 해시값을 사용할 수도 있다.
장점
단점
시간이 지나면 DB에 변화가 생기게 된다.
이러한 경우 요청을 A 노드에서 B 노드로 옮겨야 한다. A가 담당하던 부하를 B로 옮기는 과정을 재균형화(Rebalancing) 라고 한다.
최소 요구사항
노드 개수 N이 바뀌게 되면 키가 노드 사이에서 옮겨져야 된다는 문제가 있다. 키가 자주 이동하게 되면 재균형화 비용이 지나치게 커진다.
데이터를 필요 이상으로 이동하지 않는 방법이 필요하다.
해결책 : 파티션을 노드 대수보다 많이 만들고, 각 노드에 여러 파티션을 할당
클러스터에 노드가 추가되면 새 노드는 파티션이 다시 균일하게 분배될 때까지 기존 노드에서 파티션 몇 개를 뺏어올 수 있다. 클러스터에서 노드가 제거되면 이 과정이 반대로 실행된다.
파티션은 노드 사이에서 통째로 이동하기만 한다. 파티션 개수는 변하지 않고, 파티션에 할당된 키도 변경되지 않는다. 하지만 네트워크를 통해 대량의 데이터를 전송해야 하므로 시간이 많이 걸린다.

이러한 방식을 사용하게 되면 처음 DB를 구축할 때 파티션 개수가 고정되고 이후엔 변하지 않는다.
처음 설정된 파티션 개수가 사용 가능한 노드 대수의 최대치가 되므로 미래에 증가될 것을 수용하기에 충분히 높은 값으로 설정해야 한다. 하지만, 관리 오버헤드가 있으므로 너무 큰 수를 선택하면 역효과를 낳을 수 있다.
동작 방식
장점
ZeroBase 데이터베이스는 파티션 경계를 어디로 정해야 하는지에 관한 사전 정보가 없으므로 시작할 때는 파티션이 하나이다. 데이터 셋이 작을 때는 모든 쓰기 요청이 하나의 노드에서 실행되고, 다른 노드들은 유휴 상태에 머물게 된다.
또한 해시 파티셔닝에서도 사용할 수 있다.
동적 파티셔닝
노드 비례 파티션
새 노드가 클러스터에 추가되면 고정된 개수의 파티션을 무작위로 선택해 분할한다. 균등하지 않은 분할이 생길 수 있지만 평균적으로는 균등한 몫을 할당받게 된다.
또한 파티션 경계를 무작위로 선택하려면 해시 기반 파티셔닝을 사용해야 한다.
자동 재균형화
수동 재균형화
카우치베이스, 리악, 볼드모트는 자동으로 할당을 제안하지만 반영하려면 수동으로 하는 방법을 사용한다.
서비스 찾기(Service discovery)

보통 대부분은 클러스터 메타데이터를 추적하기 위해 주키퍼 같은 별도의 코디네이션 서비스를 사용한다. 각 노드는 주키퍼에 자신을 등록하고, 주키퍼는 파티션과 노드 사이의 신뢰성 있는 할당 정보를 관리한다.
라우팅 계층은 주키퍼에 있는 정보를 구독할 수 있다. 노드가 추가되거나 삭제되거나, 파티션 소유자가 바뀌게 되면 주키퍼는 라우팅 계층에 이를 알려서 라우팅 정보를 최신으로 유지한다.

클라이언트는 라우팅 계층을 사용하거나, 임의의 노드로 요청을 보낼 때도 접속할 IP 주소를 알아내야 한다. IP 주소는 노드에 할당된 파티션 정보만큼 자주 바뀌지 않으므로 IP 주소를 찾는 데는 대개 DNS를 쓰는 것으로 충분하다.
대규모 병렬 처리(massively parallel processing, MPP)