如何增加cassandra的负荷?

时间:2015-09-28 12:03:23

标签: cassandra

我有Cassandra集群,有3个节点,4个客户端向集群发送请求。请求以异步方式发送。这是负责发送请求的代码片段

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)。

2 个答案:

答案 0 :(得分:0)

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

它可能还取决于Cassandra方面的线程设置,但我不确定是你的情况。

此外,还需要检查从客户端到服务器的ping时间。

答案 1 :(得分:0)

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

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

您不想使用只尝试发出尽可能多的请求的客户端,因为那时您可能会有各种队列填满或溢出,请求启动超时等等,这将是混乱你想要衡量的是什么。