Cassandra 中的高可用性

Har*_*rry 1 java high-availability cassandra cassandra-3.0

1) 我有5 个节点集群 (172.30.56.60, 172.30.56.61, 172.30.56.62, 172.30.56.63, 172.30.56.129)

2)我创建了一个密钥空间,复制因子为 3
写入一致性为 3,我在表中插入了一行,分区为“1”,如下所示,

INSERT INTO user (user_id, user_name, user_phone) VALUES(1,'ram', 9003934069);

3) 我使用 nodetool getendpoints 实用程序验证了数据的位置,并观察到数据被复制到三个节点 60、129 和 62。

./nodetool getendpoints keyspacetest user 1
172.30.56.60
172.30.36.129
172.30.56.62
Run Code Online (Sandbox Code Playgroud)

4) 现在如果我关闭节点 60,Cassandra 需要将现有数据传输到'1,'ram', 9003934069'剩余节点(到 61 或 63)以将 RF 保持为“3”?

但是 Cassandra 没有这样做,所以这是否意味着如果节点 60、129 和 62 关闭,我将无法读取/写入表 'user' 中分区 '1' 下的任何数据?

问题1:所以即使我有5个节点的集群,如果它所在的数据/分区出现故障,集群就没有用了吗?

问题 2:如果两个节点关闭(例如:60 和 129 关闭)仍然 61,62 和 63 启动并运行,但我无法在写入一致性 = 3 的分区“1”中写入任何数据,为什么会这样?因为我能够以写入一致性 = 1 写入数据,所以这再次说明分区的数据仅在集群中的预定义节点中可用,无法重新分区?

如果我的问题的任何部分不清楚,请告诉我,我想澄清一下。

Man*_*nke 5

4) 现在如果我关闭节点 60,Cassandra 需要将现有数据传输到 '1,'ram', 9003934069' 到剩余节点(到 61 或 63)以保持 RF 为 '3'?

这不是 Cassandra 的工作方式 - 复制因子“仅”声明要在不同节点的磁盘上存储 Cassandra 的数据副本的数量。Cassandra 在数学上从你的节点中形成一个环。每个节点负责一系列所谓的令牌(它们基本上是分区键组件的散列)。您的复制因子为 3 意味着数据将存储在节点上,负责处理您的数据令牌和环中的下两个节点。

(快速谷歌搜索图像https://image.slidesharecdn.com/cassandratraining-161104131405/95/cassandra-training-19-638.jpg?cb=1478265472

更改环形拓扑非常复杂,而且根本不是自动完成的。

1) 我有 5 个节点集群 (172.30.56.60, 172.30.56.61, 172.30.56.62, 172.30.56.63, 172.30.56.129)

2)我创建了一个密钥空间,复制因子为 3,写入一致性为 3,我在表中插入了一行,分区为“1”,如下所示,

INSERT INTO user (user_id, user_name, user_phone) VALUES(1,'ram', 9003934069);

3) 我使用 nodetool getendpoints 实用程序验证了数据的位置,并观察到数据被复制到三个节点 60、129 和 62。

./nodetool getendpoints keyspacetest user 1 172.30.56.60 172.30.36.129 172.30.56.62 4) 现在如果我关闭节点 60,Cassandra 需要将现有数据传输到 '1,'ram', 9009'to the剩余节点 6 61 或 63) 将 RF 保持为“3”?

但是 Cassandra 没有这样做,所以这是否意味着如果节点 60、129 和 62 关闭,我将无法读取/写入表 'user' 中分区 '1' 下的任何数据?

问题1:所以即使我有5个节点的集群,如果它所在的数据/分区出现故障,集群就没有用了吗?

否。另一方面,存在一致性级别 - 您可以在其中定义在认为成功之前必须确认您的写入和读取请求的节点数。上面你还取了 CL=3 和 RF=3 - 这意味着所有持有副本的节点都必须响应并且需要在线。如果有一个发生故障,您的请求将一直失败(如果您的集群更大,比如 6 个节点,那么在线的三个节点可能是某些写入的“正确”节点)。

