Computer Science/Cassandra

[Cassandra] Cassandra Consistency Level 이란?

백엔드 규니 2024. 2. 12. 01:49
728x90
반응형

Cassandra Consistency Level 알아보자

이번 글에서는 카산드라 Write, Read 각각 Consistency Level에 대해서 어떤 특징이 있는지 알아보겠습니다.

 

 

Casssandra CAP 특징

image

 

카산드라는 CAP 3가지 특징 중에 AP 시스템으로 높은 가용성파티션 허용 오차를 제공합니다. 상황에 따라 CP시스템으로 동작하도록 설정할 수도 있습니다.

 

즉, 카산드라에서는 Wrtie, ReadConsitency Level을 어떤 값으로 설정하냐에 따라서 AP 시스템이 될 수도 있고, CP 시스템이 될 수도 있습니다.

 

 

Consistency Level 이란?

일관성 수준은 코디네이터(coordinator) 노드non-lightweight transaction을 성공적으로 처리하기 위해 복제본에서 응답해야 하는 노드 수를 결정하는 옵션입니다.

 

읽기 일관성 레벨은 클라이언트에게 데이터를 응답하기 전에 읽기 요청에 응답해야 하는 복제본 수를 지정합니다.

 

쓰기 일관성 레벨은 쓰기 요청이 카산드라에 성공적으로 반영되어 클라이언트에게 응답되기 전에 얼마나 많은 복제본이 쓰기 요청에 응답해야 하는지를 지정합니다.

 

 

Write Consistency Level

Level Description Usage
ALL 클러스터의 모든 복제 노드들의 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level 가장 높은 일관성을 제공하지만, 가장 낮은 가용성을 제공
EACH_QUORUM 각 datacenter에서 QUORUM 만큼의 복제 노드들의 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level 특정 dc가 다운되면 QUORUM수를 만족하지 못해 쓰기 동작이 실패할 것이므로 각 datacenter를 같은 수준의 일관성으로 유지하고 싶을 때 사용할 수 있다.
QUORUM 모든 datacenter에서 QUORUM 만큼의 복제 노드들의 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level EACH_QUORUM의 경우 각 dc를 기준으로 하므로 dc1에서 1개, dc2에서 1개의 노드가 다운되었을 경우에만 정상 동작할 것이고 QUORUM은 dc1에서는 0개, dc2에서 2개의 노드가 다운되어도 정상 동작
LOCAL_QUORUM coordinator node가 존재하는 같은 datacenter에서 QUORUM 만큼의 복제 노드들의 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level 같은 dc 안에서 동작하기 때문에 dc간의 통신 지연을 방지할 수 있다.
ONE 적어도 1개의 replica 노드에 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level 같은 dc 안에서 동작하기 때문에 dc간의 통신 지연을 방지할 수 있다.
TWO 적어도 2개의 replica 노드에 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level ---
THREE 적어도 3개의 replica 노드에 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level ---
LOCAL_ONE local datacenter에서 적어도 하나의 replica 노드에 commit log와 memtable에 쓰기 동작이 완료되어야 하는 level multiple datacenter에서 보통 ONE level이 적절하지만, 운영 중이지 않은 데이터 센터의 노드가 운영 중인 데이터 센터의 노드에 자동으로 연결되지 않도록 함
ANY 모든 replica 노드들이 다운되어도 쓰기 동작이 가능한 level 쓰기가 성공한 데이터는 복제본 노드들이 정상 동작할 때까지 읽을 수 없고, 가장 높은 가용성을 보장하지만 일관성은 가장 낮다.

 

 

Read Consistency Level

Level Description Usage
ALL 모든 복제본이 응답을 확인한 후 클라이언트에게 응답한다. 즉, 복제본이 응답하지 않으면 읽기 작업이 실패한다. 가장 높은 일관성을 제공하지만, 가장 낮은 가용성을 제공한다.
EACH_QUORUM 읽기에서 지원되지 않음 ---
QUORUM 모든 데이터 센터의 복제본 쿼럼이 응답한 후 레코드를 반환한다. ---
LOCAL_QUORUM coordinator node가 존재하는 같은 datacenter에서 QUORUM 만큼의 복제 노드들의 응답을 확인한 후 클라이언트에게 응답한다. ---
ONE 가장 가까운 1개의 replica 노드가 응답하는 경우 값을 반환하는 level 오래된 데이터를 읽어도 큰 문제가 없는 경우 가장 높은 가용성을 제공하는 level이다.
TWO 가장 가까운 2개의 replica 노드가 응답하는 경우 값을 반환하는 level ---
THREE 가장 가까운 3개의 replica 노드가 응답하는 경우 값을 반환하는 level ---
LOCAL_ONE local datacenter에서 가장 가까운 하나의 replica 노드가 응답하는 경우 값을 반환하는 level ---
SERIAL 모든 datacenter에서 QUORUM 만큼의 replica 노드에서 커밋 되지 않은 상태의 데이터를 읽을 수 있는 level 경량 트랜잭션을 실행하여 컬럼에 쓴 후에 컬럼의 최신 값을 읽으려면 SERIAL 사용
LOCAL_SERIAL SERIAL과 동일하나 local dc로 제한한다. ---

 

 

