Кластер Apache Ignite с поведением обнаружения ZooKeeper в ситуации сегментации сети

Мы разрабатываем архитектуру распределенной системы на базе Apache Ignite. Система предъявляет строгие требования к отказоустойчивости.

Для этого у нас есть три центра обработки данных (DC): два из них - основные (DC1 и DC2), а один - резервный (DC3). У нас есть быстрый канал Ethernet между основными DC. DC1 и DC2 подключены через 40 GbE. Резервный DC3 подключен к DC1 и DC2 по медленным каналам 1 GbE.

Мы планируем использовать ZooKeeper Discovery для Ignite Cluster и хотим разместить узлы ZooKeeper Cluster на трех контроллерах домена: по 1 узлу на каждый контроллер домена.

Мы планируем размещать узлы Ignite Cluster только в основных DC (к DC1 и DC2). DC1 и DC2 будут иметь одинаковое количество узлов зажигания.

Схема архитектуры

Что происходит с Ignite Cluster, когда происходит сегментация сети, если канал 40GbE между основными DC1 и DC2 не работает?

Например, узел ZK3 в DC3 является лидером, ZK1 и ZK2 - последователями, в этой ситуации ведущий узел может связываться с обоими ведомыми, ведомые теряют связь друг с другом. ZooKeeper Cluster сохраняет в ансамбле.

Узлы Ignite Cluster из DC1 могут связываться с узлами ZK1 и ZK3, а также между собой в DC1. Узлы Ignite Cluster из DC2 могут связываться с узлами ZK2 и ZK3, а также между собой в DC2.

Как будет решена ситуация с разделением мозга в этом случае сегментации сети или мы получим два независимых кластера Ignite?

В документации https://apacheignite.readme.io/docs/zookeeper-discovery говорится:

Каждый раз, когда узел обнаруживает, что он не может подключиться к некоторым другим узлам в кластере, он инициирует процесс разрешения сбоя связи, публикуя специальные запросы в кластер ZooKeeper. Когда процесс запущен, все узлы пытаются подключиться друг к другу и отправляют результаты попыток подключения узлу, который координирует процесс (узел-координатор). На основе этой информации узел-координатор создает граф связности, который представляет сетевую ситуацию в кластере. Дальнейшие действия зависят от типа сегментации сети.

Может ли в этом случае координатор выбрать один из половины кластера Ignite в качестве основного?

2 ответа

Вы можете посмотреть раздел «Сегментация кластера ZooKeeper» https://apacheignite.readme.io/docs/zookeeper-discovery#section-failures-and-split-brain-handling .

Всего у вас есть 3 узла zknode, а для zookeeper требуется более половины узлов, что составляет 2 узла в вашем случае в сегментации, которая все еще работает, чтобы решить, какую сегментацию следует отключить. Из вашей текущей архитектуры у вас есть три сегментации и только по одному zknode в каждой. Таким образом, ни одна сегментация не содержит более половины узлов (2 узла в вашем случае), тогда результатом, как мне кажется, должно быть отключение всех трех узлов zknodes на вашей стороне, а затем все узлы ignite также отключаются из-за невозможности подключения к zknodes.

Независимо от поведения ZooKeeper, если DC1 и DC2 потеряют связь между собой, кластер не сможет нормально работать. ZooKeeper отвечает за DiscoverySpi, но не за CommunicationSpi, которая требует полного соединения между всеми узлами.

Таким образом, даже если SPI обнаружения удастся решить проблему потери связи, операции с кешем все равно не будут успешными.

Не рекомендуется включать узлы, которые имеют медленное соединение с остальной частью кластера, поскольку они замедлят все операции и сделают кластер нестабильным. В этом случае лучше создать два отдельных кластера и настроить репликацию между ними (например, GridGain предоставляет такую ​​возможность: https://www.gridgain.com/products/software/enterprise-edition/data-center-replication)

Вы также можете взглянуть на SegmentationResolver, если хотите реализовать защиту от потери связи между кластерами.

Другие вопросы по тегам