我有一个非常简单的集群,有 2 个节点。 我创建了一个具有 SimpleStrategy 复制且复制因子为 2 的键空间。 对于读取和写入,我始终使用默认的数据一致性级别 ONE。
如果我通过使用 datastax java 驱动程序删除两个节点之一,我仍然可以读取数据,但是当我尝试写入时,我得到“没有足够的副本可用于一致性 1 的查询(需要 1 个,但只有 0 个事件) )”。
奇怪的是,如果我使用 CQL 控制台执行完全相同的插入语句,它就可以正常工作。即使使用 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();
请您参考如下方法:
默认情况下,批处理是原子的:如果协调器在批处理中失败,Cassandra 将确保其他节点重播剩余的请求。它使用分布式批处理日志(有关更多详细信息,请参阅 this post)。
该批处理日志必须复制到除协调器之外的至少一个副本,否则将会破坏上述机制。
在您的情况下,没有其他副本,只有协调器。因此,Cassandra 告诉您它无法提供原子批处理的保证。另请参阅 CASSANDRA-7870 上的讨论.