Skip to content

[Cassandra] 파티셔너(Partitioner)에 대해..

2012/02/17

[Cassandra] 파티셔너(Partitioner)에 대해..

 

Data Partitioning

카산드라에서는 클러스터에 의해 관리되는 전체 데이터의 형태를 링(ring)으로 표현할 수 있습니다.  링은 노드들의 수만큼 범위들(ranges)로 나눠져 있고, 각 노드는 전체 데이터중 자신이 맡고 있는 범위에 해당하는 데이터를 저장하고 있게 됩니다.  그리고 새로운 노드가 클러스터에 추가되기 전에 토큰(token)이라는 것을 할당 받아야하고 그 토큰은 링에서 노드의 위치와 데이터에 대한 범위를 규정합니다.

컬럼 패밀리(Column family) 데이터는 로우(row)의 키를 바탕으로 노드들에 걸쳐 분할됩니다. 노드중 로우를 저장할 첫번째 복제 노드(replica)를 정하기 위해, 링에서 시계방향으로 돌면서 로우 키보다 큰 토큰을 가지는 노드를 찾게 됩니다. 각 노드들은 링에서 이전(predecessor )노드의 토큰값 초과부터 자신의 토큰값 이하까지에 해당하는 범위에 책임을 가지게 됩니다. 노드는 토큰에 의해 정렬되어 있고, 마지막 노드는 이전 노드를 첫번째 노드로 인식하게 되어 링 구조를 그리게 됩니다.

 

만약 4개의 노드로 구성된 클러스터가 0~100의 범위를 가지는 로우키를 가지고 토큰키는 0, 25, 50, 75라고 가정하면,

첫번째 노드의 토큰키는 0이되고 아래 그림의 Data Range 4(76~0)에 대해 책임을 가지게 되는 식으로 링을 나눠서 맡게 됩니다.

Partitioner

파티셔너(partitioner)는 카산드라 클러스터에서 데이터가 노드들에 어떻게 분할되어 저장되어야 하는지에 대한 설정 방법입니다. 그렇기 때문에 다른 대부분의 카산드라 설정과는 다르게 파티셔너를 바꾼다면 모든 데이터에 대해 재배치(reloading)가 필요하기 때문에 최초 설계시 파티셔너를 잘 선택해야만 합니다.

카산드라는 다음과 같은 파티셔너들을 제공하고 있지만 대부분의 개발자들에게는 랜덤 파티셔너(random partitioner)가 최선의 선택이라고 합니다.

Random Partitioner

랜덤 파티셔너는 카산드라 클러스터의 기본 파티셔닝 설정이며 대부분의 상황에서 올바른 선택입니다.

랜덤 파티셔너는 특정 로우가 어떤 노드에 저장되어야 하는지를 결정짓기 위해 consistent hashing을 사용합니다. consistent hashing은 단순하게 노드의 수로 나누는 것과는 틀리게, 클러스터에 새로운 노드가 추가 되더라도 기존 데이터 셋에 최소한의 영향이 가도록 합니다.

여러 노드들에 데이터를 고르게 분산시키기 위하여, 해싱 알고리즘은 로우키를 MD5로 해시한 값을 만들어 냅니다. 그 해시한 값은 0에서 2**127까지의 범위를 가질수 있습니다. 클러스터의 각 노드는 그 범위에 해당하는 해시 값 중 하나를 토큰 값으로 가지게 됩니다. 싱글 데이터 센터의 경우에는, 토큰은 해시 범위를 클러스터의 노드 수로 나눠서 계산합니다. 멀티 데이터 센터의 경우, 토큰들은 데이터 센터별로 계산 됩니다.

이 방식의 가장 큰 장점은 토큰이 알맞게 배치가 된 후에는 모든 컬럼 패밀리의 데이터가 다른 추가적인 노력없이 클러스터에 고르게 분단된다는 특징이 있습니다. 예를들어 한 컬럼 패밀리에서는 로우 키를 사용자의 이름이고 다른 컬럼 패밀리에서는 timestamp라고 하더라도,  개별 컬럼 패밀리의 로우키는 여전히 고르게 분포되게 됩니다. 그리고 이것은 또한 클러스터에 읽기와 쓰기 요청 역시 고르게 분산됨을 의미합니다.

 

No comments yet

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: