2014-12-12 3 views
1

나는 고객과 같이 세 개의 데이터 센터 중 하나에 연결해야하는 DataStax 카산드라 자바 드라이버 2.1.2를 사용하고 있습니다에 "DC1", 1)))시도 UnavailableException의 다른 데이터 센터

이렇게하면 DC1이 로컬 데이터 센터로 설정되지만 드라이버가 다른 두 원격 데이터 센터에 하나의 연결을 설정하게됩니다.

이제 노드 중 일부가 로컬 데이터 센터에 다운 된 경우 클라이언트는 insert 문에서 로컬 쿼럼을 가져 오지 못하고 UnavailableException이 발생합니다. 그러나 원격 데이터 센터에서 사용할 수있는 충분한 노드가있어 인서트가 쿼럼을 확보하고 성공할 수 있으므로 드라이버가 다른 데이터 센터의 인서트를 다시 시도하길 바랍니다. 그러나 나는 어떻게 이것을 운전자에게 말 하느냐?

더 낮은 일관성 수준으로 다시 시도하도록 RetryPolicy를 설정하는 방법이 있지만 원격 데이터 센터에 다시 시도하는 것에 대해 아무 것도 표시되지 않는 것처럼 보입니다.

DC1의 모든 노드가 다운 된 경우 드라이버는 성공한 원격 데이터 센터에서 삽입을 시도합니다.

답변

1

내가 먼저이 설정으로 삽입을 시도되는 일이 점점 결국 방법 (내가 사용하고 있음을 유의 삽입에 절 "NOT이있는 경우") :

statement.setConsistencyLevel (ConsistencyLevel .LOCAL_QUORUM); statement.setSerialConsistencyLevel (ConsistencyLevel. LOCAL_SERIAL);

"이것은 존재하지 않으면"체크와 쓰기 모두에 대해 로컬 쿼럼을 얻을 수있는 경우에만 삽입을 수행하도록 지시합니다. 충분한 복제본이 로컬 쿼럼을 얻을 살아가없는 경우, 나는 UnavailableException 및 NoHostAvailableException 예외를 잡아에 일관성 수준 변경 :

statement.setConsistencyLevel (. ConsistencyLevel 정족수을); statement.setSerialConsistencyLevel (ConsistencyLevel. SERIAL);

그런 다음 삽입을 다시 시도하고 이번에는 모든 데이터 센터에서 쿼럼을 얻고 성공할 것입니다. 따라서이 방법을 사용하면 로컬 DC로 매우 비싼 "IF NOT EXISTS"검사를 제한하고 일부 로컬 복제본이 다운되었을 때 물 속에서 죽지 않을 것이라는 신뢰성을 얻음으로써 대부분의 인서트에 상당한 성능을 얻을 수 있습니다.

관련 문제