【问题标题】:Cassandra: what node will data be written if the needed node is down?Cassandra:如果需要的节点宕机了,数据会写入哪个节点?
【发布时间】:2020-01-03 00:43:21
【问题描述】:

假设我有一个 Cassandra 集群,它有 3 个节点(节点 0、节点 1 和节点 2),复制因子为 1。 假设我要向集群插入新数据,并且分区键将新行定向到节点 1。但是,节点 1 暂时不可用。这种情况下,新数据是插入到节点0还是节点2(虽然按照分区键不应该放在那里)?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    在 Cassandra 中,复制因子 (RF) 确定最终将存在多少数据副本,并在密钥空间层进行设置/配置。同样,它的目的是定义如果事情“正常”运行,应该存在多少个节点/副本。他们可以通过多种方式接收数据:

    1. 在写入过程中 - 假设一切都“正常”运行并且一切都可用
    2. 使用提示切换 - 如果一个/一些节点在配置的时间量(
    3. 使用手动修复 - “nodetool repair”,或者如果您使用 DSE,ops center 可以修复/协调表、键空间或整个集群的数据(nodesync 也是 DSE 的新工具,类似于修复)
    4. 在读取修复期间 - 根据可配置的客户端一致性级别(如下所述),读取操作可以比较来自多个节点的数据以确保准确性/一致性,如果不正确,则进行修复。

    可配置的客户端一致性级别 (CL) 将确定有多少节点必须确认它们已成功接收数据才能满足客户端继续(对于写入)的要求 - 或者在数据接收时与多少节点进行比较读取以确保准确性(用于读取)。可用节点的数量必须等于或大于指定的客户端 CL 数量,否则应用程序将出错(例如,如果节点的 QUORUM 数量不可用,它将无法比较节点的 QUORUM 级别)。此设置不规定有多少节点将接收数据。同样,这是 RF 键空间设置。这将永远成立。我们在这里指定的是,为了让客户在那一刻感到高兴,必须确认每次写入或比较每次读取的次数。希望这是有道理的。

    现在...

    在您的 RF=1 的场景中,应用程序将在写入时收到错误,因为应该接收数据的单个节点(基于哈希算法)已关闭(RF=1 再次意味着只有一个副本的数据将存在,并且该单个副本由哈希算法确定为不可用节点)。这有意义吗?

    如果您有一个 RF=2(2 个数据副本),那么其他两个节点中的一个将接收数据(同样,哈希算法选择“基础”节点,然后另一个算法将选择 cop 的位置(ies) go),当不可用节点变得可用时,它最终会接收数据(通过提示切换或修复)。如果您选择 RF=3(3 个副本),那么其他 2 个节点将获取数据,并且再次,一旦不可用节点变得可用,它最终将接收数据(通过提示切换或修复)。

    仅供参考,如果您想知道 Cassandra 集群中将/确实存在某条数据的位置,您可以运行“nodetool getendpoints”。输出将是所有副本将/确实驻留的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2017-09-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多