DynamicSnitch从空的新数据中心读取

时间:2013-11-14 15:14:44

标签: cassandra

添加新的数据中心时,dynamicSnitch会导致我们在数据不存在时从新的dc读取数据。

我们在3个数据中心运行了一个cassandra(1.0.11)集群,我们想要添加第四个数据中心。群集配置了PropertyFileSnitch和DynamicSnitch,启用0.0 badness factor。相关键空间复制因子为DC1:2,DC2:2,DC3:2。我们的计划是将新的数据中心添加到环中,将其添加到模式并在所有节点上运行滚动修复-pr,以便新节点将获得所需的所有数据。 一旦我们开始这个过程,我们就注意到新的数据中心收到了来自其他数据中心的读取调用,因为它的负载较低,而DynamicSnitch决定从中读取它会更好。问题是数据中心仍然没有数据并且没有返回任何结果。 我们尝试完全删除DynamicSnitch,但是一旦我们这样做,每次单个服务器都有一点负载,我们就会遇到极端的性能降级。

有没有人遇到过这个问题? 有没有办法直接影响特定数据中心的得分,因此DynamicSnitch不会选择它? 有没有更好的方法在cassandra 1.0.11中添加数据中心?有没有人写过处理这些问题的小报?

谢谢, Izik。

1 个答案:

答案 0 :(得分:3)

您可以引导节点而不是在没有引导程序的情况下添加到环中,然后进行修复。前者确保在具有所需的所有数据之前不会将读取路由到它。 (这就是为什么Cassandra默认为auto_bootstrap: true并且实际上禁用它是一个非常糟糕的想法,我们从示例cassandra.yaml中删除它。)

这个问题,以及文档建议在没有引导程序的情况下首先添加所有节点的原因是,如果您为DC4配置了N个副本,Cassassandra将尝试将该键空间的整个数据集复制到前N个节点你添加,这可能有问题!

以下是我看到的选项:

  1. 如果您的数据集足够小,请继续使用引导计划
  2. 增加ConsistencyLevel读取内容,以便它们始终触及有数据的副本,以及不具有数据的副本
  3. 升级到1.2,并在您的读取中使用ConsistencyLevel.LOCAL_ONE,这将迫使它永远不会发出跨DC请求