3

我在 2 节点 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。我发布了一个问题Cassandra 不会在节点关闭和再次启动时执行“延迟”复制吗?. 数据似乎是自动复制的,但速度太慢了。

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

我在这里有几个问题:

1)复制真的很慢吗?还是我配置错误?

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

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

谢谢!

4

1 回答 1

3

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

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

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

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

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

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

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

我希望这有帮助。

于 2015-08-03T15:59:02.970 回答