在重新平衡Cassandra集群的同时增加已用空间

时间:2013-04-24 23:40:13

标签: cassandra

只是一个例子:我有2个Cassandra节点,每个节点1Gb数据,复制因子为1.我使用具有100Mb sstable大小的Leveled压缩的单列族,如下所示:

create column family ColFamily with key_validation_class=UTF8Type 
  and compaction_strategy=LeveledCompactionStrategy 
  and compaction_strategy_options={sstable_size_in_mb: 100};

我想添加其他节点。数据将在3个节点之间重新平衡:每个节点约为0,667 Mb。正确?

但是在重新平衡过程正在进行的过程中,如何在每个节点上增加使用的空间?什么是最高峰?

2 个答案:

答案 0 :(得分:3)

在Cassandra 1.2和虚拟节点之前,您必须在添加新节点后自行重新分配数据。

如果你的两个节点目前是平衡的,即每个节点有50%,那么令牌将是

node1: 0
node2: 85070591730234615865843651857942052864

(或移位,但我假设node1有令牌0)。 node2的令牌是2 ^ 127/2。你想最终得到

node1: 0
node2: 56713727820156410577229101238628035242
node3: 113427455640312821154458202477256070484

其中node2的令牌是2 ^ 127/3,而node3的令牌是(2 ^ 127/3)* 2。你需要做的是bootstrap node3,并将initial_token设置为上面的标记。这会复制来自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数据,大约为667 MB。现在,您可以在node2上运行“nodetool cleanup”,以删除刚刚复制到node3的数据。现在重新平衡已经完成。

这意味着在重新平衡期间,任何节点都不会存储超过1 GB的数据。

通常,如果您有更多节点或更高的复制因子,如果在刚移动的节点上每次移动后运行清理,则可以始终执行重新平衡而不增加存储在任何现有节点上的数据。

最后,如果您有Cassandra 1.2和虚拟节点,则可以随机选择令牌,只要添加新节点就可以提供均匀负载,而无需任何重新平衡(手动或自动)。这不仅更容易,而且可以节省在群集周围复制数据的一小部分,只是为了添加一个节点。

答案 1 :(得分:2)

没有用于添加新节点的额外空间。但是,您必须在令牌范围缩小的节点上运行清理以从移动中恢复空间,但您可能希望首先重新平衡环(令牌移动)以获得均匀分布。

这个过程在Datastax网站上的Cassandra文档中有很好的记录,给出了一个比我能给出的更好,更简洁的解释。

除此之外,还有一些评论:

  • 100MB的水平似乎有点高。事实上,只有1GB的数据几乎可以肯定。你有充分的理由偏离(通常是非常充足的)违约吗?
  • 小于3的RF几乎不是您想要的。
  • 正如理查德所说,你应该看看vnodes。它们还不是默认值,但只要你运行cassandra 1.2.x,它们就值得尝试。