Описание и использование команды

Команда доступна с установкой пакета ecss-utils 14.15.7.24 и выше


В момент выполнения процедур техобслуживания, в частности выполнения обновления программного обеспечения, необходимо выключить автоматическое выполнение команды ecss-detect-split. Для этого выполнить: 

sudo systemctl stop ecss-detect-split.timer


По окончанию процедуры техобслуживания включить автоматическое выполнение команды ecss-detect-split. Для этого выполнить :

sudo systemctl start ecss-detect-split.timer



Данная команда входит в пакет ecss-utils (устанавливается вместе с пакетом ecss-node).

Данная команда позволяет обнаружить проблемы с кластером (сплит кластера) и исправить их, если таковые имеются.

Команда может выполниться в ручном режиме (выполняться однократно), а для постоянного мониторинга состояния кластера нужен запуск команды по таймеру (используя systemd).

Команда при обнаружении сплита запускает из-под себя другую команду (ecss-restart-nodes) для перезапуска всех нод на соседнем хосте. 

Использование команды ecss-detect-split не требует аргументов.

Команда работает следующим образом:

  1. Сначала проверяем доступ к CoCon обоих хостов
  2.  Далее проверяем сервисы нод через CoCon-команду node/check-services:

  3. Затем проверяем состояние erlang и mnesia нод через CoCon-команды node/nodes-info и system-status:


  • mycelium
  • mediator
  • ds
  • core
  • pa-sip


  • ecss-mycelium.service
  • ecss-mediator.service
  • ecss-ds.service
  • ecss-core.service
  • ecss-pa-sip.service

Конфигурация

Перед началом работы с командой необходимо настроить следующий конфигурационный файл (является общим для ecss-detect-split и ecss-restart-nodes):

# Конфигурация используется для ecss-restart-nodes и ecss-detect-split
  
# Список имен пользователей узлов кластера (hostname=username)
HOSTS_USERNAMES="ecss1=ecss ecss2=ecss"
  
# Список имен пользователей для подключения к CoCon (hostname=cocon_username)
COCON_USERNAMES="ecss1=admin ecss2=admin"
  
# Список портов для подключения к CoCon (hostname=cocon_port)
COCON_PORTS="ecss1=8023 ecss2=8023"
  
# Таймаут для того, чтобы ноды и сервисы успели подняться (в секундах)
# Значение по умолчанию - 60 секунд
WAIT_STARTUP_TIMEOUT="60"

Для работы ecss-detect-split понадобится конфигурирование следующих параметров:

Предварительная настройка перед использованием

Для управления нодами через CoCon необходимо:

Выполнение команды по systemd таймеру

Изначально таймер настроен на периодичность в 10 минут и выключен.

Для того, чтобы поменять периодичность, потребуется изменить значение OnCalendar=*:0/10 в  следующем файле:

[Timer]
OnCalendar=*:0/10
 
[Unit]
Description=Check for cluster split detection every 10 minutes
 
[Install]
WantedBy=timers.target

Есть возможность внести изменения в секции Timer для параметра OnCalendar, где:

Нужно указать пользователя (параметр User) и группу (параметр Group), от которых будет выполняться скрипт в следующем конфигурационном файле фоновой службы скрипта:

[Unit]
Description=Background task for cluster split detection
 
[Service]
User=ecss
Group=ssw
Type=oneshot
CPUQuota=10%
MemoryLimit=50M
Nice=15
Environment="TERM=xterm"
EnvironmentFile=/etc/ecss/ecss-nodes.conf
AmbientCapabilities=CAP_NET_RAW
ProtectSystem=strict
ProtectHome=false
PrivateTmp=true
NoNewPrivileges=true
ExecStart=/usr/bin/ecss-detect-split
StandardOutput=journal
StandardError=journal
 
[Install]
WantedBy=multi-user.target


После того, как всё настроено, нужно запустить таймер следующей командой ТОЛЬКО НА ECSS1:

sudo systemctl daemon-reload && sudo systemctl enable --now ecss-detect-split.timer

Данную команду ни в коем случае не выполнять на ECSS2.


Пример полной настройки

Имеется кластер из двух хостов (скрипт запускаем на ecss1, при обнаружении сплита перезапускаем все сервисы ecss2):

Пример конфигурации:

# Конфигурация используется для ecss-restart-nodes и ecss-detect-split
  
# Список имен пользователей узлов кластера (hostname=username)
HOSTS_USERNAMES="ecss1=ecss ecss2=ecss"
  
# Список имен пользователей для подключения к CoCon (hostname=cocon_username)
COCON_USERNAMES="ecss1=admin ecss2=admin"
  
# Список портов для подключения к CoCon (hostname=cocon_port)
COCON_PORTS="ecss1=8023 ecss2=8023"
  
# Таймаут для того, чтобы ноды и сервисы успели подняться (в секундах)
# Значение по умолчанию - 60 секунд
WAIT_STARTUP_TIMEOUT="60"

