cassandra Paxos是在第一条语句运行还是在整个批处理中运行?

relj7zay  于 2023-05-17  发布在  Cassandra
关注(0)|答案(1)|浏览(188)

我试图弄清楚LWT在Cassandra中如何处理相对较大的批处理。我的用例主要涉及以下内容:

BEGIN BATCH
  UPDATE foo SET generation = 10 WHERE partitionKey = '0' IF generation < 10;
  INSERT INTO ...; --- all inserts here use the same partitionKey
  INSERT INTO ...;
END BATCH

第一条语句始终是使用LWT的CAS操作,而批处理的其余部分是不带IF子句的简单插入语句,尽管可能有数千条。我使用第一个CAS语句来“隔离”编写器(如果存在竞争编写器)。
在稳定状态下,每个分区键只有一个writer,因此这些操作上的争用应该非常罕见。我想知道的是如何推理这些操作的性能?Paxos是在第一条语句中运行一次,还是在整个批处理中运行?
我倾向于得到很多例外,比如:

Caused by: com.datastax.oss.driver.api.core.servererrors.WriteTimeoutException: Cassandra timeout during CAS write query at consistency SERIAL (1 replica were required but only 0
acknowledged the write)

另外,我在某个地方读到LWT是通过分区键并行化的,所以如果多个写入器到不同的分区键,会导致任何问题吗?
代码似乎在大部分时间都能工作,但运行一段时间后,我会出现如上所示的超时。如果我只运行一个Cassandra节点,也会发生这些超时。
另外,任何关于在服务器日志中查找什么的指针都是有帮助的--我在具有INFO日志级别的cassandra.log文件中没有看到任何异常。

qvk1mo1f

qvk1mo1f1#

你所描述的问题与LWT或Paxos没有任何关系。问题是你把太多的突变放在一起了。
我怀疑您正在错误地使用批处理来大容量加载数据。即使对于单分区批处理,磁盘仍然需要能够跟上写入。这就是导致WriteTimeoutException的原因--磁盘过载,因此节点在写请求超时时间内不响应协调器(对于单节点集群,是它自己)。
CQL批处理与传统关系数据库中的优化方式不同。只有在需要原子性时才应该批处理语句。
在几乎所有情况下,单独的异步写入总是优于批处理。干杯!

相关问题