低卡桑德拉写入/秒,在6个节点群集中每秒1500-2000次写入

时间:2018-11-15 06:26:33

标签: cassandra datastax-java-driver

Cassandra群集规格:

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

我本地的Cassandra群集的延迟时间:330毫秒至390毫秒

我正在使用cassandra java驱动程序,spark-cassandra-connector_2.11版本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
)

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

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

1 个答案:

答案 0 :(得分:2)

我要检查的第一件事是您的Cassandra服务器是否以100%CPU使用率运行。如果不是这样,并且由于我假设服务器在磁盘上处于瓶颈(即使对旋转的磁盘每秒进行1500次写操作也没有问题),则瓶颈必须位于其他位置:

您应该首先检查的一种可能性是 client 不是瓶颈,即它不使用100%CPU。

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

当然还有很多其他事情。没有更多数据很难猜测。