添加新的数据中心时,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。
答案 0 :(得分:3)
您可以引导节点而不是在没有引导程序的情况下添加到环中,然后进行修复。前者确保在具有所需的所有数据之前不会将读取路由到它。 (这就是为什么Cassandra默认为auto_bootstrap: true
并且实际上禁用它是一个非常糟糕的想法,我们从示例cassandra.yaml中删除它。)
这个问题,以及文档建议在没有引导程序的情况下首先添加所有节点的原因是,如果您为DC4配置了N个副本,Cassassandra将尝试将该键空间的整个数据集复制到前N个节点你添加,这可能有问题!
以下是我看到的选项:
ConsistencyLevel
读取内容,以便它们始终触及有数据的副本,以及不具有数据的副本ConsistencyLevel.LOCAL_ONE
,这将迫使它永远不会发出跨DC请求