【问题标题】:Cassandra not working when one of the nodes is down当其中一个节点关闭时,Cassandra 无法工作
【发布时间】:2020-01-20 19:03:19
【问题描述】:

我有一个由两个 cassandra 节点组成的开发 cassandra 集群 [我们称它们为 NodeA 和 NodeB]。我还有一个在 NodeA 上不断发送数据的脚本。我已经使用以下参数创建了数据库:

CREATE KEYSPACE test_database WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

现在,由于某种原因,NodeB 在一段时间后停止了。但问题是,一旦 NodeB 停止,正在向 NodeA 发送数据的脚本就会开始出现数据插入错误。

谁能指出一个可能的原因。

更新:两个节点都是种子节点。

【问题讨论】:

  • 因为你有1个复制因子,所以cassandra只能将数据写入存储它的节点。
  • 如果你有,说复制因子 = 2,cassandra 将在节点 A 上写入,当节点 b 重新启动时,节点 A 将发送节点 B 在宕机时丢失的所有数据。
  • 您想了解一些关于 cassandra 中的复制因子、令牌和数据重新分区的说明,还是您理解?
  • 我还有疑问。由于复制因子为 1,因此数据仅存储在 NodeA 上。所以,我的疑问是 - 如果 NodeB 停止工作,为什么 NodeA 在尝试写入数据时会出错?它不应该关心NodeB在哪里,对吧? bdw,两个节点都是种子节点。这和这里的情况有关系吗?
  • 发布了答案,如果您需要更多详细信息,请在其下方评论

标签: cassandra


【解决方案1】:

Cassandra 如何处理数据重新分区

cassandra 中的每个键都可以转换为一个token。安装集群时,节点会计算它们将接受的令牌范围。
举个简单的例子:

您有两个节点和一个从 0 到 9 的令牌。简单的重新分区是:节点 A 存储 0-4 之间的每个令牌,节点 B 存储 5-9 之间的每个令牌。

Cassandra 如何进行写入

您选择一个接收数据的协调员(在您的情况下为节点 A)。然后该节点将计算一个token。如第一个示例所示,每个节点都有一个分配给它的令牌范围。所以假设密钥被转换为令牌 4,然后数据进入节点 A(这里是协调器)。如果token为8,则将数据发送到节点B。

什么是 cassandra 数据复制因子

复制因子是您的数据将存储在集群上的时间。对于没有机架的单个数据库(您的情况),数据首先发送到拥有与密钥关联的令牌的节点,然后将副本发送到拓扑中的下一个节点。
如果一个节点发生故障,副本将帮助该节点恢复其数据。
在您的情况下,没有副本,如果节点关闭,Cassandra 无法存储数据并引发错误。如果您的复制因子为 2,Cassandra 应该能够在节点 A 上存储副本并且不会失败。

【讨论】:

  • 好的,我明白了。因此,这意味着我尝试插入的某些数据点将成功,而其他数据点可能会失败 - 取决于协调器将数据路由到何处。对吗?
  • 是的。但是 cassandra 的重点是 disponibility,所以你应该尝试使用至少 3 个节点和复制因子 >1
  • 是的,我明白了。谢谢:)
【解决方案2】:

Cassandra 的复制因子: 假设我们将“n”作为复制因子,这意味着给定的输入数据将从“n”个节点存储/检索。 吨 如果您提到复制因子为“1”,这意味着只有一个节点将拥有数据。

分区: 假设我们有 2 个节点,每当您插入数据时。根据提到的分区算法,这两个节点都会有一些数据。 例如: 您正在插入 10 条记录,根据散列和分区算法,它选择需要为每条记录写入哪个节点。当然节点的识别是由 Coordinator 完成的 :)

持久写入: 默认情况下,cassandra 总是在刷新到磁盘之前写入提交日志。如果设置为 false,它将绕过提交日志并直接写入磁盘(SSTable)。

您提到的问题,例如假设您要插入 10 行。 为简单起见,我们可以将分区/哈希计算设为 n/2。

因此,Cassandra 的协调器节点将您的数据分成两部分(对于简单的计算,它将是 10/2)并尝试将第一半放入第一个节点并成功并尝试将第二半放入第二个节点(写入提交日志),因为它不可用,所以会抛出错误。

【讨论】:

    【解决方案3】:

    那么我们该如何解决这个问题呢?假设我想在集群中的 1 个节点关闭时批量插入多个插入查询?它还给我 由于主机不可用,与连接 cs1 关联的 Cassandra 集群的连接不可用。主机地址:cassandra1

    【讨论】:

    • 当我尝试在 cassandra 节点上进行批量插入时,一个节点已关闭时,我看到了“NoHostAvailable:”。
    【解决方案4】:

    如果您的表不是计数器表,您可以使用 ANY 的一致性级别,这为写入提供了高可用性。 参考这里了解更多信息 => https://www.datastax.com/blog/2011/05/understanding-hinted-handoff-cassandra-08

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 2021-08-25
      • 2018-06-17
      • 2015-09-04
      • 2013-06-09
      • 2016-05-21
      • 2012-11-29
      • 2018-07-19
      相关资源
      最近更新 更多