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