Java 没有足够的副本可供查询

Java 没有足够的副本可供查询,java,cassandra-2.0,datastax-java-driver,cqlsh,Java,Cassandra 2.0,Datastax Java Driver,Cqlsh,我创建了一个Cassandra群集,其中包含2个节点和键空间,复制因子为2: CREATE KEYSPACE data WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 }; 当两个节点都启动时,一切正常。但每当我取下其中一个节点时,我都会从Java客户端收到以下错误: com.datastax.driver.core.exceptions.UnavailableException: Not en

我创建了一个Cassandra群集,其中包含2个节点和键空间,复制因子为2:

CREATE KEYSPACE data WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };
当两个节点都启动时,一切正常。但每当我取下其中一个节点时,我都会从Java客户端收到以下错误:

com.datastax.driver.core.exceptions.UnavailableException: Not enough replica available for query at consistency ONE (1 required but only 0 alive)
由于一个节点仍在运行,并且密钥空间已被复制,因此我希望查询能够成功。事实上,我能够在运行节点上登录到cqlsh,并在CLI上手动设置“consistency one”,并从cqlsh成功执行查询

但是从我的Java客户机来看,所有查询都失败了,即使有一个节点仍然正常。但是,如果我使用nodetool手动删除down节点(
nodetoolremovenode
),那么Java客户端就可以正常工作。我正在使用DataStax Java驱动程序

下面是一个测试Java代码:

公共类CassandraTest{
公共静态void main(字符串[]args){
集群;
会议;
结果集结果;
行;
//连接到集群并按空格键“demo”
群集=群集
.builder()
.addContactPoint(“172.31.2.11”)
//.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
//.使用负载平衡策略(
//新的TokenAwarePolicy(新的DCAwareRoundRobinPolicy())
.build();
会话=cluster.connect(“用户_数据”);
//在用户表中插入一条记录
PreparedStatement语句=session.prepare(
在用户配置文件中插入“+”(姓氏、用户id、用户角色、电子邮件、名字)
+“值(?,?,?,?);”;
BatchStatement batch=新的BatchStatement();
batch.add(statement.bind(“琼斯”、“22321”、“测试角色”),
"bob@example.com","鲍勃"),;
batch.add(statement.bind(“Jones2”、“222321”、“2Test角色”),
"2bob@example.com","2Bob"),;
session.execute(批处理);
}      
}
当其中一个Cassandra节点出现故障时,DataStax Java驱动程序中的BatchStatements似乎存在问题。如果我将代码更改为使用BoundStatement,而不是BatchStatement,Java代码将正常工作


当其中一个节点关闭时,有什么建议的解决方法可以让BatchStatements正常工作吗?

您能通过java代码发送连接和查询吗?这应该行得通,我以前做过同样的事情,2节点集群和1节点关闭。你能分享你的java代码吗。除非在java代码中设置一致性,否则java代码没有失败的理由。当其中一个节点失败时,DataStax java驱动程序中的BatchStatements似乎有问题。为什么当出现节点故障时,Java驱动程序中的批处理语句会失败,而BoundStatements工作正常?您能够通过Java代码发送连接和查询吗?这应该行得通,我以前做过同样的事情,2节点集群和1节点关闭。你能分享你的java代码吗。除非在java代码中设置一致性,否则java代码没有失败的理由。当其中一个节点失败时,DataStax java驱动程序中的BatchStatements似乎有问题。为什么当出现节点故障时,Java驱动程序中的批处理语句会失败,而BoundStatements工作正常?