5

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

我在 Cassandra 数据库中有大约一百万个唯一行。我有一个带有四个节点的交叉托管中心集群。

这些是我的四个节点:

  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) 方法会调用吗?我是否还需要添加它以提高性能?因为我将使用多个线程运行我的程序。

4

1 回答 1

9

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

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

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

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

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

也就是说,对于复制因子为 3 的 8 核盒子集群,maxConnsPerHost应该在 4 左右。这个值也是在重负载场景下进行实验的一个很好的起点。

动机:每个具有核心的N节点集群具有核心总数。要处理具有复制因子的请求,需要(不同节点的)核心。因此,在每个给定时刻,集群都可以处理请求。将并发连接数保持在此数字附近是个好主意。将其除以计算每个主机的连接数。为每个主机添加 1 个备用连接用于网络延迟等。就是这样。CN * CRRN * C / RN

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

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