如何将节点添加到以前删除的Cassandra集群?

时间:2018-04-19 17:50:04

标签: cassandra

我们一直在向Cassandra集群添加节点时遇到麻烦,我的团队想知道是否有人能发现我们可能做错的任何事情,或者分享他们的最佳实践。这些节点以前是集群的成员,但已被删除,现在我们正在尝试再次添加它们。节点似乎已被适当删除:nodetool removenode成功完成,现有节点上的nodetool状态仅显示预期节点,而没有新节点。在尝试再次添加节点之前,群集可以使用一到两周。

在再次将这些节点添加到群集之前,所有数据目录都被清除干净。然后我们添加了第一个带有autobootstrap的新节点,它似乎很好地加入了集群,从加入状态移动到正常状态。到目前为止一直这么好......“描述集群”似乎表明一切都是一致的,我们即将对现有节点进行清理,然后在添加更多节点之前进行修复。

然而事情开始出错了。不知何故,这个新节点似乎知道其他先前删除的节点,显示它们已关闭且无法访问(这是真的,但现在关于它们是怎么做的?)。对新节点的读取请求经常失败,主要是因为找不到数据。为了避免灾难,新节点被淘汰并最终被暗杀。我的集群(和应用程序)再次感到高兴。

我们可能错过了添加(或删除节点)的前后步骤吗?我已经遵循了关于添加和删除Cassandra节点的许多其他问题的建议。在尝试再次将其添加为节点之前,我是否应该在机器上执行完整的osreload?

我很感谢你的建议。同样,这里的许多其他问题对我有很大帮助,但并不是这个特殊情况。

2 个答案:

答案 0 :(得分:0)

我相信要调试此问题,请执行以下检查清单:

  • 您需要确保清除提交日志,因为重新启动节点时,它可能已重播了提交日志。

问题:

  

不知怎的,这个新节点之前似乎已经了解了另一个节点   删除节点,将它们显示为已关闭且无法访问(这是真的,   但现在关于他们的怎么样?)

  • 确保cassandra.yaml配置不旧,描述的问题是因为它知道上一个节点意味着Yaml未使用群集的当前节点列表进行更新。

答案 1 :(得分:0)

经过一番争吵后,我的团队终于成功地将新节点添加到我们的Cassandra集群中。我想分享我们在这里学到的东西(而不是让人们挂起)。

最大的问题是system_auth表上的复制因子。添加新节点后,我们的申请客户端请求(可能是连接到新节点的请求)将失败,并显示'User userid1 has no SELECT permission on <table xyz.data> or any of its parents'之类的错误。答案是将我们的用户和角色专门插入新节点的system_auth表中,使用复制器因子增加到覆盖所有节点。在添加新节点时,Cassandra不会立即复制system_auth表,这似乎很奇怪。

所以......要添加一个先前已添加和删除的节点,我们就是这样做的:

  1. 确保此节点之前已使用nodetool drain nodetool decommissionnodetool assassinate正确停用。
  2. 修复群集
  3. 在要添加的节点上执行干净的os install / os reload
  4. 在群集中的每个节点上运行nodetool statusnodetool describecluster以确保结果一致
  5. 添加节点(确保自动提取)
  6. 修复system_auth表
  7. 使用复制器因子手动将我们的用户/角色插入新节点上的system_auth表中,该复制器因素涵盖所有节点,包括新的节点
  8. 在现有节点上运行nodetool cleanup
  9. 修复整个群集(仅用于衡量标准)
  10. 我们的部署代码也存在一些自身问题,这导致我们的节点无法与其他节点闲聊。它涉及访问TLS信任库的问题,因为我们加密每个节点之间的流量。显然,如果节点无法通信,那就非常糟糕。

    感谢所有提供帮助的人,我希望我们的经验能够帮助他人。