我在 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) 并且如果一个节点已死并且稍后可用,还可以利用复制。但我想知道,这会导致数据重复,因为两个节点都接收相同的数据。这里有什么问题吗?
谢谢!