cassandra - 没有足够的副本可用于一致性 SERIAL 的查询(需要 2 个但只有 1 个活着)
问题描述
专家们,
我有以下配置3节点集群(Cassandra 2.1):
- Replication factor of 2
- Consistency level ONE
- Driver consistency level SERIAL
- SimpleStrategy
- GossipingPropertyFileSnitch
使用此配置,如果我关闭一个节点,我会收到以下错误:
Not enough replica available for query at consistency SERIAL (2 required but only 1 alive)
数据均匀分布在所有节点上,nodetool 状态正确显示一个节点在运行的 2 个 cassandra 节点上已关闭
使用 CONSISTENCY ONE 和 2 个节点 ups,为什么需要两个副本节点都 up ???
我还读到了 SERIAL 驱动器一致性 wrt WRITE 失败:如果三个节点之一关闭,Paxos 提交在以下情况下失败:
- CQL 查询配置的一致性级别 ALL
- SERIAL 驱动程序配置的串行一致性级别
- 复制因子 3
如果我将复制因子设置为 3,这将起作用。但我认为没有必要这样做。
我在这里错过了什么吗?
解决方案
您已经发现了 Cassandra 中 Paxos 协议的隐藏宝石之一。在底层,Paxos 的工作方式是使用类似于 QUORUM的一致性级别进行调用。
请注意,它在您的错误消息中抱怨 SERIAL 一致性级别,而不是您设置的一致性级别 ONE。在大多数情况下,LWT 会忽略设置的正常一致性级别。它遵循 SERIAL 或 LOCAL_SERIAL 一致性级别,几乎直接映射到节点的QUORUM或LOCAL_QUORUM。
两个节点的法定人数为:两个。因此,当一个节点关闭时,您会收到此错误消息。
推荐阅读
- java - 华为平板电脑特定设备上的 BILLING_RESPONSE_RESULT_DEVELOPER_ERROR
- java - i am getting a error in animate() which is "error: non-static method animate() cannot be referenced from a static context"
- android - 如何使用 WorkManager 接收通知操作
- ios - 接收器类型“FBSDKError”(又名“枚举 FBSDKError”)不是 Objective-C 类
- azure-resource-manager - 将变量从 terraform 传递到 arm 模板
- javascript - window.addeventlister在选择标签处于焦点状态时不会在某些设备中触发
- laravel - Bootstrap Modal 仅显示最后一项的收集数据,而不是特定 ID 的数据
- c# - DefaultIfEmpty() 不处理空集合
- file - UWP中的Serilog没有将日志写入D盘
- docker-container - docker 容器错误“无法获得 D-Bus 连接:不允许操作”