Java Astyanax客户端每个节点的最大连接数?
我正在使用Astyanax客户端从Cassandra数据库读取数据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
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使用情况和
JXM属性org.apache.cassandra.request->***Stage->pendingTasks
- 增加
直到maxConnsPerHost
开始快速增加。这可能是最佳值李>pendingTasks
- 集群节点上的CPU负载应该在50-70%左右。如果更少,那么服务器配置可能有问题
connectionpoolconfigurationmpl
。你对此也有什么建议吗?