【问题标题】:How to increase load on cassandra?如何增加 cassandra 的负载?
【发布时间】:2015-09-29 01:32:33
【问题描述】:

我有 3 个节点和 4 个客户端向集群发送请求的 Cassandra 集群。请求是异步发送的。这是负责发送请求的代码sn-p

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

【问题讨论】:

  • “一切都发生在谷歌云引擎的一个区域内” - 所以所有 3 个节点和应用程序服务器都在谷歌云上的同一个区域?
  • @ChrisGerlt 完全正确。

标签: cassandra


【解决方案1】:

我建议的最简单的方法是尝试在同一个机器上运行 2 个客户端实例。如果它使该框的总流量增加了大约两倍,则尝试调整连接线程设置。我想它可能在池选项中。顺便说一句,那里的默认值是什么?

这也可能取决于 Cassandra 端的线程设置,但我不确定你的情况。

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

【讨论】:

    【解决方案2】:

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

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

    您不想使用只是尝试发出尽可能多的请求的客户端,因为那时您可能会遇到各种队列填满或溢出、请求开始超时等问题,这会使情况变得混乱您要测量的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      相关资源
      最近更新 更多