在Cassandra 1.2.8中启用vNode

时间:2013-09-30 08:05:56

标签: apache cassandra nodetool

我有一个4节点集群,我已将旧版本的所有节点升级到Cassandra 1.2.8。群集中存在的总数据大小为8 GB。现在我需要在集群的所有4个节点上启用vNode,而不会出现任何停机。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

TL; DR;

配置编辑完成后,

need to restart servers

问题在于启用vnodes意味着大量数据是随机重新分配的(文档说明类似于经典的'nodetool move'

答案 1 :(得分:1)

conf/cassandra.yaml中,您需要注释initial_token参数,并启用num_tokens参数(默认为256我相信)。为每个节点执行此操作。然后,您必须在每个节点上重新启动cassandra服务。等待数据在整个集群中重新分配。 8 GB不应占用太多时间(假设您的节点都在同一个集群中),并且读取请求仍然可以正常运行,但在重新分发数据完成之前,您可能会看到性能下降。

编辑:以下是迁移数据的潜在策略:

  • 停用群集的两个节点。令牌空间应该在其他两个节点之间分配50-50。
  • 在两个已停用的节点上,删除现有数据,然后使用不同的群集名称并启用num_token参数重新启动Cassandra守护程序。
  • 将8 GB数据从旧群集迁移到新群集。您可以在python中编写一个快速脚本来实现此目的。由于数据量足够小,这不应该花费太多时间。
  • 在新群集中迁移数据后,从旧群集中停用两个旧节点。使用新群集名称num_tokens参数删除数据并重新启动Cassandra。它们将进行引导,数据将从新集群中的两个现有节点进行流式处理。优选地,一次仅引导一个节点。

通过这些步骤,您永远不会遇到服务完全停机的情况。您将在一段时间内以较低的容量运行,但是由于8GB不是大量数据,因此您可以很快地实现这一点。

答案 2 :(得分:1)

正如Nikhil所说,你需要增加num_tokens并重启每个节点。这可以一次完成,没有停机时间。

但是,增加num_tokens不会导致任何数据重新分发,因此您实际上并未使用vnode。您必须通过shuffle手动重新分发它(在Lyuben发布的链接中解释,这通常会导致问题),通过停用每个节点并自动引导(这将暂时使您的群集与拥有所有数据的一个节点非常不平衡),或者通过像创建新数据中心一样临时复制硬件。后者是我所知道的唯一可靠的方法,但它确实需要额外的硬件。