2 节点 Cassandra 集群中的故障转移和复制
Failover and Replication in 2-node Cassandra cluster
I 运行 2 节点 Cassandra 集群上的 KairosDB,RF = 2,写入 CL = 1,读取 CL = 1。如果 2 个节点处于活动状态,则客户端将一半数据发送到节点 1(例如从 METRIC_1 到 METRIC_5000 的指标)和另一半数据到节点 2(例如从 METRIC_5001 到 METRIC_10000 的指标)。理想情况下,每个节点始终拥有所有数据的副本。但是如果一个节点死了,客户端将所有数据发送给活着的节点。
客户端开始向集群发送数据。 30 分钟后,我将节点 2 关闭 10 分钟。在这 10 分钟的时间里,client 将所有数据正常发送到节点 1。之后,我重新启动节点 2,客户端继续正确地向 2 个节点发送数据。一小时后我停止了客户端。
我想检查当节点 2 死机时发送到节点 1 的数据是否已自动复制到节点 2。为此,我关闭了节点 1,并在节点 2 从节点 2 死亡但未返回任何内容的时间内查询数据。这让我想到数据还没有从节点1复制到节点2。我发了一个问题。好像自动复制了数据,但是好慢
我期望两台服务器中的数据相同(出于冗余目的)。这意味着节点 2 死机时发送到系统的数据必须在节点 2 可用后自动从节点 1 复制到节点 2(因为 RF = 2)。
我这里有几个问题:
1) 复制真的很慢吗?还是我配置有误?
2)如果客户端像这个问题一样向每个节点发送一半数据,我认为可能会丢失数据(例如,节点 1 从客户端接收数据,而节点 1 正在将数据复制到节点 2,它突然关闭) .我说得对吗?
3) 如果我在 2) 中是正确的,我将这样做:客户端将所有数据发送到两个节点。这可以解决 2),并且如果一个节点已死并且稍后可用,则还可以利用复制。但我想知道,这会导致数据重复,因为两个节点都接收到相同的数据。这里有什么问题吗?
谢谢!
你能检查 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确保数据一致。
根据你的描述,我感觉你对协调器节点和获取数据的节点感到困惑(即使这两个节点都保存数据,区别也很重要)。
顺便说一句,您描述的节点 1 和节点 2 之间的指标分片的客户端行为是什么? KairosDB 和 Cassandra 都不是这样工作的,是您自己的客户端向不同的 KairosDB 实例发送指标吗?
Cassandra分区不是基于metric名称而是基于行键(分区键完全一样,但与kairosDB相同)。因此,每个唯一系列的每 3 周数据将关联一个基于哈希码的令牌,该令牌将用于集群上的 sharding/replication。
KairosDB 能够与多个节点通信,并在协调节点之间循环。
希望对您有所帮助。
I 运行 2 节点 Cassandra 集群上的 KairosDB,RF = 2,写入 CL = 1,读取 CL = 1。如果 2 个节点处于活动状态,则客户端将一半数据发送到节点 1(例如从 METRIC_1 到 METRIC_5000 的指标)和另一半数据到节点 2(例如从 METRIC_5001 到 METRIC_10000 的指标)。理想情况下,每个节点始终拥有所有数据的副本。但是如果一个节点死了,客户端将所有数据发送给活着的节点。
客户端开始向集群发送数据。 30 分钟后,我将节点 2 关闭 10 分钟。在这 10 分钟的时间里,client 将所有数据正常发送到节点 1。之后,我重新启动节点 2,客户端继续正确地向 2 个节点发送数据。一小时后我停止了客户端。
我想检查当节点 2 死机时发送到节点 1 的数据是否已自动复制到节点 2。为此,我关闭了节点 1,并在节点 2 从节点 2 死亡但未返回任何内容的时间内查询数据。这让我想到数据还没有从节点1复制到节点2。我发了一个问题
我期望两台服务器中的数据相同(出于冗余目的)。这意味着节点 2 死机时发送到系统的数据必须在节点 2 可用后自动从节点 1 复制到节点 2(因为 RF = 2)。
我这里有几个问题:
1) 复制真的很慢吗?还是我配置有误?
2)如果客户端像这个问题一样向每个节点发送一半数据,我认为可能会丢失数据(例如,节点 1 从客户端接收数据,而节点 1 正在将数据复制到节点 2,它突然关闭) .我说得对吗?
3) 如果我在 2) 中是正确的,我将这样做:客户端将所有数据发送到两个节点。这可以解决 2),并且如果一个节点已死并且稍后可用,则还可以利用复制。但我想知道,这会导致数据重复,因为两个节点都接收到相同的数据。这里有什么问题吗?
谢谢!
你能检查 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确保数据一致。
根据你的描述,我感觉你对协调器节点和获取数据的节点感到困惑(即使这两个节点都保存数据,区别也很重要)。
顺便说一句,您描述的节点 1 和节点 2 之间的指标分片的客户端行为是什么? KairosDB 和 Cassandra 都不是这样工作的,是您自己的客户端向不同的 KairosDB 实例发送指标吗?
Cassandra分区不是基于metric名称而是基于行键(分区键完全一样,但与kairosDB相同)。因此,每个唯一系列的每 3 周数据将关联一个基于哈希码的令牌,该令牌将用于集群上的 sharding/replication。 KairosDB 能够与多个节点通信,并在协调节点之间循环。
希望对您有所帮助。