我们有一个6节点cassandra集群,每秒非常大量读取,写入次数很少。整个申请包括:
与cassandra交谈的Web应用程序正在进行读写操作(但非常少,只有当某人实际使用应用程序UI时才会这样做,而这种情况并不经常发生)。然而,Web服务负载来自第三方服务的流量非常大。负载均衡器将流量定向到所有5个服务器,每个服务器都会使用大量的get()和multiget()请求轰炸自己的cassandra节点(物理上位于另一个服务器中)。偶尔会使用一个set(),但就像每万次读取一次一样。
有了这种用法,我们决定使用复制因子6.如果每个cassandra有100%的数据,那么读取应该更快,并且应该更均衡地加载负载。我们更新了keypace strategy_options并在每个节点上运行nodetool修复以传输数据。好的。
现在非常奇怪:所有六个cassandra节点都处于非常高的CPU使用率。在Web服务使用的五个节点的情况下可以理解,但是我们无法解释为什么webapp cassandra节点也消耗了那么多CPU,就好像它执行了大量读取一样。这就好像复制根本不起作用 - 看起来每当一个get()发生并且整个环受到极大压力时,每个cassandra节点都会与所有其他节点通信。
我做了另一个实验来证明这一点,我取下了一个Web服务器,我正在查看相应的cassandra节点。在服务器出现故障后,我预计此cassandra节点上的CPU使用率接近于零,因为没有其他计算机指向它。但它不是零,它略有下降,但仍处于非常高的水平(CPU使用率为60%)。
我们正在使用pycassa,我们没有操纵一致性级别,所以它是默认的ConsistencyLevel.ONE
我希望你明白我的意思...如果复制因子等于环中的节点数,并且读一致性级别是默认值(ONE),则每个节点在读取方面应该是独立的:如果没有 - 一个是从给定节点进行任何读取,此节点上的CPU使用率应该是最小的,对吗?然而,即使我们断开了唯一看到该节点的客户端,我们仍然会观察到高CPU使用率,就像有人仍在继续读取它一样。这个负载来自哪里,如何调查正在发生的事情?
答案 0 :(得分:3)
如果我错了,请纠正我,但我猜你在群集中的节点上看到的负载是在后台发生的读取修复。当您在群集中的节点上读取ConsistencyLevel.ONE时,将立即返回数据,并且读取将在后台触发读取修复,这将向所有其他副本发送摘要查询以确保一致性。<登记/> 由于复制因子为6(所有节点上的所有数据),因此对于每次读取,读取修复请求将被发送到所有6个节点。