【问题标题】:Data missing from Cassandra after adding nodes to the cluster将节点添加到集群后,Cassandra 中的数据丢失
【发布时间】:2020-09-22 06:42:13
【问题描述】:

我们有一个由 6 个节点组成的集群,其中复制为 3 个。 只需启动它们并让它们加入集群,然后重新启动所有节点以更新种子列表即可添加 4 个新节点。所以每个节点都更新了所有其他种子,并且复制因子仍然是 3。 Nodetool 状态显示所有节点为 UN(新节点快速进入 UN 状态),并且 describecluster 显示所有节点都加入了相同的模式。 Nodetool 状态还显示旧节点有很多数据而新节点很少,我猜只是新数据进来。 在更新期间,我们没有将 auto_bootstrap 参数添加到 cassandra.yaml,据我所知默认值为 true。 令牌范围被重新分配,因此每个节点拥有大约 10% 的范围。 对不起,但无法复制粘贴/截图。

添加节点后一切似乎都很好,然后我注意到 3 个列族中缺少一些数据。也许还有更多遗失,但目前无法发现。

最终目标是将所有数据从 6 个旧节点迁移到 4 个新节点并停用旧节点。

问题:

  1. 如果 auto_bootstrap 值为真,数据不应该从其他节点流式传输到新节点吗?节点在完成之前会处于 UJ 状态吗?我的新节点很快就进入了联合国,似乎没有向它们传输数据。

  2. 为什么我的数据丢失了?查询不应该找到带有数据的节点并从那里获取它吗?

  3. 最重要的是,如何取回数据?必须仍然在磁盘上的某个地方。我能找到的最接近的答案是:

您应该在添加后在新节点上执行 nodetool 重建 他们用 auto_bootstrap: false

但这适用于 auto_bootstrap 为 false 的情况。重建/修复会有帮助吗?

  1. 继续在 4 个新节点中获取所有数据并停用 6 个旧节点的最佳方法是什么? 我的计划是逐个停用旧节点,以这种方式分发数据。

Cassandra 版本:2.0.17 使用astyanax最新版本,以为是3.90

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

    以后,请尽量每个问题只问一个问题。

    新节点是否也在种子列表中?种子节点流数据,这就是为什么存在“不要让所有节点都成为种子节点”的建议的原因。

    查询不应该找到包含数据的节点并从那里获取它吗?

    查询将被定向到负责数据(令牌范围)的节点,不一定实际上可能拥有数据。

    如何取回数据?

    尝试在每个节点上运行nodetool repair。如果您在单独的逻辑数据中心中设置节点,则运行nodetool rebuild 实际上更快。

    是的,nodetool decommission 将重新调整令牌范围分配,并分发数据。但在此之前我会运行 repair 操作,因为您的原始节点可能是唯一缺少数据的节点。

    另一种选择是停用所有新节点,然后重新开始。然后重新添加它们,确保它们获得数据。如果没有,请在该节点上运行修复。然后添加下一个,冲洗,重复。

    Cassandra 版本:2.0.17 使用 astyanax 最新版本,以为是 3.90

    哎呀!那个版本的 Cassandra 已经 5 岁了,而 Astyanax 已经有 2 年没有 PR 了。在此期间,Cassandra 进行了许多改进和错误修复,因此我强烈建议升级并摆脱任何依赖 Thrift 的内容。

    【讨论】:

    • > 新节点是否也在种子列表中?我的意思是每个节点的所有种子都在 cassandra.yaml 文件中更新。申请只针对少数人。我会先尝试修复,如果它不起作用则停用。我知道 Cassandra 版本很古老,而 astyanax 已经过时,但我不是选择它的人,在那里无能为力。感谢您的帮助。
    • 我在每个节点上运行了 nodetool repair。我可以看到数据在 nodetool 状态中分布更均匀,但缺少数据并没有改善。我的计划是现在开始一个一个地退役旧节点。你会推荐下一个吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2014-11-15
    • 2020-09-13
    • 2021-12-09
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多