Проблема с обрезкой в «Запомнить объекты» Actor Cluster Sharding
В кластере актеров с тремя узлами во время последовательного перезапуска узлов некоторые из вновь созданных записей сущностей перезаписывают старые значения для определенных ключей в «Запомнить сущности» ORSet. Эта проблема при обрезке возникает после перезагрузки. Шарды в кластере полностью перебалансированы, и все субъекты-субъекты успешно воссозданы.
Однако при получении значений с помощью операции Replicator Get для некоторых ключей наблюдается разница между записями до и после перезапуска.
Конфигурации кластера
akka.cluster.sharding.remember-entities = on
akka.cluster.sharding.remember-entities-store = ddata
akka.cluster.sharding.distributed-data {
durable.keys = []
gossip-interval = 500 ms
notify-subscribers-interval = 100 ms
}
akka.remote.artery{
enabled = on
transport = tcp
}
Когда сущность создается, она сохраняется в ORSet внутри актера Replicator и реплицируется на другие узлы. Каждый осколок имеет 5 ключей, и идентификатор объекта хешируется и сохраняется в этих 5 ключах.
Мы можем получить текущие объекты памяти, хранящиеся в репликаторе, с помощью операции получения репликатора.
Кажется, все работает нормально, пока узлы не будут перезапущены.
Проблема здесь в том,
- Выполняем последовательный перезапуск всех 3 узлов.
- После перезапуска и присоединения к кластеру все шарды перебалансируются, а сущности воссоздаются корректно.
- Новые сущности постоянно создаются из другого прокси-узла в кластер.
- После накатки перезапуск через некоторое время минут через 5(
max-pruning-dissemination = 300 s
) Количество объектов в памяти неверно для некоторых клавиш. - В ходе дальнейшего расследования выяснилось, что при сокращении некоторые из вновь созданных объектов перезаписывают свои соответствующие ключи в ORSet.
Пример:
Узел 1 перезапущен 18:58
Узел 2 перезапущен 18:59
Узел 3 перезапущен 19:00
- В 19:06:xx — Количество живых актеров для Shard_2 — 25.
- В 19:06:xx — количество запоминаемых объектов для Shard_2 равно 25 (по 5 ключам).
- В 19:07:35 — создан Актер_23, принадлежащий Шарду_2.
- В 19:08:xx — Количество живых актеров в Shard_2 — 26.
- В 19:08:xx — количество запоминаемых объектов для Shard_2 равно 22 (по 5 ключам).
Здесь при создании Актера_23 он перезаписывает ключ Shard_2-1 с Shard_2-1[Actor_3,Actor_8,Actor_14,Actor_19] на Shard_2-1[Actor_23]
Подозреваемые
- Удаление ddata происходит только на узле 1. Обрезка данных шардов производится в 19:05:46.
- Перед обрезкой Shard_2 создается Actor_23. И после обрезки, выполненной в 19:05:46, для ключа присутствуют только новые значения актера. От Shard_2-1[Actor_3,Actor_8,Actor_14,Actor_19] к Shard_2-1[Actor_23]
- Однако эта проблема возникает только для некоторых ключей.
Что может быть причиной этой проблемы?
Версия Actor Cluster 2.5.32. Если какие-либо ошибки или проблемы в этой старой версии, пожалуйста, поделитесь ссылкой на ошибку, чтобы понять ее перед обновлением.
Существуют ли какие-либо настраиваемые свойства, которые можно настроить для решения этой проблемы?