2014-09-24 2 views
2

2 개의 노드가있는 매우 간단한 클러스터가 있습니다. SimpleStrategy 복제 및 복제 인수 2를 사용하여 키 공간을 만들었습니다. 읽기 및 쓰기의 경우 항상 기본 데이터 일관성 수준을 1로 사용합니다.카산드라. 사용 가능한 복제본이 충분하지 않습니다. - CQL 콘솔과 다른 Java 드라이버 동작

datastax java 드라이버를 사용하여 두 노드 중 하나를 사용 중지해도 데이터를 읽을 수는 있지만 쓰기를 시도 할 때 "일관성이없는 쿼리를 사용할 수있는 복제본이 충분하지 않습니다 (1 개만 필요하지만 0 살아 있는)".

이상하게도 CQL 콘솔을 사용하여 정확하게 동일한 insert 문을 실행하면 문제없이 작동합니다. CQL 콘솔을 사용하는 경우에도 데이터 일관성 수준은 1입니다.

누락 된 항목이 있습니까?

TIA


업데이트

좀 더 많은 테스트를 수행하고 난 BatchStatement를 사용하는 경우에만 문제가 나타납니다. 준비된 진술을 직접 실행하면 작동합니다. 어떤 생각? 여기

코드

Cluster cluster = Cluster.builder() 
      .addContactPoint("192.168.1.10") 
      .addContactPoint("192.168.1.12") 
      .build(); 

    Session session = cluster.connect(); 
    session.execute("use giotest"); 

    BatchStatement batch = new BatchStatement(); 
    PreparedStatement statement = session.prepare("INSERT INTO hourly(series_id, timestamp, value) VALUES (?, ?, ?)"); 

    for (int i = 0; i < 50; i++) { 
     batch.add(statement.bind(new Long(i), new Date(), 2345.5)); 
    } 

    session.execute(batch); 
    batch.clear(); 
    session.close(); 
    cluster.close(); 
+0

연결, 세션 및 코드 작성 관련 부분을 게시 하시겠습니까? – Aaron

+0

원래 게시물에 추가했습니다. 감사합니다. – gioper86

+0

여기에 방금 뱉어 내지 만, 노드를 문자열 배열로 정의하고 대신 .addContactPoints (nodes)를 사용하십시오. 이제 귀하의 문제는 배치 진술 중에 만 발생하는 것으로 보입니다. 아마도 차이가 없을 것입니다 ... 철저합니다. – Aaron

답변

2

배치는 기본적으로 기본적입니다. 코디네이터가 중간 배치에 실패하면 Cassandra는 다른 노드가 나머지 요청을 재생하는지 확인합니다. 분산 배치 로그를 사용합니다 (자세한 내용은 this post 참조).

이 배치 로그는 코디네이터 이외의 하나 이상의 복제본으로 복제되어야하며, 그렇지 않으면 위의 메커니즘을 무력화해야합니다.

귀하의 경우에는 다른 복제본이없고 코디네이터 만 있습니다. 따라서 카산드라는 원자 배치의 보장을 제공 할 수 없다고 말합니다. CASSANDRA-7870에 대한 토론을 참조하십시오.

+0

좋은 답변, 고마워. – gioper86

+1

마지막 세부 사항 : 단일 노드 클러스터에는 적용되지 않습니다. –

0

당신이하지 않았다면, 당신은 드라이버 수준에서 두 호스트를 지정해야합니다.

+0

예 양쪽 모두 연락처로 추가했습니다. – gioper86