1

环境:

  1. 在 Amazon Linux 上运行的 Apache Ignite 2.4。虚拟机是 16CPU/122GB 内存。那里有足够的空间。
  2. 5 个节点,每个 12GB
  3. cacheMode = PARTITIONED
  4. backups = 0
  5. OnheapCacheEnabled = true
  6. atomicityMode = ATOMIC
  7. rebalacneMode = SYNC
  8. rebalanceBatchSize = 1MB
  9. copyOnread = false
  10. rebalanceThrottle = 0
  11. rebalanceThreadPoolSize = 4

基本上,我们有一个进程在启动时填充缓存,然后从 Kafka 接收定期更新,将它们传播到缓存。

缓存中的元素数量随着时间的推移或多或少是稳定的(只是有一点波动,因为我们混合了创建、更新和删除事件),但我们注意到数据在不同节点之间的分布非常不均匀,其中一个节点的键数(和内存利用率)至少是其他节点的两倍。随着时间的推移,该节点要么内存不足,要么开始执行很长时间的 GC,并与集群的其余部分失去联系。

我的期望是 Ignite 会平衡不同节点之间的数据,但现实表明情况完全不同。我在这里错过了什么吗?为什么我们会看到这种不平衡,我们如何解决它?

提前致谢。

4

1 回答 1

0

归根结底,尽管我们的哈希函数具有良好的分布,但默认的亲和函数并没有在集群中的节点上产生良好的键分布(因此,内存)。我们用一个非常幼稚的 ( partition # % # of nodes) 替换它,这大大改善了分布(小于 2% 的方差)。

这不是一个通用的解决方案;它对我们有用,因为我们的整个集群都在一个虚拟机中,而且我们不使用复制。对于跨越虚拟机边界和复制的大规模集群,将复制的数据保存在单独的服务器中是强制性的,而幼稚的方法不会削减它。

于 2018-06-08T20:53:02.600 回答