我有两个数据中心,每个数据中心的复制因子为 3。
在数据存储在两个 DC(6 个节点,或 3 + 1)之前,是否会使用 CL.ALL 块进行写入?我假设它会阻塞,直到本地 DC 中的所有 3 个副本都确认成功写入。
我想要类似 CL.ALL_LOCAL 的东西,它将所有副本上的数据存储在单个 DC 中,因此我可以使用 CL.ONE 读取。这个想法是,写入阻塞,直到单个 DC 中的所有副本都具有持久数据,并且随后的读取将有很高的概率读取新数据
我有两个数据中心,每个数据中心的复制因子为 3。
在数据存储在两个 DC(6 个节点,或 3 + 1)之前,是否会使用 CL.ALL 块进行写入?我假设它会阻塞,直到本地 DC 中的所有 3 个副本都确认成功写入。
我想要类似 CL.ALL_LOCAL 的东西,它将所有副本上的数据存储在单个 DC 中,因此我可以使用 CL.ONE 读取。这个想法是,写入阻塞,直到单个 DC 中的所有副本都具有持久数据,并且随后的读取将有很高的概率读取新数据
目前没有提供您所描述内容的一致性级别。最接近的是 LOCAL_QUORUM ,它将在本地数据中心中的法定人数节点响应后返回。
如果您愿意,可以在 jira 上提交工单以添加此功能。
我检查了 Cassandra 1.1 代码,并注意到在多 DC 部署中使用 CL.ALL 编写时的有趣行为。可能我把代码解释错了....无论如何:
一开始,他们正在收集节点的 IP 地址以发送行突变 - 这与客户端提供的一致性级别无关。在 1.0 中,它是来自所有 DC 的所有节点,从 1.1 开始,它们从本地 DC 获取所有节点,加上来自每个远程 DC 的一个节点(其余节点在消息中作为“转发到”)。每个突变将由单独的线程发送,因此请求可以并行运行。每个这样的突变都被消息服务作为消息处理。远程 DC 中的节点收到消息后,将其转发给“转发至”中提供的剩余节点。
客户端提供的一致性级别定义了必须确认接收到的消息的节点数。在 CL.ALL 的情况下,这个数字由复制因子决定——现在变得有趣了:因为我们已经从本地 DC 向所有节点和远程 DC 的节点发送消息,我们也会从那些删除节点那里得到确认——是的这仍然是由复制因子定义的数字,但根据 notwork 延迟,我们无法确定哪些节点符合接收到的消息 - 可能来自本地和远程 DC 的节点,但也可能只是来自本地 DC 的节点. 在最坏的情况下,可能会发生本地节点都没有收到消息,并且确认来自远程 DC(如果您有很多)。这表示 -用 CL.ALL 写作不会被授予,您可以立即阅读来自本地 DC 的消息。