Я исследовал проблему, связанную с тестом отработки отказа, когда в нем только два узла. Вот сценарий.
Тестовые шаги:
- У нас есть два узла кластера, давайте примем их как узел1 и узел2.
- Первоначально узел 1 запущен и работает, но узел2 не работает, и клиент подключен к узлу 1.
- Как только узел 2 полностью запущен, мы остановили узел 1.
- В этом случае клиент получил зависание и вышел из системы из системы.
Этапы расследования:
- При запуске узла 2, до того, как он полностью запустился (частично запустился), обнаружение узла было помечено как узел 2 как пункт назначения с ошибкой и помещено в объект кэша.
- Даже если узел node2 полностью запущен, он не удаляется из кэша.
- Когда узел 1 остановлен, он также помечается как пункт назначения с ошибкой. В этой ситуации оба узла, помеченные как сбойные данные обнаружения.
- Даже при втором проходе этот сбойный целевой кэш не очищается. Но когда я очищаю кеш, как показано ниже. Открытие было успешным.
if (discoveryConnections && ! ok) {
if (failedDestinations != null)
{
failedDestinations.clear();
}
Logs.INVOCATION.tracef("EJB discovery provider: all connections marked failed, retrying ...");
for (EJBClientConnection connection : configuredConnections) {
if (! connection.isForDiscovery()) {
continue;
}
URI destination = connection.getDestination();
Logs.INVOCATION.tracef("EJB discovery provider: attempting to connect to connection %s", destination);
discoveryAttempt.connectAndDiscover(destination, null);
}
}
Но для правильного переключения при сбое, когда узел запущен и работает, он должен быть очищен из объекта кэша JD-FB failddestination.
Это дает оба узла как сбойные и кэшированные, не очищается, когда серверы работают