双节点Cassandra集群中的故障转移和复制

时间:2015-08-03 14:34:36

标签: cassandra cassandra-2.0 kairosdb

我在双节点Cassandra集群上运行KairosDB,RF = 2,写入CL = 1,读取CL = 1.如果2个节点处于活动状态,则客户端将一半数据发送到节点1(例如,从METRIC_1到METRIC_5000的度量)和另一半数据到节点2(例如从METRIC_5001到METRIC_10000的度量)。理想情况下,每个节点始终具有所有数据的副本。但是如果一个节点死了,客户端会将所有数据发送到活动节点。

客户端开始向群集发送数据。 30分钟后,我关闭节点2 10分钟。在此10分钟期间,客户端正确地将所有数据发送到节点1。之后,我重新启动了节点2,客户端继续正确地向2个节点发送数据。一小时后,我停止了客户。

我想检查当节点2已经死时发送到节点1的数据是否已自动复制到节点2。为此,我关闭节点1并在节点2从节点2死亡的时间内查询数据,但它什么也没有返回。这让我觉得数据没有从节点1复制到节点2.我发布了一个问题Doesn't Cassandra perform “late” replication when a node down and up again?。似乎数据是自动复制的,但速度很慢。

我期望两台服务器中的数据是相同的(出于冗余目的)。这意味着在节点2变为可用后,必须从节点1自动将从节点2发送到系统的数据复制到节点2(因为RF = 2)。

我在这里有几个问题:

1)复制真的很慢吗?或者我配错了什么?

2)如果客户端将一半数据发送到每个节点,我认为可能会丢失数据(例如,节点1从客户端接收数据,而节点1正在将数据复制到节点2,它会突然停止)。我是对的吗?

3)如果我在2)中是正确的,我将这样做:客户端将所有数据发送到两个节点。这可以解决2)并且如果一个节点已经死并且稍后可用,则还利用复制的优点。但我想知道,这会导致数据重复,因为两个节点都接收相同的数据。这有什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

你能检查一下cassandra.yaml配置文件中hinted_handoff_enabled的值吗?

对于您的问题:是的,在某些情况下您可能会丢失数据,直到复制完全实现,Cassandra并没有完全进行后期复制 - 有三种机制。

AFAIK,如果您运行的版本大于0.8,则提示的切换应该在节点重新启动后复制数据而不需要修复,除非数据太旧(10分钟不应该这样)。我不知道为什么那些在重启时没有发送到副本节点的切换,值得进行一些调查。

否则,当您重新启动节点时,可以强制Cassandra通过运行修复来确保数据一致(例如,通过运行nodetool修复)。

根据您的描述,我感觉您在协调器节点和获取数据的节点之间感到困惑(即使两个节点保存数据,区别也很重要)。

顺便说一句,您描述的节点1和节点2之间的度量标准分片的客户端行为是什么? KairosDB和Cassandra都不是那样工作的,是你自己的客户端将指标发送到不同的KairosDB实例吗?

Cassandra分区不是在度量标准名称上,而是在行键上(分区键完全相同,但与kairosDB相同)。因此,每个唯一系列的每3周数据将基于哈希码与令牌相关联,此令牌将用于群集上的分片/复制。 KairosDB能够与多个节点进行通信,并且可以作为协调节点在这些节点之间进行循环。

我希望这会有所帮助。