How QUORUM is calculated

quorum = (sum_of_replication_factors / 2) + 1
  • ex) replication factors = 3인 경우 QUORUM = 2가 되므로 1개의 노드가 다운되어도 정상 동작

 

sum_of_replication_factors = datacenter1_RF + datacenter2_RF + . . . + datacentern_RF
  • ex) 데이터 센터가 2개 이상일 때 replication factors = 3인 경우 QUORUM = 4가 되므로 2개 노드가 다운되어도 정상 동작

 

이번에는 그림을 통해서 Write Consistency Level에 대해서 조금만 더 알아보겠습니다.

 

 

Pictures Write Consistency Level

CL = ALL

image

일관성 레벨 ALL은 모든 복제본에서 응답해야 클라이언트에서 응답을 할 수 있기 때문에 카산드라에서 가장 높은 일관성을 제공하지만, 하나의 복제본이라도 실패한다면 클라이언트 응답에 실패하기 때문에 가용성은 낮다는 단점이 존재합니다.

 

카산드라의 큰 장점은 가용성이 높다는 것인데 일관성 레벨 ALL을 사용하면 가용성과 성능을 낮추기 때문에 카산드라를 제대로 사용한다 할 수 없을 것입니다.

 

가용성이 아닌 높은 일관성을 유지하는 것이 필요하다면 카산드라 보다는 RDB를 사용하는 것이 더 좋은 선택일 것입니다.

 

CL = EACH_QUORUM

image

모든 복제본 노드에서 응답해야 하는 것은 아니기 때문에 ALL 보다는 가용성이 좀 더 높다고 할 수 있습니다.

 

EACH_QUORUM는 데이터 센터마다의 동일한 일관성 유지를 목표로 하는데, 이 뜻은 QUORUM = 2 이기 때문에 각 데이터 센터에서 최소 2개 노드에서 응답해야 성공할 수 있다는 것을 의미합니다.

 

CL = QUORUM

image

QUORUMEACH_QUORUM가 동일하지만, 하나 다른 점이 존재합니다. EACH_QUORUM의 경우 QUORUM = 2 일 때 데이터 센터 각각에서 최소 2개의 노드씩 응답을 해야 성공할 수 있었습니다.

 

하지만 QUORUM 레벨은 QUORUM = 2 일 때 모든 데이터 센터 노드에서 최소 2개 이상만 응답하면 된다는 특징이 있습니다. (QUORUM 일 때는 datacenter 2에서 replication factor = 1)

 

CL = LOCAL_QUORUM

image

LOCAL_QUORUM 레벨은 같은 데이터 센터 복제본 노드에서만 응답하면 클라이언트에게 성공으로 응답할 수 있습니다.

또한 요청이 현재 데이터 센터의 경계를 벗어나지 않기 때문에 지연 시간이 줄어든다는 장점이 있습니다.

 

CL = ONE, TWO, THREE

숫자 일관성 레벨은 숫자에 맞게만 복제본 노드에서 응답을 받으면 되는데, 복제본 수에 따라서 일관성이 높아질 수도 낮아질 수도 있다는 특징이 있습니다. 예를들어, Replication Factor = 3, CL = TWO 경우로 알아보겠습니다.

image

위처럼 복제 노드가 3개라면, 3개 중에 2개만 응답하면 되기 때문에 일관성이 높은 편이라고 할 수 있습니다.

 

image

하지만 위처럼 복제본 수가 늘어난다면 5개 복제 노드 중에 2개만 응답 받으면 되기 때문에 일관성이 조금 떨어질 수 있다는 특징이 있습니다.

 

CL = LOCAL_ONE

image

LOCAL_QUORM 처럼 일관성 검사는 로컬 데이터 센터에서만 적용됩니다. 하나의 복제본에 대해서만 일관성 체크를 하면 되기 때문에 가용성 높이고, 일관성을 낮추게 됩니다.

 

SNS 리액션 수 같이 당장 일관성을 유지하는 것이 중요하지 않은 데이터에 낮은 일관성 수준을 사용하는 것이 좋습니다.

 

CL = ANY

image

ANY 레벨은 복제본의 응답을 필요로 하지 않습니다. 또한 카산드라에 데이터를 저장하지 않고도 성공으로 응답할 수 있습니다.

 

복제 노드가 다운되어 데이터를 처리하지 못한 경우 코디네이터 노드는 힌트(hint)를 저장합니다. 힌트(hint)가 만료 시간은 3시간이며, 이는 해당 시간 내에 복제 노드가 다시 정상 상태로 돌아오지 않으면 데이터가 손실됨을 의미합니다.

 

일관성 레벨 ANY는 카산드라에서 가장 높은 가용성과 가장 낮은 일관성을 제공합니다. 데이터 저장에 대한 보장이 없으므로 데이터 손실을 초래할 수 있으므로 운영 환경에서는 권장되지 않습니다.

 

 

Referenece

반응형