1

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

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。正确的?

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

4

2 回答 2

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。您需要做的是引导 node3 并将 initial_token 设置为上面的令牌。这会从 node1 复制数据,因为 node3 的令牌在 node1 之前(令牌环被环绕)。

现在 node3 将拥有 1/6 的数据,node2 仍然拥有 1/2,node1 将存储 1/2 但只负责 1/3。您现在可以在 node1 上运行“nodetool cleanup”以删除它复制到 node3 的数据。这会将 node1 的数据减少到大约 677MB。

现在您需要将 node2 的令牌移动到其最终位置。这会将数据从节点 2 复制到节点 3,使节点 3 达到其数据的 1/3 配额,大约 667 MB。现在您可以在 node2 上运行“nodetool cleanup”来删除它刚刚复制到 node3 的数据。现在重新平衡已经完成。

这意味着在重新平衡期间没有节点存储超过 1 GB 的数据。

一般来说,如果您有更多的节点或更高的复制因子,如果您在每次移动刚移动的节点后运行清理,您总是可以在不增加存储在任何现有节点上的数据的情况下进行重新平衡。

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

于 2013-04-26T10:20:36.857 回答
2

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

这个过程在 Datastax 网站上的 Cassandra 文档中有很好的记录,请阅读它以获得比我能给出的更好和更简洁的解释。

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

  • 100MB的水平似乎有点高。事实上,几乎可以肯定只有 1GB 的数据。您是否有充分的理由偏离(通常非常充分的)默认值?
  • RF 小于 3 几乎不是您在生产中想要的。
  • 正如理查德所说,你应该看看 vnodes。它们还不是默认设置,但只要您运行的是 cassandra 1.2.x,它们就值得一试。
于 2013-05-01T17:21:08.790 回答