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

5 java cassandra astyanax

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

我在Cassandra数据库中有大约一百万个唯一行.我有一个包含四个节点的交叉主机托管集群.

这些是我的四个节点:

  node1:9160
  node2:9160
  node3:9160
  node4:9160
Run Code Online (Sandbox Code Playgroud)

我启用了KeyCaching,并且还启用了SizeTieredCompaction策略.

我有一个多线程的客户端程序,它将使用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());
}
Run Code Online (Sandbox Code Playgroud)

我是否需要在上面的代码中进行任何类型的更改以提高性能?

这种方法有什么作用?

   setMaxConnsPerHost(1)
Run Code Online (Sandbox Code Playgroud)

我是否需要增加它以提高性能?我有四个节点,所以我应该将其更改为4?

并且setMaxConns(20)方法会调用吗?我是否还需要添加它以提高性能?因为我将用多个线程运行我的程序.

Wil*_*ire 9

有关详细信息maxConnsPerHost/ maxConns您可以检查此答案:Astyanax客户端中的setMaxConns和setMaxConnsPerHost

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

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

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

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1
Run Code Online (Sandbox Code Playgroud)

也就是说,对于具有复制因子3的8核盒的簇,maxConnsPerHost应该是大约4.这个值也是重载场景中的实验的良好起点.

动机:N每个拥有C核心的节点集群都有N * C核心总数.为处理与复制因子请求R,R(的不同节点)核是必需的.因此,在每个给定时刻,群集都可以处理最多N * C / R请求.保持此数字周围的并发连接数是个好主意.除以它N来计算每个主机的连接数.为每个主机添加1个备用连接以用于网络延迟等.就是这样.

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

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