there are 3 ways to read data consistency:
a. WRITE ALL + READ OoNE
b. WRITE ONE + READ ALL
c. WRITE QUORUM + READ QUORUM
Run Code Online (Sandbox Code Playgroud)
对于数据,写操作通常发生一次,但经常发生读操作.但是要注意读取的一致性,是否可以合并a和b?这是WRITE ONE - > READ ONE - >如果没有找到 - > READ ALL.该方法通常只执行一次读/写操作吗?在没有数据的节点上,第一次只读取ALL.
威利安,谢谢你的精心准备.我想我需要描述我的用例,如下所示.我实现了一个时间轴使用可以发布到.用户可以关注有趣的帖子.因此,通知将发送给粉丝.为了节省带宽,用户在CL ONE上写/读帖子.最终,用户总是可以通过读取修复一段时间阅读帖子.如果他们收听帖子,关注者将收到添加到帖子中的评论通知.这是我的问题.如果通知发送给粉丝,必须确保粉丝可以阅读评论.所以我缩进使用CL ONE检查注释是否同步到查询的节点.如果没有结果,请尝试CL ALL同步评论.因此,节点的其他关注者查询不需要同步其他节点,因为之前完成了CL ALL,这可以节省带宽并降低服务器开销.因此,对于您的最终方案,我不关心该值是旧的还是最新的,因为数据是根据通知同步的.如果通知发送给关注者,我需要确保用户可以收到评论.
从相关问题的答案来看,Carlo Bertuccini写道:
什么保证一致性是以下的不一致
(WRITE CL + READ CL) > REPLICATION FACTOR
这个问题中的案例A,B和C似乎是指满足该不平衡的三种最小方式,如同一答案所示.
WRITE ALL将数据发送到all replicas.如果复制因子(RF)为三(3),则WRITE ALL在报告成功写入客户端之前写入三个副本.但是你不可能看到写入发生在下一次读取相同数据键之前.最低限度,READ ONE将从上述复制品中的单个复制品中读取,并满足必要条件: WRITE(3) + READ(1) > RF(3)
WRITE ONE将数据仅发送到一个副本.在这种情况下,获得一致读取的唯一方法是从所有这些读取.协调器节点将获得所有答案,找出哪一个是最新的,然后向过时的副本发送"提示",通知他们有更新的值.提示以异步方式发生,但仅在READ ALL发生后才满足必要条件: WRITE(1) + READ(3) > RF(3)
QUORUM操作必须涉及FLOOR(RF / 2) + 1复制品.在我们的RF = 3示例中,即FLOOR(3 / 2) + 1 == 1 + 1 == 2.同样,一致性取决于读取和写入.在最简单的情况下,读取操作会与写入操作使用的完全相同的副本进行对话,但这是永远无法保证的.在一般情况下,执行读取的协调器节点将与写入使用的至少一个副本通信,因此它将看到更新的值.在这种情况下,与READ ALL情况非常相似,协调器节点将获得所有答案,找出哪一个是最新的,然后向过时的副本发送"提示".当然,这也满足了必要条件: WRITE(2) + READ(2) > RF(3)
所以OP的问题......
为了确保一致性,如果您的意思WRITE ALL + READ ALL是"合并",因为在上述情况下您总是可以增加读者或作者的数量.
但是,WRITE ONE + READ ONE如果您需要读取一致的数据不是一个好主意,所以我的答案是:不.再次,使用该方法和我们的示例RF = 3:WRITE(1) + READ(1) > RF(3) 不成立.如果要使用此配置,接收答案,有没有价值 不能被信任 -这只是意味着一个副本联络办读没有一个值.但是值可能存在于一个或多个其他副本上.
因此,从这个逻辑来看,似乎READ ALL在接受无价值答案时会解决问题.它会用于那个用例,但还有另外一个需要考虑:如果你从...中得到一些价值怎么办?你怎么知道返回的值是"最新的"?这就是我们想要一致性的意思.如果你关心阅读最近的写作,那么你需要满足不公平.READ ALL
如果我对您描述的场景的理解是正确的,那么这些是您的用例的要点:
如果通知发送给关注者,我需要确保用户可以收到评论.
由于您的大多数条目都是一次性写入,并且您更关心条目的存在而不一定是条目的最新内容,因此如果您没有获得某些条目的记录,您可能WRITE ONE + READ ONE可以避免回退READ ALL有一些其他迹象表明它应该存在(例如来自通知).对于时间轴条目内容,听起来不像您的情况取决于时间线条目的用户内容的一致性.
如果你不关心一致性,那么这个讨论没有实际意义; 使用任何一致性级别读/写,让Cassandra的异步复制和反熵功能完成它们的工作.这就是说,虽然你的目标是最大限度地减少网络流量/成本,如果你的工作量大多读取然后做所增加的成本写在CL QUORUM或ALL实际上可能没有那么多.
你还说:
如果他们收听帖子,关注者将收到添加到帖子中的评论通知.
此声明暗示您不仅关心关注者集 是否存在,还关注其内容(用户正在关注).您还没有详细说明如何存储/跟踪关注者,但除非您确保此数据的一致性,否则一个或多个关注者可能不会收到新评论的通知,因为您检索了关注者的过时版本名单.或者,"取消关注"帖子的人仍然可以出于同样的原因收到通知.
Cassandra非常灵活,允许每个离散的读写操作使用不同的一致性级别.充分利用这一点并确保在需要的地方保持一致性并放松它,确保"读取最新的写入"对应用程序的逻辑和功能并不重要.
| 归档时间: |
|
| 查看次数: |
2234 次 |
| 最近记录: |