我正在使用Astyanax client
来阅读Cassandra database
中的数据。我有single cluster
four nodes
。我有replication factor of 2
。我试图了解
setMaxConns and setMaxConnsPerHost
Astyanax客户端中的方法?我找不到合适的文件。
我有一个多线程代码,它产生多个线程,然后只创建一次与Cassandra数据库的连接(因为它是一个Singleton),然后继续重用其他请求。
现在我想了解上述两种方法如何在读取性能中发挥作用?以及如何设置这些值?
如果我将上述两种方法设置为 -
setMaxConns(-1) and setMaxConnsPerHost(20)
那是什么意思?任何解释都会有很大的帮助。
更新代码: -
下面是代码,我用来建立连接 -
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(20)
.setMaxConns(-1)
.setSeeds("host1:9160,host2:9160,host3:9160,host4: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());
}
如果我正在调试此代码,它甚至没有达到BagOfConnectionsConnectionPoolImpl
类。我在同一个类中放了很多断点,看看它是如何使用conenctions和其他默认参数的。但不知道为什么不打那个班。
答案 0 :(得分:4)
有关这些配置属性的行为可能取决于实现。
BagOfConnectionsConnectionPoolImpl
是目前唯一能够尊重这两个属性的实现。它的行为如下:
在每次cassandra操作(查询或突变)时从池中借用连接,并在操作完成后返回池。
maxConnsPerHost
- 每个cassandra主机的最大连接数。
maxConns
- 池中的最大连接数。
这两个数字都必须是正数,所以setMaxConns(-1)
才能胜任。
在尝试从池中借用连接时,池会检查与maxConns
的活动连接号。如果超出限制,则等待直到某个连接被释放。如果在指定的超时时间内没有可用的连接,则池将抛出PoolTimeoutException
。
如果未超过maxConns
限制,则池会尝试查找一个cassandra主机,它知道(在发现期间指定为种子或发现),其活动连接数低于{{1}并连接到它。如果所有主机都达到连接限制,则池将抛出maxConnsPerHost
。
例如,让我们选择连接到4个节点的集群的客户端:
NoAvailableHostsException
:有效的最大连接数为40(每个节点10个连接,不再进行连接尝试)。 setMaxConns(100); setMaxConnsPerHost(10)
将被抛出。
NoAvailableHostsException
:有效的最大连接数为20.与不同主机的连接将统一分配,但不一定必要。 setMaxConns(20); setMaxConnsPerHost(10)
将被抛出。
如果节点加入或离开集群,事情变得更复杂,但总的想法是一样的。
PoolTimeoutException
& TokenAwareConnectionPoolImpl
忽略RoundRobinConnectionPoolImpl
配置属性。他们只选择一个主机(取决于行令牌或随机)并尝试连接到它。
如果该主机的活动连接数超过maxConns
,则池将等待,直到某个连接被释放。如果在指定的超时期间没有可用的连接,则(可能)另一个主机的另一个连接尝试将作为故障转移的一部分执行。