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

ercv8c1e  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(433)

我正在使用astyanax客户机从cassandra数据库读取数据。
我在一个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)方法会调用吗?我是否也需要添加这些来提高性能?因为我将用多个线程运行我的程序。

4sup72z8

4sup72z81#

有关的详细信息 maxConnsPerHost / maxConns 您可以检查以下答案:astyanax客户机中的setmaxconns和setmaxconnsperhost
是的, maxConnsPerHost 要取得好的成绩就要提高。最佳值取决于网络拓扑、请求复制因子、存储配置、缓存、读写比等。
我不认为在没有实验和仿真的情况下,对于负载繁重的集群来说,实现最佳性能是不可能的。
对于Cassandra负荷适中的任务,我通常使用经验法则:

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1

也就是说,对于复制因子为3的8核机箱集群, maxConnsPerHost 应该在4左右。这个值也是重负载情况下实验的良好起点。
动机:一群 N 每个节点都有 C 核心有 N * C 核心总数。使用复制因子处理请求 R , R 需要(不同节点的)核心。因此,在每个给定的时刻,集群可以处理多达 N * C / R 请求。最好将并发连接的数量保持在这个数字左右。除以 N 计算每个主机的连接数。为每台主机添加一个备用连接,用于网络延迟等。
更新:简单的客户端性能调整:
从一些开始 maxConnsPerHost 价值
模拟负载,观察cpu使用情况和 org.apache.cassandra.request->***Stage->pendingTasks jxm属性
增加 maxConnsPerHost 直到 pendingTasks 开始迅速增加。这可能是最佳值。
集群节点上的cpu负载应该在50-70%左右。如果少了很多,服务器配置可能有问题。

相关问题