Затем нужно создать пару ключей на каждом хосте кластера и скопировать их на все хосты кластера (обычно это уже сделано в момент установки кластера):

На этом настройка закончена. При выполнении команды не будет запрашиваться пароль для подключения к соседнему хосту и CoCon.

Выполнить проверку подключения по ssh и в CoCon следующими командами, все команды должны выполняться без запроса пароля:

Пример выполнения команды, подключения к хосту "ecss2":

ecss@ecss1:~$ ssh ecss@ecss2
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-213-generic x86_64)

. . .

Last login: Mon Dec 16 17:18:24 2024 from 10.0.20.35

Пример выполнения команды, подключения к CoCon "ecss1":

ecss@ecss1:~$ ssh admin@ecss1 -p8023
Checking...
┌─┬───────────────┬──────────────────────────┬───────────────────────────────┬─────────────────────┬──────┐
│ │     Node      │         Release          │         Erlang nodes          │    Mnesia nodes     │Uptime│
├─┼───────────────┼──────────────────────────┼───────────────────────────────┼─────────────────────┼──────┤
│ │core1@ecss1    │ecss-core-3.14.15.1240    │core1@ecss1,core1@ecss2        │not running          │16h 4m│
│ │core1@ecss2    │ecss-core-3.14.15.1240    │core1@ecss1,core1@ecss2        │not running          │16h 4m│
│ │ds1@ecss1      │ecss-ds-3.14.15.1240      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │16h 4m│
│ │ds1@ecss2      │ecss-ds-3.14.15.1240      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │16h 4m│
│ │md1@ecss1      │ecss-mediator-3.14.15.1240│md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │16h 4m│
│ │md1@ecss2      │ecss-mediator-3.14.15.1240│md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │16h 4m│
│ │mycelium1@ecss1│ecss-mycelium-3.14.15.1240│mycelium1@ecss1,mycelium1@ecss2│not running          │16h 4m│
│ │mycelium1@ecss2│ecss-mycelium-3.14.15.1240│mycelium1@ecss1,mycelium1@ecss2│not running          │16h 4m│
│ │sip1@ecss1     │ecss-pa-sip-3.14.15.1240  │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│16h 4m│
│ │sip1@ecss2     │ecss-pa-sip-3.14.15.1240  │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│16h 4m│
└─┴───────────────┴──────────────────────────┴───────────────────────────────┴─────────────────────┴──────┘

All services are started.

  Active media resource selected list specific:
┌─────────────┬───────────┬─────────────┬───────────┬───────────┐
│    Node     │    MSR    │     MSR     │ Cc-status │ Cc-uptime │
│             │           │   version   │           │           │
├─────────────┼───────────┼─────────────┼───────────┼───────────┤
│ core1@ecss1 │ msr.ecss1 │ 3.14.15.243 │ connected │ 16:03:53  │
│             │ msr.ecss2 │ 3.14.15.243 │ connected │ 16:03:52  │
│ core1@ecss2 │ msr.ecss1 │ 3.14.15.243 │ connected │ 16:03:52  │
│             │ msr.ecss2 │ 3.14.15.243 │ connected │ 16:03:55  │
└─────────────┴───────────┴─────────────┴───────────┴───────────┘


Пример лога выполнения команды при обнаружении сплита кластера



ecss@ecss1:~/$ ecss-detect-split
Checking SSH connection to CoCon...
SSH connection to CoCon on the ecss1 successfully!
SSH connection to CoCon on the ecss2 successfully!
 
Executing node/check-services on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/check-services on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/check-services on all hosts are THE SAME!
 
Executing node/nodes-info on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬───────────┐
│      Node      │             Erlang             │  Mnesia   │
├────────────────┼────────────────────────────────┼───────────┤
│core1@ecss1     │core1@ecss1,core1@ecss2         │not running│
│core1@ecss2     │core1@ecss1,core1@ecss2         │not running│
│ds1@ecss1       │ds1@ecss1                       │ds1@ecss1  │
│ds1@ecss2       │ds1@ecss2                       │ds1@ecss2  │
│md1@ecss1       │md1@ecss1,md1@ecss2             │md1@ecss1  │
│md1@ecss2       │md1@ecss1,md1@ecss2             │md1@ecss2  │
│mycelium1@ecss1 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│mycelium1@ecss2 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│sip1@ecss1      │sip1@ecss1                      │sip1@ecss1 │
└────────────────┴────────────────────────────────┴───────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/nodes-info on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬───────────┐
│      Node      │             Erlang             │  Mnesia   │
├────────────────┼────────────────────────────────┼───────────┤
│core1@ecss1     │core1@ecss1,core1@ecss2         │not running│
│core1@ecss2     │core1@ecss1,core1@ecss2         │not running│
│ds1@ecss1       │ds1@ecss1                       │ds1@ecss1  │
│ds1@ecss2       │ds1@ecss2                       │ds1@ecss2  │
│md1@ecss1       │md1@ecss1,md1@ecss2             │md1@ecss1  │
│md1@ecss2       │md1@ecss1,md1@ecss2             │md1@ecss2  │
│mycelium1@ecss1 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│mycelium1@ecss2 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│sip1@ecss1      │sip1@ecss1                      │sip1@ecss1 │
└────────────────┴────────────────────────────────┴───────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/nodes-info on all hosts are THE SAME, but the system HAS "!!!" WARNING! Maybe the cluster HAS SPLIT!
A cluster split warning has been written to the system log!
 
