Неравномерное разбиение данных в Apache Ignite 2.4 приводит к тому, что узлам не хватает памяти и происходит сбой
Среда:
- Apache Ignite 2.4 работает на Amazon Linux. VM составляет 16CPUs/122 ГБ оперативной памяти. Там много места.
- 5 узлов по 12 ГБ каждый
cacheMode = PARTITIONED
backups = 0
OnheapCacheEnabled = true
atomicityMode = ATOMIC
rebalacneMode = SYNC
rebalanceBatchSize = 1MB
copyOnread = false
rebalanceThrottle = 0
rebalanceThreadPoolSize = 4
По сути, у нас есть процесс, который заполняет кеш при запуске, а затем получает периодические обновления от Kafka, распространяя их в кеш.
Количество элементов в кеше более или менее стабильно с течением времени (есть небольшие колебания, так как у нас есть смесь событий создания, обновления и удаления), но мы заметили, что распределение данных по различным узлам очень неравномерно, причем один из узлов, по крайней мере, удваивает количество ключей (и использование памяти) по сравнению с другими. Со временем этому узлу либо не хватает памяти, либо он начинает выполнять очень длинные GC и теряет связь с остальной частью кластера.
Я ожидал, что Ignite уравновесит данные между различными узлами, но реальность показывает что-то совершенно другое. Я что-то здесь упускаю? Почему мы видим этот дисбаланс и как мы можем это исправить?
Заранее спасибо.
1 ответ
В итоге, хотя наша хеш-функция имела хорошее распределение, стандартная функция сродства не давала хорошего распределения ключей (и, следовательно, памяти) по узлам в кластере. Мы заменили его на очень наивный (partition # % # of nodes
), и это немного улучшило распределение (менее 2% дисперсии).
Это не общее решение; это работает для нас, потому что весь наш кластер находится в одной виртуальной машине, и мы не используем репликацию. Для массивных кластеров, пересекающих границы ВМ и репликацию, хранение реплицированных данных на отдельных серверах является обязательным, и наивный подход не сократит это.