В случае проблем в сети (задержки, шторм) может возникнуть сплит. Сплит системы это ситуация, когда каждая из частей кластера (в случае, если кластер состоит из двух частей):

  • теряет связь с другой частью;
  • считает, что другая половина кластера не доступна;
  • начинает работать, как будто второй половины кластера нет.

В результате создается ситуация, когда каждая часть кластера работает самостоятельно друг от друга.

Сплит отличается от аварийного отключения части нод кластера тем, что при аварийном отключении аварийные ноды отключаются и не обслуживают нагрузку, которая полностью переводится на оставшиеся в работе ноды кластера, в то время как при сплите ноды считают себя активными и работоспособными, но «не видят» соседние кластера.

Виды сплитов

Виды сплитов системы:

  1. Полный сплит системы — сплит, при котором все ноды одной половины кластера перестают «видеть» спаренные ноды из другой половины кластера;
  2. Сплит определенных нод кластера — сплит, при котором только часть нод одной половины кластера перестает «видеть» спаренные ноды из другой половины кластера;
  3. Сплит данных — сплит, при котором только данные на одной половине кластера «разошлись» с данными из другой половины кластера. При этом ноды разных частей кластера «видят» друг друга.

Основной причиной сплита системы является некорректная работа сети передачи данных между элементами кластера, а также процессов на нодах, которая приводит к тому, что нода не успевает отрабатывать кластерный обмен за заданное время. Кластер поддерживается в консистентном состоянии за счет постоянного обмена пакетами информации между элементами кластера, при этом обмен является интенсивным и должен проходить за определенное время. Если возникают проблемы с доставкой пакетов, а также в случае неспособности ноды отправить ответные сообщения в рамках кластерного обмена — происходит сплит. Ноды считают, что их соседние ноды недоступны и каждая начинает работать самостоятельно друг от друга.

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

  • использование стекируемых коммутаторов (дублирование) для резервирования инфраструктуры сети передачи данных;
  • резервирование физических подключений к сети передачи данных — 2/3/4 и более физических подключений от сервера в стек коммутаторов;
  • объединение нескольких Ethernet-интерфейсов в один логический Bond-интерфейс, который с использованием протокола LACP позволяет штатно отрабатывать ситуации отключения части Ethernet-каналов;
  • повышение приоритетов процессам, обрабатывающим трафик синхронизации кластера.

Последствие сплита

Если в системе, где присутствует сплит, выполняются команды на изменение конфигурации или состояния элементов со стороны оператора или со стороны кластеров системы ECSS-10 (как правило адаптеров) — эта информация будет обработана и сохранена только на одной из нод, на которую эта команда поступила. Проблема заключается в том, что команды поступают в общую очередь команд, из которой ноды выполняют команды, поэтому часть изменений будет на одной ноде, часть на другой.

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

Диагностика сплита

Проявление сплита:

  1. В системе возникают следующие предупреждения:
    • Inconsistent database with node <NODE_NAME> — данное предупреждение генерируется в случае, если база данных mnesia перешла в неконсистентное состояние;
    • Node <NODE_NAME> of "<CLUSTER_NAME>" cluster is down — данное предупреждение генерируется в случае, если определенная нода пропала из кластера.
  2. Запрос списка нод в консоли управления выдает разные результаты от команды к команде;
  3. Команда на изменение конфигурации выполняется, но при просмотре настроек на разных нодах конфигурация отличается;
  4. Вызов на один и тот же номер может как проходить, так и не проходить без дополнительных внешних воздействий (предупреждение о недоступности нод должны присутствовать).

Пример:

Предупреждения во время сплита на сети:

