Apache Ignite 2.4数据分区不均匀导致节点耗尽内存并崩溃

时间:2018-05-08 23:41:14

标签: out-of-memory ignite rebalancing

环境:

  1. 在Amazon Linux上运行的Apache Ignite 2.4。 VM是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
  12. 基本上我们有一个进程在启动时填充缓存,然后从Kafka接收定期更新,将它们传播到缓存。

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

    我的期望是Ignite会平衡不同节点上的数据,但现实显示出完全不同的东西。我在这里错过了什么吗?为什么我们会看到这种不平衡以及我们如何解决它?

    提前致谢。

1 个答案:

答案 0 :(得分:0)

尽管我们的哈希函数具有良好的分布,但默认的亲和功能并未在群集中的节点之间产生良好的密钥分布(因此,内存)。我们用一个非常天真的(partition # % # of nodes)替换它,并且相当一点(方差小于2%)改善了分布。

这不是通用的解决方案;它适用于我们,因为我们的整个群集都在一个VM中,我们不使用复制。对于跨越VM边界和复制的大型集群,将复制数据保存在单独的服务器中是必需的,并且天真的方法不会削减它。