环境:
cacheMode = PARTITIONED
backups = 0
OnheapCacheEnabled = true
atomicityMode = ATOMIC
rebalacneMode = SYNC
rebalanceBatchSize = 1MB
copyOnread = false
rebalanceThrottle = 0
rebalanceThreadPoolSize = 4
基本上我们有一个进程在启动时填充缓存,然后从Kafka接收定期更新,将它们传播到缓存。
缓存中的元素数量随着时间的推移或多或少是稳定的(因为我们混合了创建,更新和删除事件,所以只有一点波动),但我们注意到的是数据的分布不同的节点非常不均匀,其中一个节点的密钥数量(和内存利用率)至少是其他节点的两倍。随着时间的推移,该节点要么耗尽内存,要么开始执行非常长的GC并且与群集的其余部分失去联系。
我的期望是Ignite会平衡不同节点上的数据,但现实显示出完全不同的东西。我在这里错过了什么吗?为什么我们会看到这种不平衡以及我们如何解决它?
提前致谢。
答案 0 :(得分:0)
尽管我们的哈希函数具有良好的分布,但默认的亲和功能并未在群集中的节点之间产生良好的密钥分布(因此,内存)。我们用一个非常天真的(partition # % # of nodes
)替换它,并且相当一点(方差小于2%)改善了分布。
这不是通用的解决方案;它适用于我们,因为我们的整个群集都在一个VM中,我们不使用复制。对于跨越VM边界和复制的大型集群,将复制数据保存在单独的服务器中是必需的,并且天真的方法不会削减它。