-
6장. 파티셔닝STUDY/데이터 중심 애플리케이션 설계 2025. 7. 30. 22:29
파티셔닝
데이터셋이 매우 크거나 질의 처리량이 매우 높다면 복제만으로는 부족하고 데이터를 파티션으로 쪼갤 필요가 있다. 이 작업을 샤딩이라고도 한다.
파티션을 나눌 때는 보통 각 데이터 단위(레코드, 로우, 문서)가 하나의 파티션에 속하게 한다. 데이터베이스가 여러 파티션을 동시에 건드리는 연산을 지원할 수도 있지만 결과적으로 각 파티션은 그 자체로 작은 데이터베이스가 된다.
파티셔닝을 하는 주된 이유는 확장성이다.
- 비공유 클러스터에서 다른 파티션은 다른 노드에 저장될 수 있다. 따라서 대용량 데이터셋이 여러 디스크에 분산될 수 있고 질의 부하는 여러 프로세서에 분산될 수 있다.
- 단일 파티션에 실행되는 질의는 각 노드에서 자신의 파티션에 해당하는 질의를 독립적으로 실행할 수 있으므로 노드를 추가함으로써 질의 처리량을 늘릴 수 있다. 크고 복잡한 질의의 경우 여러 노드에서 병렬 실행이 가능하다.
파티셔닝과 복제
- 보통 복제와 파티셔닝을 함께 적용해 각 파티션의 복사본을 여러 노드에 저장한다.
- 각 레코드는 정확히 한 파티션에 속하더라도 이를 여러 다른 노드에 저장해서 내결함성을 보장할 수 있다.
- 한 노드에 여러 파티션을 저장할 수도 있다.
- ex. 리더 팔로워 복제 모델
- 각 파티션의 리더는 하나의 노드에 할당되고 팔로워들은 다른 노드에 할당된다.
- 각 노드는 어떤 파티션에게는 리더로 어떤 파티션에게는 팔로워로 동작한다.
키-값 데이터 파티셔닝
- 파티셔닝의 목적은 데이터와 질의 부하를 노드 사이에 고르게 분산시키는 것이다.
- 파티셔닝이 고르게 이뤄지지 않아 다른 파티션보다 데이터가 많거나 질의를 많이 받는 파티션이 있다면 쏠렸다(skewed)고 말하고, 파티셔닝의 효과가 매우 떨어지게 된다.
- 이 때, 불균형하게 부하가 높은 파티션을 핫스팟이라고 한다.
키 범위 기준 파티셔닝
- 각 파티션에 연속된 범위(어떤 최솟값에서 최댓값까지)의 키를 할당하는 것
- 장점
- 각 범위들 사이의 경계를 알면 어떤 키가 어느 파티션에 속하는지 쉽게 찾을 수 있다.
- 어떤 파티션이 어느 노드에 할당됐는지 알면 적절한 노드로 요청을 직접 보낼 수 있다.
- 키 범위 크기가 반드시 동일할 필요는 없다. 데이터를 고르게 분산시키려면 파티션 경계를 데이터에 맞춰 조정해야 한다.
- 파티션 경계는 관리자가 수동으로 선택하거나 데이터베이스에서 자동으로 선택되게 할 수 있다.
- 각 파티션 내에서는 키를 정렬된 순서로 저장할 수 있다.
- 범위 스캔이 쉬워진다.
- 키를 연쇄된 색인으로 간주해서 질의 하나로 관련 레코드 여러 개를 읽어오는 데 사용할 수 있다.
- 문제점
- 특정한 접근 패턴이 핫스팟을 유발할 수 있다.
키의 해시값 기준 파티셔닝
- 쏠림과 핫스팟의 위험 때문에 많은 분산 데이터스토어는 키의 파티션을 정하는 데 해시 함수를 사용한다.
- 좋은 해시 함수는 쏠린 데이터를 입력으로 받아 균일하게 분산되게 한다.
- 파티셔닝용 해시 함수는 암호적으로 강력할 필요는 없다.
- 카에 적합한 해시 함수를 구했다면 각 파티션에 해시값 범위를 할당하고 해시값이 파티션의 범위에 속하는 모든 키를 그 파티션에 할당하면 된다.
- 일관성 해시 : 파티션 경계는 크기가 동일하도록 나눌 수 있고 무작위에 가깝게 선택할 수도 있다.
- 문제점
- 범위 질의를 효율적으로 실행할 수 있는 키 범위 파티셔닝의 좋은 속성을 잃어 버린다.
- 전에는 인접했던 키들이 이제는 모든 파티션에 흩어져서 정렬 순서가 유지되지 않는다.
- 몽고 DB에서는 해시 기반 샤딩 모드를 활성화하면 범위 질의가 모든 파티션에 전송돼야 한다. 리악, 카우치베이스, 볼드모트에서는 기본키에 대한 범위 질의가 지원되지 않는다.
- 카산드라는 테이블을 선언할 때 여러 컬럼을 포함하는 복합 기본키를 지정할 수 있다. 키의 첫 부분에만 해싱을 적용해 파티션 경정에 사용하고 남은 컬럼은 카산드라의 SS테이블에서 데이터를 정렬하는 연쇄된 색인으로 사용한다. => 첫 번째 컬럼에 고정된 값을 지정하면 키의 다른 컬럼에 대해서는 범위 스캔을 실행할 수 있다.
쏠린 작업부하와 핫스팟 완화
키를 해싱해서 파티션을 정하면 핫스팟을 줄이는 데 도움이 되지만, 핫스팟을 완벽히 제거할 수는 없다. 항상 동일한 키를 읽고 쓰는 극단적인 상황에서는 모든 요청이 동일한 파티션으로 쏠리게 된다. 현대 데이터 시스템은 대부분 크게 쏠린 작업부하를 자동으로 보정하지 못하므로 애플리케이션에서 쏠림을 완화해야 한다.
파티셔닝과 보조 색인
레코드를 기본키를 통해서만 접근한다면 키로부터 파티션을 결정하고 이를 사용해 해당 키를 담당하는 파티션으로 읽기 쓰기 요청을 전달할 수 있다. 그러나 특정한 값이 발생한 항목을 검색하는 수단인 보조 색인이 연관되는 경우 상황이 복잡해는데, 보조 색인은 파티션에 깔끔하게 대응되지 않는 문제점이 있다. 보조 색인이 있는 데이터베이스를 파티셔닝하는 방법을 알아보자.
문서 기준 보조 색인 파티셔닝
- 보조 색인을 기본키와 값이 저장된 파티션에 저장한다.
- 각 파티션은 자신의 보조 색인을 유지하며 그 파티션에 속하는 문서만 담당한다. 다른 파티션에 어떤 데이터가 저장되는지는 신경쓰지 않는다.
- 데이터베이스에 문서 추가, 삭제, 갱신 등의 쓰기 작업을 실행할 때는 쓰려고 하는 문서 ID를 포함하는 파티션만 다루면 된다. 이러한 이유로 지역 색인(local index)이라고도 한다.
- 주의할 점
- 문서ID에 뭔가 특별한 작업을 하지 않는다면 특정한 색상이거나 특정한 제조사가 만든 자동차가 동일한 파티션에 저장되리라는 보장이 없다.
- 따라서 모든 파티션으로 질의를 보내서 얻은 결과를 모두 모아햐 한다.
- 파티셔닝된 데이터베이스에 이런 식으로 질의를 보내는 방법을 스캐터/개더(scatter/gather)라고도 하는데 보조 색인을 써서 읽는 질의는 큰 비용이 들 수 있다.
- 여러 파티션에서 질의를 병렬 실행하더라도 스캐터/개더는 꼬리 지연 시간 증폭이 발생하기 쉽다.
용어 기준 보조 색인 파티셔닝
- 모든 파티션의 데이터를 담당하는 전역 색인이다.
- 한 노드에만 색인을 저장할 경우 해당 노드가 병목이 되어 파티셔닝의 목적을 해칠 수 있기 때문에 여러 노드에 나눠 저장해야 한다. 즉, 색인된 값을 사용해서 보조 색인을 별도로 파티셔닝한다.
- 찾고자 하는 용어에 따라 색인의 파티션이 결정되므로 이런 식의 색인을 용어 기준으로 파티셔닝됐다고 한다.
- 색인을 파티셔닝할 때 용어 자체를 쓸 수도 있고 용어의 해시값을 사용할 수도 있다. 용어 자체로 파티셔닝하면 범위 스캔에 유용한 반면 용어의 해시값을 사용하면 부하가 좀 더 고르게 분산된다.
- 장점
- 읽기가 효율적이다.
- 클라이언트는 모든 파티션에 스캐터/개더를 실행할 필요 없이 원하는 용어를 포함하는 파티션으로만 요청을 보내면 된다.
- 단점
- 쓰기가 느리고 복잡하다.
- 단일 문서를 쓸 때 해당 색인의 여러 파티션에 영향을 줄 수 있다.(ex. 문서에 있는 모든 용어가 다른 노드에 있는 다른 파티션에 속하는 경우)
파티션 재균형화
- 시간이 지나면 데이터베이스에 변화가 생긴다.
- 질의 처리량이 증가해서 늘어난 부하를 처리하기 위해 CPU를 더 추가해야 하는 경우
- 데이터셋 크기가 증가해서 데이터셋 저장에 사용할 디스크와 램을 추가해야 하는 경우
- 장비에 장애가 발생해서 그 장비가 담당하던 역할을 다른 장비가 넘겨받아야 하는 경우
- 재균형화(rebalancing) : 클러스터에서 한 노드가 담당하던 부하를 다른 노드로 옮기는 과정
- 요구사항
- 재균형화 후, 부하(데이터 저장소, 읽기 쓰기 요청)가 클러스터 내에 있는 노드들 사이에 균등하게 분배돼야 한다.
- 재균형화 도중에도 데이터베이스는 읽기 쓰기 요청을 받아들여야 한다.
- 재균형화가 빨리 실행되고 네트워크와 디스크 I/O 부하를 최소화할 수 있도록 노드들 사이에 데이터가 필요 이상으로 옮겨져서는 안 된다.
재균형화 전략
- 해시값에 모드 N 연산을 실행
- 사용하면 안되는 방법
- 노드 개수 N이 바뀌면 대부분의 키가 노드 사이에 옮겨져야 하는데, 키가 자주 이동하면 재균형화 비용이 지나치게 커진다.
- 파티션 개수 고정
- 파티션을 노드 대수보다 많이 만들고 각 노드에 여러 파티션을 할당(10대의 노드에 1000개의 파티션을 쪼개서 100개씩 할당)
- 클러스터에 노드가 추가되면 새 노드는 파티션이 다시 균일하게 분배될 때까지 기존 노드에서 파티션을 몇 개 뺏어올 수 있다.
- 파티션은 노드 사이에서 통째로 이동하기만 한다. 파티션의 개수나 할당된 키는 변경되지 않는다.
- 보통 데이터베이스가 처음 구축될 때 파티션 개수가 고정되고 이후에 변하지 않는다.
- 전체 데이터셋의 크기 변동이 심한 경우 적절한 파티션 개수를 정하기 어렵고, 파티션이 너무 커지면 재균형화 및 노드 장애 복구 비용이 커진다.
- 동적 파티셔닝
- 파티션의 크기가 설정된 값을 넘어서면 파티션을 두 개로 쪼개 각각에 원래 파티션의 절반 정도의 데이터가 포함되게 한다.
- 데이터가 많이 삭제되어 파티션 크기가 임계값 아래로 떨어지면 인접한 파티션과 합쳐질 수 있다.
- 큰 파티션이 쪼개진 후 부하의 균형을 맞추기 위해 분할된 파티션 중 하나가 다른 노드로 이동될 수 있다.
- 장점 : 파티션 개수가 전체 데이터 용량에 맞춰 조정된다.
- 단점 : 데이터셋이 작을 때는 모든 쓰기 요청이 하나의 노드에서 실행되고 다른 노드들은 유휴 상태에 머물게 될 수 있다.
- 노드 비례 파티셔닝
- 파티션 개수가 노드 대수에 비례하게 하는 것으로, 노드당 할당되는 파티션 개수를 고정한다.
- 노드 대수가 변함 없는 동안은 개별 파티션 크기가 데이터셋 크기에 비례해서 증가하지만 노드 대수를 늘리면 파티션 크기를 다시 작아진다.
- 데이터 용량이 클수록 데이터를 저장할 노드도 많이 필요하므로 이 방법을 통해 개별 파티션 크기도 안정적으로 유지할 수 있다.
- 새 노드가 클러스터에 추가되면 고정된 개수의 파티션을 무작위로 선택해 분할하고 각 분할된 파티션의 절반은 그대로 두고 다른 절반은 새 노드에 할당한다.
- 여러 파티션에 대해 평균적으로 보면 새 노드는 기존 노드들이 담당하던 부하에서 균등한 몫을 할당받게 된다.
운영: 자동 재균형화와 수동 재균형화
- 완전 자동 재균형화: 관리자의 개입이 전혀 없이 시스템이 자동으로 언제 파티션을 노드 사이에 이동할지 결정
- 완전 수동 재균형화: 관리자가 명시적으로 파티션을 노드에 할당하도록 설정하고 관리자가 재설정할 때만 파티션 할당이 변경
요청 라우팅
- 클라이언트가 아무 노드에나 접속하게 한다. 만약 해당 노드에 마침 요청을 적용할 파티션이 있다면 거기서 요청을 직접 처리할 수 있다. 그렇지 않으면 요청을 올바른 노드로 전달해서 응답을 받고 클라이언트에게 응답을 전달한다.
- 클라이언트의 모든 요청을 라우팅 계층으로 먼저 보낸다. 라우팅 계층에서는 각 요청을 처리할 노드를 알아내고 그에 따라 해당 노드로 요청을 전달한다. 라우팅 계층 자체에서는 아무 요청도 처리하지 않는다. 파티션 인지 로드 밸런서로 동작할 뿐이다.
- 클라이언트가 파티셔닝 방법과 파티션이 어떤 노드에 할당됐는지를 알고 있게 한다. 이 경우 클라이언트는 중개자 없이 올바른 노드로 직접 접속할 수 있다.
'STUDY > 데이터 중심 애플리케이션 설계' 카테고리의 다른 글
8장. 분산 시스템의 골칫거리 (0) 2025.08.31 7장. 트랜잭션 (0) 2025.08.19 4장. 부호화와 발전 (0) 2025.06.25 3장. 저장소와 검색 (0) 2025.06.18 2장. 데이터 모델과 질의 언어 (1) 2025.06.11