但是 Cassandra 具有可调整的一致性(请参阅http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html 上的文档)。

例如,您可以选择 QUORUM。那么查询需要 (replication factor/2)+1 个节点。在您的情况下 (3/2)+1=1+1=2 个节点。如果您确实需要一致的数据,则 QUORUM 是完美的,因为在任何情况下,至少有一个参与您的请求的节点将在写入和读取之间重叠并拥有最新数据。现在,一个节点可能会宕机,但一切仍然正常。

但:

问题 2:如果两个节点关闭(例如:60 和 129 关闭)仍然 61,62 和 63 启动并运行,但我无法在写入一致性 = 3 的分区“1”中写入任何数据,为什么会这样?因为我能够以写入一致性 = 1 写入数据,所以这再次说明分区的数据仅在集群中的预定义节点中可用,无法重新分区?

看上面 - 这就是解释。CL=1 表示写一致性会成功,因为一个节点仍然在线并且你只请求一个节点来确认你的写。

当然,复制因子也不是没有用。即使选择了较低的一致性级别,写入也会复制到所有可用节点,但您不必在客户端等待它。如果一个节点关闭了一段时间(默认为 3 小时),协调器将存储丢失的写入并在节点再次出现并且您的数据再次完全复制时重放它们。

如果节点停机时间较长,则需要运行nodetool repair并让集群重建一致的状态。无论如何,这应该作为维护任务定期完成,以保持集群健康 - 由于网络/负载问题可能会错过写入,并且删除可能会很痛苦。

您可以在集群中删除或添加节点(如果这样做,只需一次添加一个),Cassandra 将为您重新分配环。

如果删除在线节点可以将其上的数据流式传输到其他节点,则可以删除离线节点但其上的数据将没有足够的副本,因此nodetool repair必须运行。

添加节点将为新节点分配新的令牌范围,并自动将数据流式传输到新节点。但是不会为您删除源节点的现有数据(保证您的安全),因此添加节点后nodetool cleanup是您的朋友。

Cassandra 从 CAP 定理中选择 A(可用)和 P(分区容忍)。(参见https://en.wikipedia.org/wiki/CAP_theorem)。所以你不可能在任何时候都保持一致性——但 QUORUM 通常绰绰有余。

保持您的节点受到监控并且不要太害怕节点故障 - 它只是在磁盘死机或网络丢失的所有时间发生,但请为此设计您的应用程序。

更新:在丢失数据或查询之前,用户可以选择集群可能发生的情况。如果需要,您可以使用更高的复制因子(RF=7 并且 CL.QUROUM 容忍损失为 3)和/或什至在不同位置使用多个数据中心,以防丢失整个数据中心(这在现实生活中发生,想想网络丢失)。


对于以下关于https://www.ecyrd.com/cassandracalculator/的评论:

集群大小 3 复制因子 2 写级别 2
读级别 1

您的读取是一致的:当然,您请求的写入需要被所有副本确认。

您可以在不影响应用程序的情况下避免丢失任何节点:见上文,RF=2 和 WC=2 请求在任何时候所有节点都需要响应写入。因此,对于写入,您的应用程序将受到影响,对于读取,一个节点可能会关闭。

您可以在丢失 1 个节点而不会丢失数据的情况下幸存下来:因为数据被写入 2 个副本,并且您只能在一个节点关闭时从其中一个节点读取,您仍然可以从另一个节点读取。

您实际上每次都从 1 个节点读取:RC=1 请求您的读取由一个副本提供服务-因此,确认读取的第一个节点将执行该操作,如果一个节点关闭则无关紧要,因为另一个节点可以确认你的阅读。

您每次实际上都在写入 2 个节点:WC=2 请求每次写入都将被两个副本确认 - 这也是您示例中的副本数。所以写入数据时所有节点都需要在线。

每个节点都拥有 67% 的数据:只是一些数学运算;)

使用这些设置,您无法在写入集群时在节点丢失的情况下幸免于难。但是您的数据被写入磁盘的两个副本 - 因此,如果您丢失了一个副本,您仍然可以在另一个副本上保留数据并从死节点中恢复。