Skip to content

Cassandra Replication 설정

2012/02/14

Cassandra Replication 설정

cassandra는 키(key)/값(value)가 모인 로우(raw), 로우가 모인 컬럼(column) 그리고 다시 컬럼이 모인 키스페이스(keyspace), 마지막으로 키스페이스가 모인 클러스터가(cluster) 있습니다. 이는 데이터 모델에 대한 설명이고 다시 물리적 장치(서버)로 설명하면 노드(node)가 있고 노드가 모인것을 클러스터 또는 링(ring)이라고 부릅니다.

이때 노드는 범위가 다른 데이터의 복제본을 유지하며 이 덕분에 한 개의 노드가 다운되더라도 복제본을 가지고 있는 다른 노드가 쿼리에 응답할 수 있습니다. 그리고 카산드라에서는 데이터를 복제본으로 나누고 배치하는 전략을 키스페이스 별로 설정할 수 있습니다.

다음은 Replication 옵션 값에 대한 설명입니다.

1. 복제 계수(replication factor)

복제 계수는 데이터의 각 로우에 대해 복제본으로 동작할 노드의 개수를 말합니다. 계수는 총 노드의 개수보다 많을 수는 없습니다. 그리고 복제 계수가 3이면 링에서 3개의 노드가 각 로우의 사본을 갖게 됩니다. 그래서 복제 계수가 높을 수록 장애에 대한 가용성은 높아지지만  일관성을 유지하기 위해 성능 비용이 높아지게 됩니다.

여기서 가용성이란?
만약 N개의 노드가 있어도 계수가 1이면 1개의 노드에만 해당 데이터가 저장되어 있어 만약 그 노드가 다운된다면 데이터를 가져올수 없게 됩니다. 하지만 N 개의 노드 수만큼 계수를 N으로 지정하면 N개의 노드가 모두 다운되기 전까지 데이터를 가져올수 있습니다.

여기서 일관성이란?
만약 계수가 N이면 N개의 노드에 복제본이 존재하는 것이고 이 복제본의 데이터가 모두 같아야 일관성이 있다고 할 수 있습니다. 이렇기 때문이 계수가 증가 할수록 같은 데이터를 여러번 쓰고 읽어서 비교해야하기 때문에 성능이 저하가 됩니다. 하지만 카산드라에서는 쓰기와 읽기 쿼리마다 일관성 레벨을 지정할 수 있습니다.(= 조정 가능한 일관성 레벨) 기본적으로 일관성 레벨이 높을 수록 더 많은 노드가 쿼리에 응답하게 되고 이로 인해 일관성은 높아지지만 성능은 낮아지게 됩니다.

2. 복제본 배치 전략(Replica placement strategy)

복제본 배치는 복제본이 링에 배치되는 방법을 말합니다. 카산드라는 어떤 노드가 어떤 키의 복사본을 갖게 될지 결정하는 3가지 전략이 있습니다.

1. SimpleStrategy : 기존의 RackUnawareStrategy의 새로운 이름입니다. 심플 스트래티지는 기본값으로 복제본을 시계방향으로 다음 노드에 배치합니다. 이때 데이터 센터나 랙의 배치는 고려하지 않습니다. 그래서 이론적으로는 빠르지만, 만약 특정 키를 갖고 있는 노드가 나머지 노드와 다른 랙에 있다면 빠르지 않다고 합니다. 그리고 당연히 상대적으로 가용성이 떨어지게 됩니다. 결국 1개의 데이터센터에서 1개의 랙에 노드들이 있을때 사용하는 것이 좋습니다.

2. LocalStrategy(OldNetworkTopology) : 이전 RackAwareStrategy 에서 OldNetworkTopology로(0.7) 그리고 다시 LocalStrategy(0.8.1)로 명칭이 바뀐듯 합니다. 이 전략은 2개의 데이터 센터와 3개의 복제본 설정에 최적화된 제한적인 지원을 하기 때문에 NetworkTopology를 사용하는 것이 좋다고 합니다.

3. NetworkTopology : 0.7부터 포함된 전략으로 데이터 센터와 랙 그리고 노드에 대한 배치 정보를 알고 있거나 클러스터가 여러 데이터 센터에 걸처 배치되어 있을때 사용자 설정에 의해서 복제본이 어디에 위치해 있을지를 정할 수 있습니다.

3. 일관성 레벨(Consistency level)

일관성 레벨은 위에 두개 옵션과는 다르게 서버 설정이 아닌 클라이언트의 옵션이며 쓰기/읽기 쿼리 마다 설정이 가능합니다.

일관성 레벨이 높을수록 더 많은 노드가 쿼리에 응답하며, 각 복제본에 있는 값이 같음을 더 확실하게 보장한다는 뜻입니다.

읽기 일관성 레벨

일관성 레벨 의미
ZERO 읽기에서 지원 안함
ANY 읽기에서 지원 안함
ONE 가장 가까운 복제본(snitch에 의해 정해짐)의 쿼리 응답 결과를 즉시 반환한다.
다른 복제본에 같은 레코드가 있는지 확인할 백그라운드 스레드를 생성하고
최신상태가 아닌 복제본이 있다면 읽기 복구를 수행해 가장 최신 데이터로 전체 복제본을 동기화한다.
QUORUM 모든 노드에 쿼리한다. 대다수 복제본((복제 계수/2)+1)이 응답했다면 가장 최신의 타임스탬프를 가진 값을 클라이언트에 반환한다.
필요하다면 남은 복제본 모두에 대해 읽기 복구를 수행한다.
LOCAL_QUORUM QUORUM과 같지만 coordinator 노드를 통해 같은 데이터센터에 있는 복제본에 대해서만 쿼리를 날린다. 즉, 데이터센터 간에 latency(지연시간)를 피하도록 한다.
EACH_QUORUM LOCAL_QUORUM과는 다르게 클러스터의 각 데이터센터의 복제본 쿼리한 결과를 기준으로 한다.
ALL 모든 노드에 쿼리한다. 모든 노드의 응답을 기다리고, 가장 최신의 타임스탬프를 가진 값을 클라이언트에 반환한다.
필요하다면 백그라운드로 읽기 복구를 수행한다. 응답에 실패한 노드가 있다면 읽기 연산도 실패한다.

LOCAL_QUORUM과 EACH_QUORUM은 다중 데이터센터 환경하에 NetworkTopologyStrategy 전략과 적절한 snitch 설정이 된 상황에서 사용되도록 디자인 되어있습니다.

쓰기 일관성 레벨

일관성 레벨 의미
ZERO 쓰기 연산은 쓰기를 기록하기 전에 클라이언트에 즉시 반환된다.
즉, 쓰기는 백그라운드 스레드에서 비동기적으로 일어나며, 쓰기가 성공했는지는 보장하지 않는다.
ANY 최소 한 개의 노드에 값을 썼음을 보증하고, 힌트를 쓰기로 카운트한다.
ONE 클라이언트에 반환하기 전에 적어도 한 개의 노드에서 커밋 로그와 멤테이블에 값을 썼다고 보장한다.
QUORUM 쓰기가 적어도 대다수 복제본((복제 계수/2)+1)에서 수신되었음을 보장한다.
ALL 클라이언트에 반환하기 전에 복제 계수에 지정한 모든 노드가 쓰기를 받았다는 것을 보장한다.
쓰기 연산에 응답하지 않는 복제본이 하나라도 있으면 실패로 처리한다.

더 자세히 읽을 것 :

http://www.datastax.com/docs/1.0/cluster_architecture/replication

http://www.datastax.com/docs/1.0/cluster_architecture/about_client_requests

No comments yet

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중

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