Чрезвычайно медленная фиксация транзакции в многоузловом кластере Hazelcast

#transactions #hazelcast #distributed-transactions

Вопрос:

Мы испытываем чрезвычайно медленную фиксацию в hazelcast случайным образом с 2-узловым сервером hazelcast. У нас есть менеджер транзакций XA с базой данных и hazelcast, участвующий в одной транзакции, и мы заметили, что фиксация hazelcast происходит случайным образом, но часто занимает 5 секунд. Это происходит чаще при большой нагрузке, но может произойти и при низкой нагрузке.

Мы не можем воспроизвести проблему с одним узловым сервером hazelcast.

Похоже, копирование журнала транзакций между узлами hazelcast, когда требуется ДВУХФАЗНАЯ фиксация, может занять много времени … но 5 секунд кажутся действительно вечностью для этого.

Мы используем Hazelcast 4.2.2

наши настройки сервера hazelcast :

         properties.setProperty("hazelcast.event.thread.count", "48");
        properties.setProperty("hazelcast.query.predicate.parallel.evaluation", "true");
        properties.setProperty("hazelcast.operation.responsequeue.idlestrategy", "backoff");
        properties.setProperty("hazelcast.aggregation.accumulation.parallel.evaluation", "false");

        properties.setProperty("hazelcast.operation.thread.count", "48");
        properties.setProperty("hazelcast.operation.call.timeout.millis", "30000");
        properties.setProperty("hazelcast.slow.operation.detector.enabled", "true");
        properties.setProperty("hazelcast.slow.operation.detector.stacktrace.logging.enabled", "true");
        properties.setProperty("hazelcast.slow.operation.detector.log.purge.interval.seconds", "60000");
        properties.setProperty("hazelcast.slow.operation.detector.log.retention.seconds", "60000");
        properties.setProperty("hazelcast.slow.operation.detector.threshold.millis", "100");

        properties.setProperty("hazelcast.clientengine.thread.count", "48");
        properties.setProperty("hazelcast.clientengine.query.thread.count", "48");
     

        properties.setProperty("hazelcast.diagnostics.enabled", String.valueOf(performanceLogEnabled));
        properties.setProperty("hazelcast.diagnostics.metric.level", "info");
        properties.setProperty("hazelcast.diagnostics.invocation.sample.period.seconds", "30");
        properties.setProperty("hazelcast.diagnostics.pending.invocations.period.seconds", "30");
        properties.setProperty("hazelcast.diagnostics.slowoperations.period.seconds", "30");
        properties.setProperty("hazelcast.diagnostics.overloaded.connections.period.seconds", "30");
        properties.setProperty("hazelcast.diagnostics.max.rolled.file.size.mb", "100");
        properties.setProperty("hazelcast.diagnostics.max.rolled.file.count", "3");
        properties.setProperty("hazelcast.diagnostics.storeLatency.period.seconds", "60");
        properties.setProperty("hazelcast.diagnostics.directory", "./logs/diagnostics");
 

Ответ №1:

Моя гипотеза заключается в том, что из-за репликации с одного узла на другой, как при настройке с одним узлом, вы не замечаете эту проблему.

Для подтверждения вы можете проверить конфигурацию резервного копирования, особенно этот раздел. Установите количество резервных копий равным 0: если это устранит проблему, следующим шагом будет сделать резервное копирование асинхронным.

Обратите внимание, что в этом случае у вас будут проблемы с согласованностью в зависимости от того, на каком узле вы находитесь. Добро пожаловать в распределенные системы…

Комментарии:

1. да, но мы не можем позволить себе резервное копирование 0… кроме того, асинхронное резервное копирование не гарантирует согласованности, или я ошибаюсь? нам удается ускорить время фиксации, удалив настройки, оставив в основном настройки по умолчанию, но мы все еще изучаем, какие настройки вызывают проблему

2. К сожалению, эта проблема связана с распределенной системой: вам нужно установить курсор между полной скоростью, необоснованной согласованностью и гарантированной согласованностью, максимальной скоростью.