我有2个与DataStax查询相关的问题:
我在3个节点上安装了DataStax Enterprise 4.6,其配置与CPU,RAM,存储等完全相同。然后我创建了一个RF = 3的密钥空间,在密钥空间内创建了一个CF并插入了其中有1000万行。现在,当我登录到Node1并执行计数查询时,它在大约1mt 15秒内返回大约150万。但是当我登录到Node2并执行完全相同的查询时,大约需要1mt 35秒。同样,当我登录到Node3并执行时,大约需要1mt 20秒。为什么3个节点上的查询执行时间有差异?
我在Node2&上关闭DSE(服务dse停止) Node3并在Node1上运行查询。由于Node1上所有必需的数据都可用,因此它成功运行并占用了1毫秒15秒。然后我在Node2上启动DSE并再次运行查询。通过跟踪,我看到数据也从Node2获取,但执行查询所花费的时间超过1mt 15秒。它应该不会少,因为正在使用2个节点?类似地,当Node3也启动并执行查询时,与2个节点启动时相比需要更多时间。我的理解是Cassandra / DataStax是线性可扩展的。
非常感谢任何帮助/指示..
答案 0 :(得分:0)
听起来像我的正常行为。当多个节点相互协调和交互时,总会有一些开销,并且事情不一定会以完全对称的方式运行。
即使所有数据都是本地数据,仍然会与正在进行的其他节点进行一些交互,其中一些数据在时间上是不确定的。您有不同的网络延迟,不同的排队顺序,变量在磁盘上寻找时间等等。
当您关闭两个节点时,其余节点知道它们已关闭,因此它不会尝试对它们进行任何读取或交互。这就是为什么这种情况最快的原因。当您将其他节点重新联机时,与它们的额外协调会使事情变慢一些。这是你为冗余支付的价格。
性能通过不在每个节点上保留数据副本来扩展。您使用RF = 3并且只有三个节点。如果添加了第四个节点,则并非所有数据都在每个节点上。现在你已经增加了容量,因为不是每次写入都会转到所有节点,不同的写入会触及不同的一组机器。
答案 1 :(得分:0)
您的问题很容易回答。这是一致性问题:您可以使用一致性调整选择查询,然后C *不需要检查所有节点上的数据(RF = 3)是否匹配。 在大多数用例中,读取的一致性应该足够。 至于时差:除了提供查询外,机器还涉及许多不同的事情。因此,每个节点具有不同响应时间的正常行为。这里有类似的问题/答案:How do I set the consistency level of an individual CQL query in CQL3? 基本上可以保持一致性,看看响应时间是如何变化的。