2012-06-21 4 views
2

나는이 두 데이터 센터, 데이터 (두 DC가 6 노드에 저장 될 때까지 3카산드라 - 여러 데이터 센터

이 CL.ALL 블록 쓸 것인가 복제 팩터 각각 하나와 CL.ALL 함께 쓰기 3 + 1)? 로컬 DC의 모든 3 개의 복제본이 성공적인 쓰기를 승인 할 때까지 차단한다고 가정합니다.

CL.ALL_LOCAL과 같은 것을 갖고 싶습니다. 단일 DC의 모든 복제본에 데이터를 저장하므로 CL.ONE으로 읽을 수 있습니다. 단일 DC의 모든 복제본이 데이터를 보존 할 때까지 블록을 작성하고 읽기 이후에 새로운 데이터를 읽을 가능성이 높습니다.

+0

카산드라의 복제는 DC 기반으로 구성 할 수 있지만 랙 단위로 구성 할 수는 없습니다. 각각에 3 개의 복제본이있는 2 개의 dcs가 있습니까? 또는 해당 데이터 센터에 3 개의 노드와 6 개의 복제본이있는 1 dc (실제로 각 랙에 3 개의 복제본)가 있습니까? 아니면 다른 구성? – nickmbailey

+0

오른쪽 - 내 질문을 수정했습니다 –

답변

2

현재 사용자가 설명하는 내용을 제공하는 일관성 수준이 없습니다. 가장 가까운 것은 LOCAL_QUORUM이며 로컬 데이터 센터의 노드 쿼럼이 응답 한 후에 반환됩니다.

원하는 경우이 기능을 추가하기 위해 jira 티켓을 제출할 수 있습니다.

https://issues.apache.org/jira/browse/CASSANDRA

0

나는 카산드라 1.1 코드를 확인하고 멀티 DC 배포에서 CL.ALL에 기록 할 때 흥미로운 동작을 나타났습니다. 아마 나는 코드를 잘못 해석했다. .... 어쨌든 :

처음에는 행 변이를 보낼 노드의 IP 주소를 수집한다. 이것은 클라이언트가 제공하는 일관성 수준과는 독립적이다. 1.0에서는 모든 DC의 모든 노드였습니다. 1.1에서부터 로컬 DC의 모든 노드에 각 원격 DC의 노드 하나를 더했습니다 (나머지 노드는 메시지의 "전달 대상"임). 각 돌연변이는 별도의 스레드에 의해 보내 지므로 요청은 병렬로 실행될 수 있습니다. 이러한 돌연변이는 메시징 서비스에 의해 메시지로 처리됩니다. 원격 DC의 노드가 메시지를 수신하면 노드는 "앞으로"제공되는 나머지 노드로 메시지를 전달합니다.

클라이언트가 제공하는 일관성 수준은 수신 된 메시지를 확인해야하는 노드 수를 정의합니다. CL.ALL의 경우이 수는 복제 계수에 의해 결정됩니다. 이제 재미 있습니다. 로컬 DC에서 모든 노드로, 원격 DC에서 노드로 메시지를 보내므로 제거 노드에서도 수신 확인을 받게됩니다. 이것은 여전히 ​​복제 계수에 의해 정의되는 번호이지만 notwork 대기 시간에 따라 어떤 노드가 수신 메시지를 준수했는지 확인할 수 없으며 로컬 및 원격 DC의 노드와 혼합 될 수 있지만 로컬 DC의 노드 일 수도 있습니다 . 최악의 경우, 로컬 노드에 메시지가 없으며 원격 DC (많은 경우)에서 확인을받을 수 있습니다. 즉, CL.ALL로 작성한 은 수취인이 아니므로 해당 지역의 DC에서 즉시 메시지를 읽을 수 있습니다.

+0

CL.ALL은 문자 그대로 * 모든 * 복제본이 응답 할 때까지 차단됩니다. 즉, 로컬 데이터 센터 *의 모든 노드와 원격 데이터 센터의 모든 노드를 의미합니다. CL.ALL로 쓰면, 쓰기가 성공 상태로 돌아 오면 모든 것을 쓰는 것을 볼 수 있습니다. – nickmbailey

+0

복제본에서 예상되는 응답의 양은 WriteResponseHandler # determineBlockFor에 의해 계산됩니다. WriteResponseHandler는 팩토리 메소드에 의해 생성 된 abstract 클래스입니다. AbstractReplicationStrategy # getWriteResponseHandler - EACH_QUORUM 팩토리가 생성되면 : DatacenterSyncWriteResponseHandler를 생성하지만 CL.ALL의 경우 : WriteResponseHandler를 반환하며, DC를 인식하지 못합니다. CL.ALL은 xx 응답 만 기다립니다. 여기서 xx는 복제 요소입니다. 아니면 뭔가를 잃어 버렸을 수도 있습니다 .... –

+1

오른쪽.그러나 NetworkTopologyStrategy를 사용할 때 getReplicationFactor()는 모든 데이터 센터에서 * total * 복제 계수를 반환합니다. 구성된 각 데이터 센터를 거쳐 해당 DC의 RF를 합계에 더하고이를 반환합니다. ALL은 모든 데이터 센터의 모든 복제본에서 응답을 차단합니다. – nickmbailey