Java Astyanax客户端每个节点的最大连接数?

Java Astyanax客户端每个节点的最大连接数?,java,cassandra,astyanax,Java,Cassandra,Astyanax,我正在使用Astyanax客户端从Cassandra数据库读取数据 private CassandraAstyanaxConnection() { context = new AstyanaxContext.Builder() .forCluster(ModelConstants.CLUSTER) .forKeyspace(ModelConstants.KEYSPACE) .withAstyanaxConfiguration(new AstyanaxConfigu

我正在使用Astyanax客户端从Cassandra数据库读取数据

private CassandraAstyanaxConnection() {
    context = new AstyanaxContext.Builder()
    .forCluster(ModelConstants.CLUSTER)
    .forKeyspace(ModelConstants.KEYSPACE)
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(1)
        .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160")
    )
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2"))
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    keyspace = context.getEntity();

    emp_cf = ColumnFamily.newColumnFamily(
        ModelConstants.COLUMN_FAMILY,
        StringSerializer.get(),
        StringSerializer.get());
}
我在Cassandra数据库中有大约一百万个唯一的行。我有一个带有四个节点的交叉集群

这是我的四个节点:

  node1:9160
  node2:9160
  node3:9160
  node4:9160
我已经启用了KeyCaching,并且还启用了sizetieredcompression策略

我有一个多线程的客户机程序,它将使用Astyanax客户机从Cassandra数据库读取数据,我用20个线程运行它。如果我用20个线程运行我的客户机程序,那么从Cassandra数据库读取数据的性能就会下降

因此,我想到的第一件事是,可能会有关于到Cassandra的连接的争用(他们是否使用池,如果是的话,有多少连接被维护)?我正在使用下面的代码使用Astyanax客户端建立连接

private CassandraAstyanaxConnection() {
    context = new AstyanaxContext.Builder()
    .forCluster(ModelConstants.CLUSTER)
    .forKeyspace(ModelConstants.KEYSPACE)
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(1)
        .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160")
    )
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2"))
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    keyspace = context.getEntity();

    emp_cf = ColumnFamily.newColumnFamily(
        ModelConstants.COLUMN_FAMILY,
        StringSerializer.get(),
        StringSerializer.get());
}
我是否需要对上述代码进行任何更改以提高性能

这个方法有什么作用

   setMaxConnsPerHost(1)
我是否需要增加该值以提高性能?我有四个节点,所以我应该把它改为4


setMaxConns(20)方法会调用吗?我是否也需要添加这些内容来提高性能?因为我将使用多个线程运行我的程序。

有关
maxConnsPerHost
/
maxConns
的详细信息,请检查以下答案:

是的,
maxConnsPerHost
应该增加以获得良好的性能。最佳值取决于网络拓扑、请求复制因子、存储配置、缓存、读/写比率等

我认为,如果没有实验和模拟,就不可能实现重负载集群的最佳性能

对于卡桑德拉中等负荷的任务,我通常使用经验法则:

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1
maxConnsPerHost~=/+1
也就是说,对于复制系数为3的8核机箱集群,
maxConnsPerHost
应该在4左右。该值也是重负载场景中实验的良好起点

动机:一个由
N
节点组成的集群,每个节点拥有
C
核心,总共拥有
N*C
核心。要使用复制因子
R
处理请求,需要(不同节点的)核心
R
。因此,在每个给定时刻,集群最多可以处理
N*C/R
请求。将并发连接的数量保持在这个数字附近是个好主意。将其除以
N
,以计算每个主机的连接数。为每台主机添加1个备用连接,用于网络延迟等

更新:简单客户端性能调整:

  • 从一些
    maxConnsPerHost
    值开始
  • 模拟负载并观察CPU使用情况和
    org.apache.cassandra.request->***Stage->pendingTasks
    JXM属性
  • 增加
    maxConnsPerHost
    直到
    pendingTasks
    开始快速增加。这可能是最佳值
  • 集群节点上的CPU负载应该在50-70%左右。如果更少,那么服务器配置可能有问题

感谢Wildfire的建议。谢谢你的帮助。那么setMaxConns呢?我们应该为此设定什么值?我们通常遵循什么样的逻辑来决定这一点?@FarhanJamal:setMaxConns仅与ConnectionPoolType.BAG一起使用,在其他实现中被忽略。如果您使用BAG连接池,您可以将此属性设置为可能同时向Cassandra发送请求的最大线程数。谢谢您的建议。一般来说,我应该使用什么连接池?这意味着什么样的连接池将允许我有更快的读取性能。目前,在我上面的示例中,我使用的是
connectionpoolconfigurationmpl
。你对此也有什么建议吗?