举个例子:我有2个cassandra节点,每个节点有1gb的数据,复制因子是1。我使用单列族,它具有100mb表大小的水平压缩,如下所示:
create column family ColFamily with key_validation_class=UTF8Type
and compaction_strategy=LeveledCompactionStrategy
and compaction_strategy_options={sstable_size_in_mb: 100};
我想添加其他节点。数据将跨3个节点重新平衡:每个节点约0667 mb。正确的?
但是在重新平衡的过程中,如何增加每个节点上的已用空间呢?最高峰是什么?
2条答案
按热度按时间omtl5h9j1#
在cassandra1.2和虚拟节点之前,您必须在添加新节点之后自己重新分配数据。
如果您的两个节点当前是平衡的,即每个节点有50%的环,那么令牌将是
(或移位,但我假设node1有标记0)。node2的令牌是2^127/2。你想以
其中node2的令牌是2^127/3,node3的令牌是(2^127/3)*2。您需要做的是引导node3,将初始的\u令牌设置为上面的令牌。这将从node1复制数据,因为node3的令牌在node1的之前(令牌环被环绕)。
现在node3将拥有1/6的数据,node2将仍然拥有1/2,node1将存储1/2但只负责1/3。现在可以对node1运行“nodetool cleanup”来删除它复制到node3的数据。这将使node1的数据减少到大约677mb。
现在您需要将node2的令牌移动到其最终位置。这将数据从node2复制到node3,使node3达到其1/3的数据配额,约667mb。现在可以在node2上运行'nodetool cleanup',删除它刚刚复制到node3的数据。现在再平衡已经完成。
这意味着在重新平衡期间,任何节点存储的数据都不会超过1GB。
通常,如果您有更多的节点或更高的复制因子,如果您在刚刚移动的节点上的每次移动之后运行cleanup,则始终可以在不增加任何现有节点上存储的数据的情况下执行重新平衡。
最后,如果您有cassandra1.2和虚拟节点,则可以随机选择令牌,这样在添加新节点时就可以提供均匀的负载,而不需要任何重新平衡(手动或自动)。这不仅更简单,而且可以节省在集群中复制一部分固定的数据,只需添加一个节点。
tgabmvqs2#
没有用于添加新节点的额外空间。但是,您必须对令牌范围已缩小的节点运行清理以从移动中恢复空间,但您可能希望首先重新平衡环(令牌移动)以获得均匀分布。
这个过程在datastax网站上的cassandra文档中有很好的记录,请阅读,以获得比我能给出的更好、更简洁的解释。
除此之外,还有一些评论:
100mb的内存似乎有点高。事实上,只有1gb的数据几乎可以肯定。您是否有充分的理由偏离(通常非常充分的)违约?
射频小于3是几乎从来没有你想要的生产。
正如理查德提到的,你应该看看vnodes。它们还不是默认的,但只要您运行的是Cassandra1.2.x,它们就非常值得尝试。