【问题标题】:low cassandra write/second, 1500-2000 writes per second in 6 nodes cluster低 cassandra 写入/秒,6 节点集群中每秒 1500-2000 次写入
【发布时间】:2018-11-15 21:31:20
【问题描述】:

Cassandra 集群规格:

Nodes: 6
Storage: 1536 GB
Cores: 48
Ram: 168 GB

从我的本地到 cassandra 集群的延迟:330 ms-390 ms

我使用的是cassandra java驱动,spark-cassandra-connector_2.11 version 2.3.2

java驱动中的集群配置:

private static Session connect(
      final String node, final Integer port, final String userName, final String password) {

    Builder b = Cluster.builder().addContactPoints(node.split(COMMA_SEPARATOR));
    if (!Strings.isNullOrEmpty(userName) && !Strings.isNullOrEmpty(password)) {
      b.withCredentials(userName, password);
    }

    if (port != null && port != 0) {
      b.withPort(port);
    }

    PoolingOptions poolingOptions = new PoolingOptions();
    poolingOptions
        .setMaxRequestsPerConnection(HostDistance.LOCAL, 32768)
        .setMaxRequestsPerConnection(HostDistance.REMOTE, 10000)
        .setMaxConnectionsPerHost(HostDistance.LOCAL, 3)
        .setMaxConnectionsPerHost(HostDistance.REMOTE, 3)
        .setNewConnectionThreshold(HostDistance.LOCAL, 3)
        .setNewConnectionThreshold(HostDistance.REMOTE, 3)
        .setCoreConnectionsPerHost(HostDistance.LOCAL, 3)
        .setCoreConnectionsPerHost(HostDistance.REMOTE, 3);

    b.withSocketOptions(
        new SocketOptions()
            .setConnectTimeoutMillis(SOCKET_CONNECT_TIMEOUT)
            .setReadTimeoutMillis(SOCKET_READ_TIMEOUT));
    b.withPoolingOptions(poolingOptions);

    cluster = b.build();


    session = cluster.connect();

    return session;
  }

下面是我的测试表:

CREATE TABLE my_keyspace.test_table (
  id int PRIMARY KEY
)

要写信给 cassandra,我正在使用 session.executeAsync 并将期货存储在列表中并等待所有期货完成。

当我执行 100000 次写入时,需要 50-65 秒。 它应该是这么慢还是我在配置中缺少一些东西? 我已经在套接字选项和池选项中尝试了几个选项,但这是我得到的最好的。

【问题讨论】:

  • 吞吐量非常低。为 Cassandra 分配了多少内存?您在日志中看到了什么吗?
  • 我没有检查日志,但应该是 168/6 GB。那是专用的 cassandra 集群
  • 不,在您的设置中,堆将是机器上可用内存的 1/4,因此大约为 7Gb...我建议明确增加到 12 或 16
  • 当然。集群不归我们所有。我肯定会检查。

标签: cassandra datastax-java-driver


【解决方案1】:

我要检查的第一件事是您的 Cassandra 服务器是否以 100% 的 CPU 利用率运行。如果不是,并且由于我假设服务器在磁盘上没有瓶颈(即使对旋转磁盘每秒执行 1500 次写入也没问题),那么瓶颈必须在其他地方:

您应该始终首先检查的一种可能性是 客户端 不是瓶颈,即它没有使用 100% 的 CPU。

然后,您说“从我的本地到 cassandra 集群的延迟是 330 毫秒”。这是您的测试机和 Cassandra 集群之间的 ping 时间吗?如果是这样,您可能会遇到两种问题。首先,也许这是某种低带宽广域网,它每秒无法支持超过 2000 个请求。但我对此表示怀疑。另一种可能性是您的客户端根本没有足够的并发性......以 1/3 秒的延迟,要实现每秒 2000 次写入,您需要客户端并行执行 666 个请求。你设置的 setMaxRequestsPerConnection() 真的生效了吗?因为如果不是,默认(根据https://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/)是你设置的3个连接的256倍,也就是768,接近上面的数字666。

当然,它可以是许多其他的东西。没有更多数据很难猜测。

【讨论】:

  • 感谢@nyh。 1. 是的,它的 ping 响应。 2. 我在本地尝试了相同的设置,有 2 个节点。我每秒收到 10000-15000 次写入。所以我觉得这与带宽有关。但尚未确认,我将尝试在靠近 cassandra 集群的 VM 中运行相同的程序,然后我可能会明白 3. 是的,setMaxRequestsPerConnection 肯定会有所作为。
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 2019-09-13
  • 2011-11-21
  • 1970-01-01
  • 2016-04-16
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多