只是一个例子:我有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。正确?
但是在重新平衡过程正在进行的过程中,如何在每个节点上增加使用的空间?什么是最高峰?
答案 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文档中有很好的记录,给出了一个比我能给出的更好,更简洁的解释。
除此之外,还有一些评论: