写查询期间的Cassandra超时但Datebase中存在条目

时间:2018-02-04 11:14:46

标签: cassandra timeout bigdata datastax cassandra-3.0

我们在我们的系统上使用Cassandra 3.0。为了在db中插入,我们使用Datastax C#驱动程序。

我们有一个关于超时和插入期间重试的查询。我们遇到了一个实例,其中在插入期间抛出了超时,但数据库中存在该条目。所有设置都是Cassandra.yaml文件以及驱动程序中的默认设置。

即使有超时,我们如何知道插入的实际状态?如果抛出超时,插入怎么可能前进?无论插入是成功还是已经应用了一些默认重试策略,我们目前都没有任何明确的答案,我们需要确切了解这一点。

如果有或没有超时,我们如何确保该插入的状态实际成功/失败?

1 个答案:

答案 0 :(得分:1)

写入超时不一定是写入失败,而且它是一个通知,没有足够的副本在一段时间内确认写入。写作仍将最终发生在所有副本上。

如果确实观察到写入超时,则表示没有足够的副本响应cassandra.yaml中配置的write_request_timeout_in_ms值内配置的一致性级别,默认值为2秒。但请记住,写入仍然会发生。

负责该写入的协调Cassandra节点会向所有副本发送写入突变,并在响应或达到超时后立即响应客户端。因此,如果你得到一个WriteTimeoutException,你应该假设写了。如果任何副本已关闭,协调器将为该写入保留hint,该副本将在再次可用时传送到副本。

Cassandra还使用Read Repairs,运营商应该定期运行Repairs以帮助保持数据的一致性。

如果您的操作是idempotent,则只需重试写入,直到成功为止。或者您可以尝试重新读取数据以确保写入已处理。但是,根据您的应用程序要求,您可能不需要采用这些策略,并且可以安全地假设写入已经或将要发生。

另一方面,请注意unavailable错误(即Not enough replicas available at consistency level X)表示没有足够的副本可用于执行写操作,因此从不尝试写入。