我正在使用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)方法会调用吗?我是否也需要添加这些来提高性能?因为我将用多个线程运行我的程序。
1条答案
按热度按时间4sup72z81#
有关的详细信息
maxConnsPerHost
/maxConns
您可以检查以下答案:astyanax客户机中的setmaxconns和setmaxconnsperhost是的,
maxConnsPerHost
要取得好的成绩就要提高。最佳值取决于网络拓扑、请求复制因子、存储配置、缓存、读写比等。我不认为在没有实验和仿真的情况下,对于负载繁重的集群来说,实现最佳性能是不可能的。
对于Cassandra负荷适中的任务,我通常使用经验法则:
也就是说,对于复制因子为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%左右。如果少了很多,服务器配置可能有问题。