低cassandra写入/秒,6个节点集群中每秒1500-2000次写入

问题描述 投票:0回答:1

Cassandra集群规格:

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

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

我正在使用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
)

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

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

cassandra datastax-java-driver
1个回答
2
投票

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

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

然后,你说“从我当地的cassandra集群的延迟是330毫秒”。这是您的测试机器和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。

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

© www.soinside.com 2019 - 2024. All rights reserved.