0

Astyanax client用来从Cassandra database. 我有一个single cluster. four nodes我有replication factor of 2。我试图了解两者之间有什么区别

setMaxConns and setMaxConnsPerHost 

Astyanax 客户端中的方法?我找不到关于此的适当文档。

我有一个多线程代码,它产生多个线程,然后只创建一次到 Cassandra 数据库的连接(因为它是一个单例),然后继续重用其他请求。

现在我想了解以上两种方法对读取性能有何影响?应该如何设置这些值?

如果我将上述两种方法设置为-

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课堂。我在同一个类中放置了很多断点,以查看它是如何使用连接和其他默认参数的。但不知道为什么它没有击中那个类。

4

1 回答 1

4

有关这些配置属性的行为可能取决于实现。

BagOfConnectionsConnectionPoolImpl

BagOfConnectionsConnectionPoolImpl是目前唯一同时满足这两个属性的实现。它的行为如下:

在每次 cassandra 操作(查询或突变)时从池中借用连接,并在操作完成后返回池。

maxConnsPerHost- 每个 cassandra 主机的最大连接数。

maxConns- 池中的最大连接数。

这两个数字都必须是正数,所以setMaxConns(-1)不会起作用。

在尝试从池中借用连接时,池会检查活动连接号maxConns。如果超出限制,它会等待直到某个连接被释放。如果在指定的超时时间内没有可用的连接,则池抛出PoolTimeoutException.

如果maxConns未超过限制,则池将尝试查找它知道的 cassandra 主机(指定为种子或在发现期间找到),其活动连接数低于maxConnsPerHost并连接到它。如果所有主机都达到连接限制,则池抛出NoAvailableHostsException.

例如,让我们以连接到 4 个节点的集群的客户端为例:

setMaxConns(100); setMaxConnsPerHost(10):有效的最大连接数为 40(每个节点 10 个连接,将不再进行连接尝试)。NoAvailableHostsException将被抛出。

setMaxConns(20); setMaxConnsPerHost(10):有效的最大连接数为20。不同主机的连接将均匀分布,但不一定要均匀分布。 PoolTimeoutException将被抛出。

如果节点加入或离开集群,事情会变得更加复杂,但总体思路是相同的。

TokenAwareConnectionPoolImpl & RoundRobinConnectionPoolImpl

两者都TokenAwareConnectionPoolImpl&RoundRobinConnectionPoolImpl忽略maxConns配置属性。他们只是选择一个主机(取决于行令牌或随机)并尝试连接到它。

如果与该主机的活动连接数超过maxConnsPerHost,则池将等待直到某个连接被释放。如果在指定的超时期间没有可用的连接,则作为故障转移的一部分执行(可能)另一个主机的另一个连接尝试。

于 2013-04-26T08:28:29.617 回答