【问题标题】:Astyanax client maximum connections per node?Astyanax客户端每个节点的最大连接数?
【发布时间】:2013-04-18 16:39:15
【问题描述】:

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

我在 Cassandra 数据库中有大约 100 万行不同的行。我有一个带有四个节点的交叉 colocation centre 集群。

这是我的四个节点:

  node1:9160
  node2:9160
  node3:9160
  node4:9160

我启用了 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());
}

我是否需要对上述代码进行任何更改以提高性能?

这个方法有什么作用?

   setMaxConnsPerHost(1)

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

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

【问题讨论】:

    标签: java cassandra astyanax


    【解决方案1】:

    有关maxConnsPerHost/maxConns的详细信息,您可以查看此答案:setMaxConns and setMaxConnsPerHost in Astyanax client

    是的,应该增加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 以计算每个主机的连接数。为每个主机添加 1 个备用连接用于网络延迟等。就是这样。

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

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

    【讨论】:

    • 感谢 Wildfire 的建议。感谢您的帮助。那么 setMaxConns 呢?我们应该为此设置什么值?我们通常遵循什么样的逻辑来决定。
    • @FarhanJamal:setMaxConns 仅与 ConnectionPoolType.BAG 一起使用,在其他实现中被简单地忽略。如果使用 BAG 连接池,则可以将此属性设置为可能同时向 Cassandra 发送请求的最大线程数。
    • 感谢您的建议。一般来说,我应该使用什么连接池?这意味着什么连接池可以让我获得更快的读取性能。目前,在我上面的例子中,我使用的是ConnectionPoolConfigurationImpl。您对此也有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2012-08-25
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多