Cassandra - 用CL.ALL写入多个数据中心

时间:2012-06-21 08:15:40

标签: cassandra

我有两个数据中心,每个数据中心都有一个复制因子3.

将使用CL.ALL块写入,直到数据存储在两个DC(6个节点或3 + 1)中? 我认为它会阻塞,直到本地DC中的所有3个副本都已确认成功写入。

我想要像CL.ALL_LOCAL这样的东西,它在单个DC中存储所有副本的数据,所以我可以用CL.ONE读取。这个想法是,写入块直到单个DC中的所有副本都持有数据,并且读取后将很有可能读取新数据

2 个答案:

答案 0 :(得分:2)

目前没有提供您所描述内容的一致性级别。最接近的是LOCAL_QUORUM,它将在本地数据中心的法定数量的节点响应后返回。

如果您愿意,可以在jira上提交票证以添加此功能。

https://issues.apache.org/jira/browse/CASSANDRA

答案 1 :(得分:0)

我检查了Cassandra 1.1代码,并注意到在多DC部署中使用CL.ALL编写时的有趣行为。 无论如何我可能解释了代码错误 ....

一开始他们收集节点的IP地址以发送行变异 - 这与客户端提供的一致性级别无关。在1.0中,它是来自所有DC的所有节点,从1.1获得来自本地DC的所有节点加上来自每个远程DC的一个节点(其余节点在消息中为“前向”)。每个突变都将由单独的线程发送,因此请求可以并行运行。每个这样的突变都由消息服务作为消息处理。当远程DC中的节点收到消息时,它会将其转发到剩余节点,这些节点在“转发到”中提供。

客户端提供的一致性级别定义了必须确认收到的消息的节点数。在CL.ALL的情况下,这个数字由复制因子决定 - 现在变得有趣:因为我们已经从本地DC发送消息到远程DC的节点,我们也会从这些删除节点得到确认 - 是的这仍然是由复制因子定义的数字,但是根据工作延迟,我们无法确定哪些节点符合接收消息 - 可以从本地和远程DC的节点混合,但也可以只是本地DC的节点。在最坏的情况下,可能会发生,没有任何本地节点收到消息,并且确认来自远程DC(如果你有很多)。这意味着 - 使用CL.ALL写入不会被授予,您可以立即从本地DC读取消息