gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:12:30 25 4
gpt4 key购买 nike

基于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?
这是,写一个->读一个->如果找不到->读所有。
该方法通常满足一次读/写操作一次吗?
第一次在没有数据的节点上仅读取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将数据发送到 all replicas。如果您的复制因子(RF)为三(3),则 WRITE ALL在向客户端报告成功写入之前将写入三个副本。但是您可能看不到在下次读取同一数据 key 之前发生写入。最少, 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 ALL + READ ALL时才可以“合并”,因为在上述情况下,您始终可以增加读取器或写入器的数量。

但是,如果您需要读取一致的数据, WRITE ONE + READ ONE不是一个好主意,所以我的答案是: no 。同样,使用该不等式和我们的示例RF = 3: WRITE(1) + READ(1) > RF(3) 不保存。如果您使用此配置,则收到的答案是没有值 不能被信任 -这只是意味着联系进行读取的一个副本没有值。但是值可能存在于一个或多个其他副本上。

因此,从该逻辑来看,似乎在接收到无值答案时执行 READ ALL即可解决该问题。对于该用例,这是需要考虑的另一个问题:如果您从 READ ALL ... 中获得了一些值(value),怎么办?您如何知道返回的值是“最新的”值(value)呢?这就是我们想要一致性时的意思。如果您想阅读最新的论文,那么您就需要满足这个条件。

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

如果我对您所描述的场景的理解是正确的,那么以下是您的用例的要点:
  • 大多数(但不是全部?)时间线条目将一次写入(以后不修改)
  • 可以跟踪任何此类条目(有关注者列表)
  • 可以评论任何此类条目(有评论列表)
  • 对时间线条目的任何评论应触发该时间线条目的关注者列表的通知
  • 尝试最小化“正常”情况下的成本(在这种情况下,以带宽衡量)
  • 愿意依靠Cassandra内置的反熵功能(例如读取修复)

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



    由于您的大多数条目都是一次写入的,并且您更关心条目的存在,而不必关心条目的最新内容,因此,如果您没有记录,则可以使用 WRITE ONE + READ ONE并回退到 READ ALL。有其他指示的东西应该存在(例如,从通知中得知)。对于时间轴条目的内容,听起来好像情况并非取决于时间轴条目的用户内容的一致性。

    如果您不关心一致性,那么讨论就没有意义了。使用任何一致性级别进行读/写,并让Cassandra的异步复制和反熵功能发挥作用。就是说,尽管您的目标是最大程度地减少网络流量/成本,但是如果您的工作量主要是读取,那么在CL QUORUMALL上执行写操作的额外费用实际上可能并不那么多。

    您还说过:

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



    该语句意味着您不仅在乎关注者的 集是否存在,而且在乎其内容(用户正在关注)。您尚未详细说明如何存储/跟踪关注者,但是除非确保此数据的一致性,否则可能由于检索到的关注者版本过旧而未通知一个或多个关注者新评论。列表。或者,“取消关注”帖子的人仍然可以出于相同的原因收到通知。

    Cassandra非常灵活,允许每个离散的读写操作使用不同的一致性级别。利用此优势,确保需要的地方具有强大的一致性,并在确保“读取最新写入”对应用程序的逻辑和功能不重要的地方放宽它。

    关于cassandra - 一致性级别的读/写策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25965038/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com