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

Posted

技术标签:

【中文标题】2 节点 Cassandra 集群中的故障转移和复制【英文标题】:Failover and Replication in 2-node Cassandra cluster 【发布时间】:2015-08-03 14:34:36 【问题描述】:

我在 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。我发布了一个问题 Doesn't Cassandra perform “late” replication when a node down and up again?。数据好像是自动复制的,但是太慢了。

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

我有几个问题:

1) 复制真的很慢吗?还是我配置有问题?

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

提示切换http://docs.datastax.com/en/cassandra/2.2/cassandra/operations/opsRepairNodesHintedHandoff.html 维修 - http://docs.datastax.com/en/cassandra/2.0/cassandra/tools/toolsRepair.html 阅读修复 - 这些可能对您的用例没有太大帮助 - http://wiki.apache.org/cassandra/ReadRepair

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

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

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

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

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

我希望这会有所帮助。

【讨论】:

“您描述的节点 1 和节点 2 之间的指标分片的客户端行为是什么?” -> 我只想做负载平衡之类的事情。 “是您自己的客户端向不同的 KairosDB 实例发送指标吗?” -> 在 node1 上的 kairosdb.properties 我刚刚配置了“kairosdb.datastore.cassandra.host_list=node1.hdsrcluster:9160”,在 node2 上的 kairosdb.properties 我刚刚配置了“kairosdb.datastore.cassandra.host_list=node2.hdsrcluster:9160” ”。然后我在两个节点上通过“kairosdb.sh start”运行 KairosDB。我做得对吗? 好的,我明白了。是的,这很好,您正在推送数据的客户端正在执行负载平衡。这让我问了一个问题:当节点 2 关闭时,您是否检查过数据是否正确填充到 Cassandra? 是的。但是,正如我所提到的,它非常缓慢。也许我需要更快的方法,或者我需要手动运行“nodetool repair”。顺便说一句,让我们忘记我的系统模型,您能否建议我任何可以处理故障转移(即无论一台服务器是否出现故障)和“延迟”复制作为要求的 KairosDB + Cassandra 系统模型? (即,如果服务器(例如节点 2)关闭并再次启动,“丢失”的数据将快速从节点 1 同步到节点 2。我需要这个,因为如果在该节点 1 关闭后我不会丢失任何数据) 而且,只有 2 个节点。 正如我所说,我很惊讶在使用提示切换重新启动节点 2 后您没有快速复制数据。 cassandra.yaml 中是否启用了该功能?您使用的是哪个版本的 Cassandra?如果启用,这听起来像是 Cassandra 开发人员的问题。

以上是关于2 节点 Cassandra 集群中的故障转移和复制的主要内容,如果未能解决你的问题,请参考以下文章

2012故障转移群集的搭建(本人小白)

Redis的集群(故障转移)

如何使用Cassandra复制因子1管理节点故障?

Memtable在哪里可以找到cassandra?

SQL Server Alwayson搭建四:故障转移集群配置

RabbitMQ集群恢复与故障转移的5种解决方案