5

我正在使用 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。
问题是:为什么会发生这种情况?令牌感知连接池不应该查询节点列表的环并使用循环算法连接到所有活动节点吗?

4

1 回答 1

2

William Price是完全正确的:您使用 aTokenAwarePolicy并且可能是默认值的事实Partitioner意味着 - 首先,您的数据将在您的节点之间存在偏差 - 然后在查询时LoadbalancingPolicy让您的驱动程序记住要请求的正确节点

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

当然,后者需要在您的密钥空间中定义数据中心。

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

于 2014-06-11T21:32:48.497 回答