【问题标题】:Cassandra write with Consistency level ALLCassandra 写入一致性级别 ALL
【发布时间】:2021-05-07 20:23:14
【问题描述】:

根据documentation写的一致性级别ALL意味着:

必须将写入写入该分区集群中所有副本节点上的提交日志和内存表。

我有一个 Cassandra 集群,有 3 个节点,复制因子为 3。

当 3 个节点中有 2 个节点关闭时,Cassandra 写道,其中一致性级别设置为 ALL 不会失败(仍然成功)。

关于读取操作的文档很清楚:

在所有副本都响应后返回记录。如果副本没有响应,读取操作将失败

当涉及到 ALL 一致性写入时——它会简单地尝试写入所有副本节点,但如果失败,那么仍然可以(不返回异常)?

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    您在这里看到的是Hinted Handoff

    通常,写操作被发送到单个节点(协调器),该节点确保所有副本都被写入并在满足一致性设置时返回。如果无法写入副本,则将其存储在本地(在协调器上)。一旦宕机节点回来,就会重播提示,并恢复一致性(理论上)。

    但请记住,默认情况下,提示仅持续 3 小时。

    所以在这种情况下,写入会继续发生,但读取会抛出“副本不足”异常。

    【讨论】:

    • 我浏览了我的应用程序日志并找到了一些com.datastax.driver.core.exceptions.WriteTimeoutException。如果我们有 Hinted Handoff 机制,WriteTimeoutException 是否会在协调器认为节点已启动,尝试写入,但没有及时得到确认时发生?一致性级别是否仍然适用于此 - 例如一致性级别:ONE,当我们在某些节点上写入失败时不会抛出异常,而是与 con 一起抛出。等级:全部?以较低的一致性级别重试是否有意义(遇到此异常时)?
    • @TomaszKubiak 是的,我肯定会以较低的一致性级别重试。 DataStax 驱动程序曾经在本质上执行此操作,但已弃用该功能。
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2016-07-05
    • 2015-10-09
    • 2017-01-09
    • 2018-06-13
    • 2015-06-22
    • 2018-07-26
    相关资源
    最近更新 更多