我最近一直试图将读取操作的工作量发送到双节点Cassandra集群(版本2.0.9,rf = 2)。我的目的是以高于我的后端服务器容量的速率发送一些读取,从而压倒它们并导致服务器端排队。为此,我使用datastax java驱动程序(cql版本2)异步运行我的操作(换句话说,调用线程不会阻止等待响应)。
问题是我无法达到足够高的发送速率来使我的后端服务器过载。我发送的请求数量正在被Cassandra以某种方式限制。为了确认这一点,我同时从两台不同的机器运行客户端,每单位时间发送的请求总数仍然达到相同的值。我想知道Cassandra是否采用了一种机制来限制正在接收的请求数量?否则,还有什么可能导致这种行为?
答案 0 :(得分:0)
Cassandra方面的网络带宽会限制正在接收的请求数量。
据我所知,他们没有采用Cassandra的其他机制来阻止自己收到太多请求。 Timeout Exception是Cassandra用来避免重载时崩溃的主要机制。
答案 1 :(得分:0)
Cassandra收到的每个请求都将由实现staged event-driven architecture的多个线程池处理,其中请求将排队等待每个阶段。您可以使用nodetool tpstats检查每个队列的当前状态。一旦太多的请求即将淹没服务器,Cassandra将在队列即将达到其容量时通过丢弃请求来减少负载。您会注意到tpstats的删除部分中显示的数字。如果没有删除任何请求,它们最终都将完成,但您可能会在客户端上使用nodetool cfhistograms或WriteTimeoutExceptions看到更高的延迟。
答案 2 :(得分:0)
是的,Cassandra有多种方法来限制传入的请求。您的第一个行动是找出哪个机制是罪魁祸首。然后,您可以调整此机制以满足您的需求。
找出块发生位置的第一步是使用jconsole或类似方法连接到JMX,并查看队列和块值。
如果我猜错了,请检查MessagingService是否超时并在节点之间删除消息。然后在请求进入阶段之前检查已阻止任务的本机传输请求。