cassandra – 一致性级别的读/写策略

基于 Read Operation in Cassandra at Consistency level of Quorum?

there are 3 ways to read data consistency:
a. WRITE ALL + READ OoNE
b. WRITE ONE + READ ALL
c. WRITE QUORUM + READ QUORUM

对于数据,写操作通常发生一次,但经常发生读操作.
但是要注意读取的一致性,是否可以合并a和b?
这是,WRITE ONE – > READ ONE – >如果没有找到 – >全部阅读.
该方法通常只执行一次读/写操作吗?
在没有数据的节点上,第一次只读取ALL.

我的理解是否正确?

威利安,谢谢你的精心准备.我想我需要描述一下我的用例,如下所示.我实现了一个时间轴使用可以发布到.用户可以关注有趣的帖子.因此,通知将发送给关注者.为了节省带宽,用户在CL ONE上写/读帖子.最终,用户总是可以通过阅读修复一段时间阅读帖子.如果他们收听帖子,关注者将收到添加到帖子中的评论通知.这是我的问题.如果通知发送给粉丝,必须确保粉丝可以阅读评论.所以我缩进使用CL ONE检查注释是否同步到查询的节点.如果没有结果,请尝试CL ALL同步评论.因此,节点的其他关注者查询不需要同步其他节点,因为之前完成了CL ALL,这可以节省带宽并降低服务器开销.因此,对于您的最终方案,我不关心该值是旧的还是最新的,因为数据是根据通知同步的.如果通知发送给关注者,我需要确保用户可以收到评论.

the answer到相关问题,Carlo Bertuccini写道:

What guarantees consistency is the following disequation

(WRITE CL + READ CL) > REPLICATION FACTOR

这个问题中的案例A,B和C似乎指的是满足该不平衡的三种最小方式,如同一答案中给出的那样.

案例A.

WRITE ALL将数据发送到所有副本.如果复制因子(RF)为三(3),则WRITE ALL会在向客户端报告成功写入之前写入三个副本.但是你不可能看到写入发生在下一次读取相同的数据键之前.最低限度,READ ONE将从上述复制品中的单个复制品中读取,并满足必要条件:WRITE(3)READ(1)> RF(3)

案例B.

WRITE ONE将数据仅发送到一个副本.在这种情况下,获得一致读取的唯一方法是从所有这些读取.协调器节点将获得所有答案,找出哪一个是最新的,然后向过时的副本发送“提示”,通知他们有更新的值.提示异步发生但仅在READ ALL发生后才满足必要条件:WRITE(1)READ(3)> RF(3)

案例C

QUORUM操作必须涉及FLOOR(RF / 2)1个复制品.在我们的RF = 3示例中,即FLOOR(3/2)1 == 1 1 == 2.同样,一致性取决于读取和写入.在最简单的情况下,读取操作会与写操作使用的完全相同的副本进行对话,但这一点从未得到保证.在一般情况下,执行读取的协调器节点将与写入使用的至少一个副本通信,因此它将看到更新的值.在这种情况下,就像READ ALL情况一样,协调器节点将获得所有答案,找出哪一个是最新的,然后向过时的副本发送“提示”.当然,这也满足必要条件:WRITE(2)READ(2)> RF(3)

所以OP的问题……

是否有可能“合并”案件A和B?

为了确保一致性,如果您的意思是全部读取全部,则只能“合并”,因为在上述情况下您总是可以增加读者或作者的数量.

但是,如果您需要读取一致的数据,WRITE ONE READ ONE不是一个好主意,所以我的答案是:不.再次,使用该方法和我们的示例RF = 3:WRITE(1)READ(1)> RF(3)不成立.如果您要使用此配置,则无法接受没有值的答案 – 这只是意味着联系的一个副本执行读取时没有值.但是值可能存在于一个或多个其他副本上.

因此,从这个逻辑来看,似乎在接收无值答案时执行READ ALL可以解决问题.它会用于那个用例,但还有另一个需要考虑:如果你从READ ALL中得到一些价值怎么办…你怎么知道返回的值是“最新的”?这就是我们想要一致性的意思.如果你关心阅读最近的写作,那么你需要满足不适.

关于编辑问题中“时间轴”通知的用例

如果我对您描述的场景的理解是正确的,那么这些是您的用例的要点:

>大多数(但不是全部?)时间轴条目将是一次写入(稍后不再修改)
>可以遵循任何此类条目(有一个关注者列表)
>任何此类条目都可以评论(有一个评论列表)
>对时间线条目的任何评论都应触发对该时间线条目的关注者列表的通知
>尝试最小化“正常”情况下的成本(在这种情况下,以带宽测量)
>愿意依赖Cassandra内置的反熵功能(例如读修)

I need to ensure users can get the comment if notification was delivered to followers.

由于您的大多数条目都是一次性写入,并且您更关心条目的存在而不一定关注条目的最新内容,因此如果您有可能的话,您可以使用WRITE ONE READ ONE来回退READ ALL没有任何其他迹象表明它应该存在的记录(例如来自通知).对于时间轴条目内容,听起来不像您的情况取决于时间线条目的用户内容的一致性.

如果你不关心一致性,那么这个讨论没有实际意义;使用任何一致性级别读/写,让Cassandra的异步复制和反熵功能完成它们的工作.也就是说,虽然您的目标是最大限度地减少网络流量/成本,但如果您的工作负载主要是读取,那么在CL QUORUM或ALL进行写入的额外成本可能实际上并不那么多.

你还说:

Followers will receive the notification of comments added to post if they listen the post.

这句话暗示您不仅关心关注者是否存在,而且还关注其内容(用户正在关注).您还没有详细说明如何存储/跟踪关注者,但除非您确保此数据的一致性,否则一个或多个关注者可能不会收到新评论的通知,因为您检索了关注者的过时版本名单.或者,“取消关注”帖子的人仍然可以出于同样的原因收到通知.

Cassandra非常灵活,允许每个离散的读写操作使用不同的一致性级别.充分利用这一点并确保在需要的地方保持一致性并放松它,确保“读取最新的写入”对应用程序的逻辑和功能并不重要.

相关文章
相关标签/搜索