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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了低cassandra写入/秒,6个节点集群中每秒1500-2000次写入相关的知识,希望对你有一定的参考价值。

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服务器是否以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。

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

以上是关于低cassandra写入/秒,6个节点集群中每秒1500-2000次写入的主要内容,如果未能解决你的问题,请参考以下文章

解决 Cassandra Coordinator 节点写入超时的方法

Cassandra 3.x - 将 3 个节点添加到 6 节点集群

2 节点 Cassandra 集群中的故障转移和复制

Cassandra教程---- 节点间交互(gossip)

由于我的 Cassandra 集群中的负载过大,节点上的写入失败

Cassandra:挂节点工具修复