ecss-mycelium node on the host ecss2 will be restarted using the ecss-restart-nodes!
 
Restarting the following nodes in order on the ecss2 host(s): ecss-mycelium
 
Host ecss2 is remote:
Restarting ecss-mycelium on the host ecss2...
 
Waiting 60 seconds for the nodes to start up...
 
Re-running ecss-detect-split...
 
Checking SSH connection to CoCon...
SSH connection to CoCon on the ecss1 successfully!
SSH connection to CoCon on the ecss2 successfully!
 
Executing node/check-services on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1      sip1@ecss2
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/check-services on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1      sip1@ecss2
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/check-services on all hosts are THE SAME!
 
Executing node/nodes-info on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬───────────┐
│      Node      │             Erlang             │  Mnesia   │
├────────────────┼────────────────────────────────┼───────────┤
│core1@ecss1     │core1@ecss1,core1@ecss2         │not running│
│core1@ecss2     │core1@ecss1,core1@ecss2         │not running│
│ds1@ecss1       │ds1@ecss1                       │ds1@ecss1  │
│ds1@ecss2       │ds1@ecss2                       │ds1@ecss2  │
│md1@ecss1       │md1@ecss1,md1@ecss2             │md1@ecss1  │
│md1@ecss2       │md1@ecss1,md1@ecss2             │md1@ecss2  │
│mycelium1@ecss1 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│mycelium1@ecss2 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│sip1@ecss1      │sip1@ecss1                      │sip1@ecss1 │
│sip1@ecss2      │sip1@ecss2                      │sip1@ecss2 │
└────────────────┴────────────────────────────────┴───────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/nodes-info on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬───────────┐
│      Node      │             Erlang             │  Mnesia   │
├────────────────┼────────────────────────────────┼───────────┤
│core1@ecss1     │core1@ecss1,core1@ecss2         │not running│
│core1@ecss2     │core1@ecss1,core1@ecss2         │not running│
│ds1@ecss1       │ds1@ecss1                       │ds1@ecss1  │
│ds1@ecss2       │ds1@ecss2                       │ds1@ecss2  │
│md1@ecss1       │md1@ecss1,md1@ecss2             │md1@ecss1  │
│md1@ecss2       │md1@ecss1,md1@ecss2             │md1@ecss2  │
│mycelium1@ecss1 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│mycelium1@ecss2 │mycelium1@ecss1,mycelium1@ecss2 │not running│
│sip1@ecss1      │sip1@ecss1                      │sip1@ecss1 │
│sip1@ecss2      │sip1@ecss2                      │sip1@ecss2 │
└────────────────┴────────────────────────────────┴───────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/nodes-info on all hosts are THE SAME, but the system HAS "!!!" WARNING! Maybe the cluster HAS SPLIT!
A cluster split warning has been written to the system log!
 
Restarting the ecss-mycelium node on the host ecss2 didn't help eliminate the split!
 
All nodes on the host ecss2 will be restarted using the ecss-restart-nodes!
 
Restarting the following nodes in order on the ecss2 host(s): ecss-mycelium ecss-ds ecss-core ecss-mediator ecss-pa-sip
 
Host ecss2 is remote:
Restarting ecss-mycelium on the host ecss2...
Restarting ecss-ds on the host ecss2...
Restarting ecss-core on the host ecss2...
Restarting ecss-mediator on the host ecss2...
Restarting ecss-pa-sip on the host ecss2...
 
Waiting 60 seconds for the nodes to start up...
 
Re-running ecss-detect-split...
 
Checking SSH connection to CoCon...
SSH connection to CoCon on the ecss1 successfully!
SSH connection to CoCon on the ecss2 successfully!
 
Executing node/check-services on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1      sip1@ecss2
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/check-services on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nodes:
    core1@ecss1     core1@ecss2
      ds1@ecss1       ds1@ecss2
      md1@ecss1       md1@ecss2
mycelium1@ecss1 mycelium1@ecss2
     sip1@ecss1      sip1@ecss2
 
All services are started
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/check-services on all hosts are THE SAME!
 
Executing node/nodes-info on host ecss1...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬──────────────────────┐
│      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 │
└────────────────┴────────────────────────────────┴──────────────────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Executing node/nodes-info on host ecss2...
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
┌────────────────┬────────────────────────────────┬──────────────────────┐
│      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 │
└────────────────┴────────────────────────────────┴──────────────────────┘
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
The result of executing node/nodes-info on all hosts are THE SAME!
 
All services and nodes in the cluster work correctly!