不平衡的Cassandra副本存储

时间:2015-06-08 10:41:13

标签: java cassandra datastax

在我们的设置中,我们有2个DC,每个DC中有21个Cassandra节点,每个记录总共有4个副本(在其中一个键空间中) - 每个站点有两个副本。 每个Cassandra节点都设置有16个VNode。 我们没有为集群中的每个节点手动设置initial_token,而是让Cassandra决定令牌范围分布。

我的问题 - 在我们的群集中列出令牌范围时,似乎副本以不平衡的方式存储。 例如,这是显示的672条记录之一([42个节点] * [16个VNodes]):

  

TokenRange(start_token:-8400100964809109474,   end_token:-8379945255976340112,端点:[xxx.101.xxx.210,   xxx.101.xxx.212,10.x.108.xxx,xxx.164.xx.157],   rpc_endpoints:[xxx.101.xxx.210,xxx.101.xxx.212,10.xx.108.xxx,   xxx.164.xx.157]   endpoint_details:[EndpointDetails(宿主:xxx.101.xxx.210,   数据中心:ALLNTXDW,机架:RAC1),EndpointDetails(主机:xxx.101.xxx.212,   数据中心:ALLNTXDW,机架:RAC1),EndpointDetails(主机:10.x.108.xxx,   数据中心:BOTHWAKY,机架:RAC1),EndpointDetails(主机:xxx.164.xx.157,   数据中心:BOTHWAKY,机架:RAC1)])

在672条记录中,每个节点正好分配给“端点”和“rpc_endpoints”元组中第一个项的16次(如预期的那样)。但是第二,第三,第四项的填充不均匀,导致集群不平衡。其中一个节点在672个元组中的28个中显示为第四个节点,而其他节点在第四个节期中显示为4(!)倍。

这导致其中一个节点接收插入到集群中的超过12%的数据(令牌范围中的672个分配中的86个),而一些节点接收一半(令牌范围中的672个分配中的43个)。

是否可以控制副本的令牌范围分配 ? 我该如何平衡这个?

注意:此群集是生产的,并且已经加载了许多TB数据。实际上这个问题引起了我们的注意,因为其中一台机器的空间填充高达98%,而其他机器只占空间的40%。

谢谢! 伽

1 个答案:

答案 0 :(得分:3)

每个主机仅使用16个vnode可能不是一个好主意。每个vnode令牌将随机生成,期望在具有足够数量的令牌时发生均衡。使用的vnode数量越少,变化越大,分布不均匀的可能性越大。