java - Cassandra 是否有可能返回不一致的值?
问题描述
我对 Cassandra 很陌生,我想知道,Cassandra 是否有可能返回不一致的值?
例如,假设我们有六个节点集群。
LOCAL_QUORUM = (replication_factor/2) + 1
这将为我们提供 4 的 Local Quorum。因此,对于简单的写入,六个节点中有四个必须响应,这意味着四个节点将具有最新值。
据我了解,没有更新的两个节点最终都是通过 Gossip Protocol 更新的。
如果是这样,如果客户端从协议发生之前未更新的两个节点之一读取会发生什么?他们是否有获得陈旧价值的风险?
阅读修复如何影响这一切?
*也是一个快速的旁注。并不是说您会这样做,但是如果您将复制因子设置为等于一致性级别,那么这与背面的 2PC(两阶段提交)本质上是否相同?
解决方案
欢迎来到卡桑德拉世界
Cassandra 是否有可能返回不一致的值?
是的,Cassandra 本质上具有“最终一致”的方法,因此,如果您使用ANY 或 ONE为读取设置一致性级别,则返回不一致值的风险会增加。您可以增加此设置以ALL
确保信息一致,但会牺牲性能和弹性。应用程序中使用的级别将取决于您的用例。
例如,假设我们有六个节点集群。
LOCAL_QUORUM = (replication_factor/2) + 1
复制因子与集群中的节点数量无关,经验法则是您拥有的是复制因子不应大于节点数量。
假设您在 6 个节点的集群中使用 6 的复制因子:
这将为我们提供 4 的 Local Quorum。因此,对于简单的写入,六个节点中有四个必须响应,这意味着四个节点将具有最新值。
据我了解,没有更新的两个节点最终都是通过 Gossip Protocol 更新的。
确保复制因子得到满足的机制是Hinted handoffs;节点使用gossip 协议报告节点的状态(来自自身和其他节点),其中一些状态是“up”、“down”、“healthy”、“joining”、“leaving”等.
如果是这样,如果客户端从协议发生之前未更新的两个节点之一读取会发生什么?他们是否有获得陈旧价值的风险?
你会想了解Cassandra 的读取路径;作为 tl dr,这将取决于复制因子以及读取操作的一致性级别。您还可以降低因数据不准确而牺牲弹性和性能的风险。
推荐阅读
- laravel - Any examples of Laravel Socialite used in React Native?
- git - Azure Dev Ops REST API - 有没有办法在拉取请求中获得最终的累积更改
- julia - Using Iterators.product on a variable number of lists
- node.js - Im trying to reduplicate the shelljs exec type execution in node
- reactjs - How do I debug when React.js produces no output?
- css - Improving the icons in css
- python - How to Refactor multiple elif statements with CSV, i dont know how to approach it im a beginner
- java - Spring Boot Integration Test and custom AuthenticationProvider
- docker - 在 kubernetes 的本地环境中使用主机名连接到 docker 容器
- c++ - 允许动态分配的 C 对象数组