用新节点替换cassandra集群中的现有节点

问题描述:

我面临Cassandra的磁盘空间问题。其中一个密钥空间占用了将近25GB的空间。由于这张表包含了大量的数据,我开始清理桌面并从1亿条记录中清除了9800万条记录。尽管数据清理,仍然cassandra正在占用25 GB的空间。用新节点替换cassandra集群中的现有节点

要只对剩余的2万条记录,确保卡桑德拉占用的磁盘空间,我想实现下面的方法(我有5个卡桑德拉节点的集群,为所有keyspaces设置3复制因子):

  1. 将第6个节点添加到现有集群并关闭现有节点的1(假设第一个节点)(这里我预计从第1个节点的数据将被复制到新添加的节点,因为复制因子设置为3,并且此副本中的一个具有已经下降)
  2. 经过一段时间(考虑到复制数据到新的cassandra节点需要一些时间),重复上述步骤为接下来的4个新节点(所以我的集群将c从Cassandra节点中复制新的Cassandra 5节点)

这是正确的方法来解决我的问题吗?如果这不起作用或不是一个好的解决方案,我想了解其中的原因和任何其他安全的替代方法。

注:我用的卡珊德拉2.1.14

+0

您是否尝试运行nodetool compact? – DineMartine

+0

不,我没有。它有帮助吗? 我读过的地方不应该手动运行“nodetool compact”。 – Shailesh

您没有提供足够的信息来真正了解发生了什么事情,但是有些事情要考虑...

  • 为了为了在失败时提供最终的一致性,Cassandra不能立即删除数据。它必须先写入NEW数据,称为墓碑,然后等待gc_grace_seconds,然后才允许在下一次压缩中清除墓碑。你还没有谈到做什么,是通过gc_grace_seconds对墓碑的影响来推理。如果您的墓碑不够大以至于无法清除,那么在gc_grace_seconds过去之前(或者您在此维护过程中暂时降低gc_grace_seconds,但在某些情况下,如果遇到此问题,则会出现意外复活数据的风险,所以节点更换和压缩都不会对您有所帮助在维护期间节点中断)。
  • 如果您已经完成了gc_grace_seconds vs tombstone age,手动压缩将恢复您的磁盘空间。如果你使用的是大小一致的压缩,它也会将你的所有数据压缩到一个单独的sstable中,然后在很长一段时间内再次压缩......导致更多的空间恢复问题。你更新/删除你的数据。
  • 切换到水平压实可以帮助解决空间恢复问题。它使用更小的sstables,并保证不超过一定比例的空间将被旧更新或可回收墓碑占用。尽管如此,如果在写入容量方面运行群集“热”,则级别压缩对您的磁盘的要求更高,但交换机可能会影响性能。
  • 我认为节点替换也是回收磁盘的一种可行的策略,但我不记得流式传输的所有细节以确定它是否会将陈旧的逻辑删除或将它们压缩为第一个......我认为它首先压缩。不过,您可能需要首先在测试平台上进行验证。