2015-09-28 52 views
0

我有Cassandra集群有3个节点和4个客户端向集群发送请求。请求是异步发送的。下面是代码片段负责发送请求如何增加cassandra的负载?

import com.datastax.driver.core._ 
import com.datastax.driver.core.policies.{DCAwareRoundRobinPolicy, TokenAwarePolicy} 
import com.datastax.driver.core.querybuilder.Select.Where 
import com.datastax.driver.core.querybuilder.{Batch, QueryBuilder} 

val query = 
    QueryBuilder. 
     insertInto(keyspace, tableName). 
     values(columnNames, columnValues) 
session.executeAsync(query) 

def setupSession(config: Config): Session = { 
    val port: Int = config.getInt(CassandraKeyValueStorage.PortKey) 
    val addresses: Array[String] = config.getString(CassandraKeyValueStorage.HostsKey).split(",") 
    addresses. 
     foldLeft(Cluster.builder)(_ addContactPoints _). 
     withPort(port). 
     withPoolingOptions(
      new PoolingOptions(). 
      setMaxConnectionsPerHost(HostDistance.REMOTE, 1280). 
      setMaxRequestsPerConnection(HostDistance.REMOTE, 32000). 
      setMaxConnectionsPerHost(HostDistance.LOCAL, 1280). 
      setMaxRequestsPerConnection(HostDistance.LOCAL, 32000)). 
     withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy())). 
     build. 
     connect 
} 

正如已被证明我已经改变了限制,以更高的数字,所以我希望他们不要在客户端减缓。

但是我观察到奇怪的行为。以下是统计数据的请求客户端(time speed1 speed2 speed3 speed4 total_speed)发送:

09:30 0.774 0.25 0.456 0.774 2.254 
10:00 1.082 0.354 0.302 0.744 2.482 
10:30 1.04 0.548 0.774 0.266 2.628 
11:00 0.962 0.7  0.234 0.558 2.454 
11:30 0.69 0.622 0.44 0.806 2.558 
12:00 0.34 0.432 0.416 1.056 2.244 
12:30 0.346 0.414 0.872 0.768 2.4 
13:00 0.458 0.428 0.73 0.98 2.596 
13:30 0.222 0.47 0.798 0.652 2.142 
14:00 0.59 1.084 0.748 0.172 2.594 
14:30 0.328 0.806 1.018 0.458 2.61 
15:00 0.436 0.5  1.134 0.722 2.792 
15:30 0.52 0.258 0.676 0.928 2.382 
16:00 0.406 0.202 0.508 0.798 1.914 

从中很明显,总的速度是有界的一些价值,而客户能够发送更多的数据。与此同时,cassandra盒子上的CPU空闲时间大约为20%,所以它的加载并不那么困难。我无法理解阻止客户发送更多数据的原因。我认为网络带宽并不是因为所有事情都发生在谷歌云引擎的一个区域内,电流负载约为30 Mb/s(带宽为1 Gb/s)。

+0

“一切都发生在谷歌云引擎的一个区域内” - 因此,所有3个节点和应用程序服务器都位于谷歌云的同一区域? –

+0

@ChrisGerlt正好。 – sbeliakov

回答

0

我建议的最简单的事情是尝试在同一个盒子上运行2个客户端实例。如果它将该框中的总流量增加了大约两倍,则尝试调整连接线程设置。我想它可能在Pooling选项中。那里的默认值是什么?

它也可能取决于卡桑德拉方面的线程设置,但我不确定它是你的情况。

此外,值得检查从客户端到服务器的ping时间。

0

对于给定的一组硬件,网络条件和使用的模式,任何群集都将具有最大吞吐量。

为了找到最大的吞吐量,我通常会使用客户端使用可配置大小的线程池发出命令。这使您可以控制在任何给定时间的最大操作次数,然后您可以调整线程池的大小,直到获得最大吞吐量。当增加线程数量导致吞吐量不增加时,您会知道您已经达到了它,但确实会导致每个事务的延迟增加。

你不想使用只尝试发出尽可能多的请求的客户端,因为那样你可能会得到不同的队列来填满或溢出,请求开始超时等,这将浑你想要测量的图片。