mva*_*ebr 5 cassandra amazon-elb astyanax cassandra-2.0
我使用的是astyanax连接池,定义如下:
ipSeeds = "LOAD_BALANCER_HOST:9160";
conPool.setSeeds(ipSeeds)
.setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE)
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE);
Run Code Online (Sandbox Code Playgroud)
但是,我的群集有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
Run Code Online (Sandbox Code Playgroud)
因此,虽然ConnectionPoolType是TOKEN_AWARE,我的客户端似乎主要连接到node2,有时连接到node1,但几乎从不连接到节点3和4.
问题是:为什么会发生这种情况?难道令牌识别连接池不应该查询节点列表的环并使用循环算法连接到所有活动节点吗?
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 策略可以让您更快地找到正确的协调器。
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |