在我们的设置中,我们有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%。
谢谢! 伽
答案 0 :(得分:3)
每个主机仅使用16个vnode可能不是一个好主意。每个vnode令牌将随机生成,期望在具有足够数量的令牌时发生均衡。使用的vnode数量越少,变化越大,分布不均匀的可能性越大。