Cassandra 令牌感知的Astyanax连接池在节点上连接,而不在节点上分发连接

Cassandra 令牌感知的Astyanax连接池在节点上连接,而不在节点上分发连接,cassandra,astyanax,amazon-elb,cassandra-2.0,Cassandra,Astyanax,Amazon Elb,Cassandra 2.0,我使用的astyanax连接池定义如下: ipSeeds = "LOAD_BALANCER_HOST:9160"; conPool.setSeeds(ipSeeds) .setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE) .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE); 但是,我的集群有4个节点,并且有8台客户端计算机在其上连接负载平衡器主机将请求转发到我的四个节点之一 在客户端节点上,我

我使用的astyanax连接池定义如下:

ipSeeds = "LOAD_BALANCER_HOST:9160";
conPool.setSeeds(ipSeeds)
.setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE)
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE);
但是,我的集群有4个节点,并且有8台客户端计算机在其上连接<代码>负载平衡器主机将请求转发到我的四个节点之一

在客户端节点上,我有:

$netstat -an | grep 9160 | awk '{print $5}' | sort |uniq -c
    235 node1:9160
    680 node2:9160
      4 node3:9160
      4 node4:9160
因此,尽管ConnectionPoolType具有令牌感知功能,但我的客户端似乎主要连接到节点2,有时连接到节点1,但几乎从未连接到节点3和4。
问题是:
为什么会这样?令牌感知连接池不应该查询环中的节点列表并使用循环算法连接到所有活动节点吗?

William Price
是完全正确的:您使用的是
TokenAwarePolicy
以及默认的
分区器,这意味着
-首先,您的数据将存储在节点和
-然后在查询
LoadbalancingPolicy
时,让您的驱动程序记住要请求的正确节点

您可以通过使用一些偏差来提高集群的性能,或者可以是一个自定义分区器来平均分配数据。要随机查询节点,请使用

  • RoundRobinPolicy
    ()或
  • datacenterawarerroundrobinpolicy
    ()
当然,后者需要在键空间中定义数据中心


如果没有任何进一步的信息,我建议只更改分区器,因为令牌感知负载平衡策略通常是一个好主意。最终,主负载将在这些节点上结束——TokenAware策略会让您更快地找到正确的协调器。

您为密钥空间配置了什么复制因子?您选择了哪种复制策略?您确定您的客户端正在访问范围广泛的行键,还是他们在测试中主要关注一个或两个?我使用的是复制因子2和复制策略网络。我确定我使用的是范围广泛的行键,但行的存储位置应该与连接无关,对吗?或者我错了?一个“令牌感知”策略应该尝试只联系实际存储数据的节点。您使用的是RF=2,因此对于任何给定的令牌(行键的散列),四(4)个节点中有两(2)个节点保存该令牌的数据。对于任何给定的请求,客户端上正常运行的令牌感知策略只会联系这两个节点中的一个。TokenAware与简单的循环不一样;这也很重要。开箱即用,Cassandra使用一个分区器,根据行键的散列值在环周围随机存储数据。如果您确实要访问范围广泛的行键,我通常希望负载在集群中得到平衡。但是,如果您配置了一个保持顺序的分区器,那么您的行将不会均匀分布,并且会出现热点。