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