Apache Ignite Cluster с поведением обнаружения ZooKeeper в ситуации сегментации сети - PullRequest
0 голосов
/ 08 октября 2019

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

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

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

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

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

Что происходит с кластером зажигания, когда происходит сегментация сети, если канал 40GbE между основными DC DC и DCDC2 будет недоступен?

Например, узел 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#section-failures-and-split-brain-handling сообщает:

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

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

1 Ответ

0 голосов
/ 09 октября 2019

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

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

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

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

...