我使用的是astyanax连接池,定义如下:
ipSeeds = "LOAD_BALANCER_HOST:9160";
conPool.setSeeds(ipSeeds)
.setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE)
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE);
但是,我的群集有4个节点,我连接了8个客户端机器。 LOAD_BALANCER_HOST
将请求转发给我的四个节点之一。
在客户端节点上,我有:
$netstat -an | grep 9160 | awk '{print $5}' | sort |uniq -c
235 node1:9160
680 node2:9160
4 node3:9160
4 node4:9160
因此,虽然ConnectionPoolType是TOKEN_AWARE
,但我的客户端似乎主要连接到node2,有时连接到node1,但几乎从不连接到节点3和4。
问题是:
为什么会这样?难道令牌识别连接池不应该查询节点列表的环并使用循环算法连接到所有活动节点吗?
答案 0 :(得分:2)
William Price
完全正确:您使用TokenAwarePolicy
并且可能使用默认Partitioner
这一事实意味着
- 首先,您的数据将存储在您的节点之间
- 然后在查询LoadbalancingPolicy
时,让您的驱动程序记住要求的正确节点
您可以通过使用某些偏差来改善群集的性能,也可以使用自定义分区程序来平均分配数据。要随机查询节点,请使用
RoundRobinPolicy
(http://www.datastax.com/doc-source/developer/java-apidocs/com/datastax/driver/core/policies/RoundRobinPolicy.html)或DatacenterAwareRoundRobinPolicy
(http://www.datastax.com/doc-source/developer/java-apidocs/com/datastax/driver/core/policies/DCAwareRoundRobinPolicy.html)。后者当然需要在密钥空间中定义数据中心。
如果没有任何进一步的信息,我建议只更改分区器,因为TokenAware负载均衡策略通常是个好主意。主要负载最终会在这些节点上结束 - TokenAware策略让您更快地到达正确的协调器。