-----------------------------------------------------------------------------------------------------------------------------------------
|     Date     |Severity|  Location     |Domain|     Cause     |     Class     |   Instance    |                Message                 |
|--------------+--------+---------------+------+---------------+---------------+---------------+----------------------------------------|
|02.09 08:52:59|major   |megaco1@ecss1  |      |outOfService   |ecss::oasys::mn|megaco1@ecss1  |Mnesia down on the node megaco1@ecss2.  |
|              |        |               |      |               |esia           |               |                                        |
|02.09 08:52:59|major   |ds@ecss1       |      |outOfService   |ecss::oasys::mn|ds@ecss1       |Mnesia down on the node ds@ecss2.       |
|              |        |               |      |               |esia           |               |                                        |
|02.09 08:52:59|major   |megaco1@ecss1  |      |outOfService   |ecss::cluster::|sip1@ecss2     |Node sip1@ecss2 of "sip1" cluster is dow|
|              |        |               |      |               |node           |               |n                                       |
|02.09 08:52:59|major   |ds@ecss1       |      |outOfService   |ecss::cluster::|ds@ecss2       |Node ds@ecss2 of "ds" cluster is down   |
|              |        |               |      |               |node           |               |                                        |
|02.09 08:53:00|major   |md1@ecss1      |      |outOfService   |ecss::cluster::|core1@ecss2    |Node core1@ecss2 of "core1" cluster is d|
|              |        |               |      |               |node           |               |own                                     |
|02.09 08:53:00|major   |sip1@ecss1     |      |outOfService   |ecss::cluster::|md1@ecss2      |Node md1@ecss2 of "md1" cluster is down |
|              |        |               |      |               |node           |               |                                        |
|02.09 08:53:06|major   |megaco1@ecss1  |      |outOfService   |ecss::cluster::|megaco1@ecss2  |Node megaco1@ecss2 of "megaco1" cluster |
|              |        |               |      |               |node           |               |is down                                 |
|02.09 08:53:06|major   |md1@ecss1      |      |outOfService   |ecss::cluster::|mycelium1@ecss2|Node mycelium1@ecss2 of "mycelium-myceli|
|              |        |               |      |               |node           |               |um12" cluster is down                   |
|02.09 08:54:06|critical|md1@ecss1      |      |outOfService   |ecss::oasys::mn|md1@ecss1      |Inconsistent database with node md1@ecss|
|              |        |               |      |               |esia           |               |2.                                      |
-----------------------------------------------------------------------------------------------------------------------------------------
CODE

1. Проверка на наличие сплита

Необходимо убедиться, что это действительно сплит. Для этого нужно подключиться к командной консоли CLI и выполнить команду /node/nodes-info nodes:

В приведенных ниже таблицах отображается полная информация о состоянии нод:

  • Node — количество нод, запущенных в системе;

  • Erlang — «видят» ли ноды кластера друг друга;

  • Mnesia — есть ли сплит базы данных.

Отсутствие сплита

В этом примере сплита нет. Все ноды «видят» друг друга, cплита БД нет:

node/nodes-info 
┌───────────────┬───────────────────────────────┬─────────────────────┐
│     Node      │            Erlang             │       Mnesia        │
├───────────────┼───────────────────────────────┼─────────────────────┤
│core1@ecss1    │core1@ecss1,core1@ecss2        │not running          │
│core1@ecss2    │core1@ecss1,core1@ecss2        │not running          │
│ds1@ecss1      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │
│ds1@ecss2      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │
│md1@ecss1      │md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │
│md1@ecss2      │md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │
│mycelium1@ecss1│mycelium1@ecss1,mycelium1@ecss2│not running          │
│mycelium1@ecss2│mycelium1@ecss1,mycelium1@ecss2│not running          │
│sip1@ecss1     │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│
│sip1@ecss2     │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│
└───────────────┴───────────────────────────────┴─────────────────────┘
CODE

mycelium и core не хранит в БД никакой информации, поэтому их статус — «not running».

Наличие сплита

node/nodes-info 
┌───────────────┬───────────────────────────────┬─────────────────────┐
│     Node      │            Erlang             │       Mnesia        │
├───────────────┼───────────────────────────────┼─────────────────────┤
│core1@ecss1    │core1@ecss1                    │not running          │
│ds1@ecss1      │ds1@ecss1                      │ds1@ecss1            │
│ds1@ecss2      │ds1@ecss2                      │ds1@ecss2            │
│md1@ecss1      │md1@ecss1                      │md1@ecss1            │
│mycelium1@ecss1│mycelium1@ecss1,mycelium1@ecss2│not running          │
│sip1@ecss1     │sip1@ecss1,sip1@ecss2          │sip1@ecss1           │
└───────────────┴───────────────────────────────┴─────────────────────┘
CODE

Все ноды, кроме mycelium1, находятся в сплите и «не видят» соседних нод.

2. Перезапуск нод

При наличии сплита нужно перезапустить ноды.

Для того чтобы перезапустить ноды необходимо в командной консоли CLI выполнить команду sudo systemctl restart <RELEASE_NAME> для каждой ноды, где <RELEASE_NAME> — имя останавливаемой подсистемы.

Пример перезапуска подсистемы mycelium:

sudo systemctl restart ecss-mycelium.service
CODE

Для упрощения этого процесса можно перезапустить все подсистемы одной командой sudo systemctl restart ecss.service.

Необходимо убедится, что сплит отсутствует. Для этого нужно подключиться к командной консоли CLI и выполнить команду /node/nodes-info nodes.