Какой алгоритм использует hazelcast для поиска главного узла
Я исследую алгоритм, который использует hazelcast для поиска главного узла многоадресным способом. Сначала я нахожу функцию для поиска главного узла: com.hazelcast.cluster.MulticastJoiner.findMasterWithMulticast()
private Address findMasterWithMulticast() {
try {
if (logger.isFinestEnabled()) {
logger.finest("Searching for master node. Max tries: " + maxTryCount.get());
}
JoinRequest joinRequest = node.createJoinRequest();
while (node.isActive() && currentTryCount.incrementAndGet() <= maxTryCount.get()) {
joinRequest.setTryCount(currentTryCount.get());
node.multicastService.send(joinRequest);
if (node.getMasterAddress() == null) {
//noinspection BusyWait
Thread.sleep(PUBLISH_INTERVAL);
} else {
return node.getMasterAddress();
}
}
} catch (final Exception e) {
if (logger != null) {
logger.warning(e);
}
} finally {
currentTryCount.set(0);
}
return null;
}
функция просто отправляет joinRequest другим узлам в тех же кластерах. Функция com.hazelcast.cluster.MulticastJoiner.onReceivedJoinRequest(JoinRequest) имеет дело с joinRequest.
public void onReceivedJoinRequest(JoinRequest joinRequest) {
if (joinRequest.getUuid().compareTo(node.localMember.getUuid()) < 0) {
maxTryCount.incrementAndGet();
}
}
Это только увеличивает количество попыток. Что это значит? Как выбран мастер-узел? Пожелайте вашей помощи.
2 ответа
При многоадресном обнаружении каждый узел вычисляет свой собственный maxTryCount
до начала процесса присоединения. maxTryCount
максимальное количество сообщений присоединения, которые будут опубликованы этим конкретным узлом, прежде чем объявить себя главным.
Он рассчитывается с использованием нескольких параметров, таких как время ожидания многоадресной рассылки, IP-адрес и порт узла и т. Д. MulticastJoiner.calculateTryCount()
, Итак, главная цель здесь - каждый узел (скорее всего) будет иметь различное максимальное число попыток.
Кроме того, когда узел получает запрос на соединение, maxTryCount
увеличивается на 1
если чистая функция определена внутри MulticastJoiner.onReceivedJoinRequest()
возвращается true
:
joinRequest.getUuid().compareTo(node.localMember.getUuid()) < 0
Это расходиться maxTryCount
номер с обеих сторон.
Как только узел публикует maxTryCount
присоединяются к сообщениям, затем он объявляет себя как master (самый старый участник) и начинает принимать / отвечать на запросы присоединения.
Одной из главных особенностей Hazelcast является то, что он не имеет мастер-члена. Каждый элемент кластера настроен одинаково с точки зрения функциональности. Самый старый член (первый член, созданный в кластере) автоматически выполняет назначение данных членам кластера.
Когда вы запускаете участника, в нем создается таблица разделов. В этой таблице хранятся идентификаторы разделов и членов кластера, к которым они принадлежат. Цель этой таблицы - сделать так, чтобы все члены (включая облегченные члены) в кластере знали об этой информации, чтобы каждый участник знал, где находятся данные.
Самый старый элемент в кластере (тот, который был запущен первым) периодически отправляет таблицу разделов всем участникам. Таким образом, каждый член кластера получает информацию о любых изменениях в разделе владельца. Владельцы могут быть изменены, когда, например, новый участник присоединяется к кластеру или когда участник покидает кластер.
ПРИМЕЧАНИЕ. Если самый старый элемент кластера выходит из строя, следующий самый старый элемент отправляет информацию таблицы разделов другим.
Спасибо