环境:
运行在Amazon Linux上的
cacheMode = PARTITIONED
backups = 0
OnheapCacheEnabled = true
atomicityMode = ATOMIC
rebalacneMode = SYNC
rebalanceBatchSize = 1MB
copyOnread = false
rebalanceThrottle = 0
rebalanceThreadPoolSize = 4
的
基本上,我们有一个进程,它在启动时填充缓存,然后从Kafka接收定期更新,并将它们传播到缓存。
缓存中的元素数量随着时间的推移或多或少是稳定的(因为我们有创建、更新和删除事件的混合,所以只有一点波动),但我们注意到数据在不同节点上的分布非常不均匀,其中一个节点的键数(和内存利用率)至少是其他节点的两倍。随着时间的推移,该节点要么耗尽内存,要么开始执行非常长的GC,并与群集的其余部分失去联系。
我的期望是Ignite会在不同的节点上平衡数据,但现实中显示的是完全不同的东西。我是不是漏掉了什么?为什么我们会看到这种不平衡,我们如何解决它?
提前谢谢。
发布于 2018-06-09 04:53:03
归根结底,尽管我们的散列函数具有良好的分布性,但默认的亲和性函数并没有在集群中的节点之间产生良好的键分布(以及相应的内存分布)。我们用一个非常简单的(partition # % # of nodes
)替换了它,这大大改善了分布(方差小于2% )。
这不是一个通用的解决方案;它对我们有效,因为我们的整个集群都在一个虚拟机中,并且我们不使用复制。对于跨越VM边界和复制的大型集群,必须将复制的数据保存在单独的服务器中,而朴素的方法无法解决这一问题。
https://stackoverflow.com/questions/50243616
复制相似问题