批量插入/更新中的卡桑德拉不一致
本文关键字:桑德拉 不一致 更新 插入 | 更新日期: 2023-09-27 17:56:50
我收到以下错误消息:
Cassandra timeout during write query at consistency ONE (0 replica(s) acknowledged the write over 1 required)
我正在使用复制因子为 3 的 Cassandra。一切都像它应该的那样工作。但是最近,我发现了一个错误。也许它发生在Cassandra或我正在使用的datastax c# cassandra驱动程序中。
为了 100% 确定,我在测试中设置了所有一致性级别的可能性以ConsistencyLevel.Quorum
.但我也尝试了ConsistencyLevel.Two
.
两个设置都出现问题。
我的问题不是超时,这是我可以解决的问题。我担心我收到一条错误消息,说需要 1 个确认(一致性 ONE)。虽然我把所有东西都设置为ConsistencyLevel.Quorum
或ConsistencyLevel.Two
.
如果没有 WriteTimeoutException,我永远不会注意到,可能存在一致性问题。
我还使用了跟踪并得到以下(更深层次的)错误:
Cassandra.Session: RequestHandler received exception Cassandra.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (0 replica(s) acknowledged the write over 1 required)
下面是一些测试代码:
var cluster = Cluster.Builder().AddContactPoints("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4", "192.168.0.5")
.WithQueryOptions(new QueryOptions().SetConsistencyLevel(ConsistencyLevel.Quorum))
.WithCompression(CompressionType.LZ4).Build();
var session = cluster.Connect();
insertStatementTableX = session.Prepare(
"INSERT INTO keyspace.x (a, b, c) VALUES (?, ?, ?);").SetConsistencyLevel(ConsistencyLevel.Quorum);
insertStatementTableY = session.Prepare(
"INSERT INTO keyspace.y (a, b, c) VALUES (?, ?, ?);").SetConsistencyLevel(ConsistencyLevel.Quorum);
var batch = new BatchStatement();
batch.SetConsistencyLevel(ConsistencyLevel.Quorum);
batch.Add(insertStatementTableX.Bind(1, 2, 3)).SetConsistencyLevel(ConsistencyLevel.Quorum);
batch.Add(insertStatementTableY.Bind(2, 3, 4)).SetConsistencyLevel(ConsistencyLevel.Quorum);
session.Execute(batch);
我可以假设,尽管我将其设置为法定人数,但所有其他插入/更新现在也以一致性级别 ONE 完成?还是只是错误消息错误?
在 Cassandra 中,对于写入操作,超时不是失败。
这意味着等待实际副本响应写入成功的协调器已经过去了一段时间。
它尚不可用于读取,但它已写入批处理日志,您不应让客户端重试。如果您正在寻找低延迟和写入永不失败的保证(最高可用性),则可以将写入一致性更改为 ANY。