Chapter 6

파티셔닝

  • 6.1 파티셔닝과 복제
  • 6.2 키-값 데이터의 파티셔닝
  • 6.3 파티셔닝과 보조 색인
  • 6.4 파티션 재균형화
  • 6.5 요청 라우팅

파티셔닝의 존재 이유는 딱 하나야 — 한 노드로 안 되니까 나누는 거지. 데이터가 한 머신에 안 들어가거나, 질의 부하가 한 노드로 감당 안 될 때. 근데 나누는 것 자체보다 고르게 나누는 게 진짜 어려워.

키 범위로 나누면 범위 스캔이 효율적이야. 하지만 타임스탬프를 키로 쓰면 오늘의 쓰기가 전부 한 파티션에 몰려서 핫스팟이 생기지. 해시로 나누면 핫스팟은 줄어들지만 범위 질의가 모든 파티션에 흩어져. Cassandra는 절충안을 써 — 복합 키의 첫 부분만 해시로 파티션 정하고 나머지는 정렬 인덱스로 쓰는 거야. 그래도 수백만 팔로워를 가진 유명인이 뭔가 하면 같은 키에 쓰기가 폭주하는데, 이건 해시로도 못 막아. 키에 랜덤 숫자를 붙이는 식으로 대응할 수 있지만, 읽을 때 흩어진 키를 다 모아야 하는 추가 복잡도가 생기지.

보조 색인이 있으면 상황이 훨씬 복잡해져. 로컬 색인(각 파티션이 자기 문서만 색인)은 쓰기는 단순하지만 검색할 때 스캐터/게더 — 모든 파티션에 질의를 보내야 해서 지연시간이 증폭돼. 글로벌 색인(색인 자체를 파티셔닝)은 읽기는 효율적이지만 쓰기가 여러 파티션의 색인을 건드려야 해서 느리고 복잡하지. 어느 쪽이든 트레이드오프야.

시간이 지나면 재균형화도 필요해. hash mod N은 절대 하면 안 돼 — N이 바뀌면 거의 모든 키가 재배치되니까. 파티션 수를 처음부터 많이 만들어놓고 노드에 배분하거나, 동적으로 쪼개고 합치거나, 노드 비례로 유지하는 방법이 있어. 그리고 클라이언트의 요청이 올바른 노드에 도달하게 하는 서비스 디스커버리도 풀어야 할 문제고 — 주키퍼 같은 코디네이션 서비스를 쓰거나 가십 프로토콜로 노드 간에 상태를 전파하거나.


정리

6장 읽고 기억할 거:

  1. 파티셔닝의 핵심은 균형이다. 키 범위든 해시든, 데이터와 질의 부하가 고르게 분산돼야 한다. 핫스팟이 생기면 파티셔닝의 의미가 퇴색된다
  2. 보조 색인은 파티셔닝을 복잡하게 만든다. 로컬 색인은 쓰기가 쉽고 읽기가 비싸고, 글로벌 색인은 읽기가 쉽고 쓰기가 비싸다
  3. 재균형화와 라우팅은 운영의 핵심. 노드 추가/제거 시 데이터를 최소한으로 옮기면서 균형을 맞추고, 요청이 올바른 노드에 도달하게 하는 것이 실전 과제다