java - Cassandra (Cassandra)的高可用性

标签 java cassandra cassandra-3.0 high-availability

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_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', 9003934069'到其余节点(传输到61或63),以将RF保持为“ 3”?

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

问题1:所以,即使我有5个节点群集,如果它驻留的数据/分区丢失了,该群集也没用吗?

问题2:如果两个节点都关闭了(例如:60和129都关闭了),仍然有61,62和63处于运行状态,但是我无法在写入一致性= 3的分区'1'中写入任何数据,为什么会这样呢?当我能够以写入一致性= 1写入数据的地方时,再次说明分区的数据将仅在集群中的预定义节点中可用,无法重新分区吗?

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

最佳答案

4)现在,如果我降低节点60,Cassandra需要转移
  现有数据到剩余节点的'1,'ram',9003934069'
  61或63)将RF保持为“ 3”?


这不是Cassandra的工作方式-复制因子“ only”声明要在磁盘上不同节点上的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_id,user_name,user_phone)VALUES(1,'ram',9003934069);

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

./nodetool getendpoints keyspacetest用户1
172.30.56.60
172.30.36.129
172.30.56.62
4)现在,如果我关闭节点60,Cassandra是否需要将现有数据传输到“ 1”,“ ram”,9003934069'到其余节点(传输到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为例。然后,需要(复制因子/ 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%:只是一些数学;)

使用这些设置,在写入群集时,如果没有节点丢失,将无法幸免。但是,您的数据将被写入两个副本上的磁盘-因此,如果丢失一个副本,您的数据仍将保留在另一个副本上,并从失效的节点中恢复。

关于java - Cassandra (Cassandra)的高可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48056093/

相关文章:

java - 如何将字符串数组从 C++ 返回到 Java (JNI)

java - 打开 NLP 名称查找器输出

Cassandra 流式传输失败

cassandra - 客户端和服务器端超时设置的区别

Cassandra 通过网络执行命令

java - 在 Java 程序中通过 UDP 接收 C++ 字节流

java - 创建 Android 在线编译器需要什么?

cassandra - 标准列族与 super 列族

docker - 尝试在JanusGraph-Docker中创建图形时连接被拒绝

Cassandra Java 驱动程序错误 - 所有主机尝试查询失败连接已关闭