Описание и использование команды
Команда доступна с установкой пакета ecss-utils 14.15.7.24 и выше
В момент выполнения процедур техобслуживания, в частности выполнения обновления программного обеспечения, необходимо выключить автоматическое выполнение команды ecss-detect-split. Для этого выполнить:
на ecss1
По окончанию процедуры техобслуживания включить автоматическое выполнение команды ecss-detect-split. Для этого выполнить :
на ecss1
sudo systemctl start ecss-detect-split.timer
Данная команда входит в пакет ecss-utils (устанавливается вместе с пакетом ecss-node).
Данная команда позволяет обнаружить проблемы с кластером (сплит кластера) и исправить их, если таковые имеются.
Команда может выполниться в ручном режиме (выполняться однократно), а для постоянного мониторинга состояния кластера нужен запуск команды по таймеру (используя systemd).
Команда при обнаружении сплита запускает из-под себя другую команду (ecss-restart-nodes) для перезапуска всех нод на соседнем хосте.
Использование команды ecss-detect-split не требует аргументов.
Команда работает следующим образом:
- Сначала проверяем доступ к CoCon обоих хостов
Далее проверяем сервисы нод через CoCon-команду node/check-services:
- если результаты node/check-services совпадают и команда выдает All services are started, то на данном этапе сплита нет, продолжаем проверку дальше
- если результаты node/check-services совпадают, но команда выдает Not started services, то возможно сплит, выполняем попытку устранения сплита
- если результаты node/check-services не совпадают, то возможно сплит, выполняем попытку устранения сплита
Затем проверяем состояние erlang и mnesia нод через CoCon-команды node/nodes-info и system-status:
- если результаты node/nodes-info совпадают и system-status не имеет предупреждения "!!!", то сплита нет и проверка закончена
- если результаты node/nodes-info совпадают, но system-status имеет предупреждения "!!!", то возможно сплит, выполняем попытку устранения сплита
- если результаты node/nodes-info не совпадают, то возможно сплит, выполняем попытку устранения сплита
Проверяемые сервисы:
- 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 понадобится конфигурирование следующих параметров:
HOSTS_USERNAMES - соответствие имени каждого хоста кластера к имени его пользователя (через пробел)
- COCON_USERNAMES - соответствие имени каждого хоста кластера к имени его пользователя для входа в CoCon (через пробел)
COCON_PORTS - соответствие имени каждого хоста кластера к номеру его порта для входа в CoCon (через пробел)
WAIT_STARTUP_TIMEOUT - время на поднятие нод после рестарта в секундах (обычно хватает 60 секунд, но может понадобится больше)
Предварительная настройка перед использованием
Для управления нодами через CoCon необходимо:
- Убедиться, что хосты и CoCon находятся в ~/.ssh/known_hosts обоих хостов
- При помощи ssh-keygen cформировать ключ, для каждого хоста (будет создан приватный и публичный ключи в ~/.ssh/) (обычно это уже сделано в момент установки кластера)
- При помощи ssh-copy-id скопировать публичный ключ на соседний хост (обычно это уже сделано в момент установки кластера)
- Установить в CoCon каждого хоста публичные ключи обоих хостов, используя команду shell-options public-key add <публичный_ключ> (публичный_ключ нужно взять из ~/.ssh/id_rsa.pub)
Выполнение команды по 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, где:
- "*" - это поле дня недели, месяца и часа. "*" означает, что все значения подходят, т.е. не ограничиваемся конкретным днем недели, месяцем, днем месяца или часом
- 0/10 - это формат времени, который означает "каждые 10 минут, начиная с 0", т.е. на каждой десятой минуте, начиная с нулевой, скрипт будет отрабатывать (например, в 00:00, 00:10, 00:20 и т.д.)
Нужно указать пользователя (параметр 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):
- ecss1 - Мастер:
- username: ecss
- cocon username: admin
- cocon port: 8023
- ecss2 - Ведомый:
- username: ecss
- cocon username: admin
- cocon port: 8023
Пример конфигурации:
# Конфигурация используется для 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"
Затем нужно создать пару ключей на каждом хосте кластера и скопировать их на все хосты кластера (обычно это уже сделано в момент установки кластера):
- На ecss1 выполнить:
- ssh-keygen
- ssh-copy-id ecss@ecss2
- В CoCon выполнить копирование ключа из ~/.ssh/id_rsa.pub обоих хостов:
- shell-options public-key add ssh-rsa AAAAB3NzaC1yc2...wdmD ecss@ecss1
- shell-options public-key add ssh-rsa AAAAB3NzaC1yc2...wewLP ecss@ecss2
- На ecss2 выполнить:
- ssh-keygen
- ssh-copy-id ecss@ecss1
- В CoCon выполнить копирование ключа из ~/.ssh/id_rsa.pub обоих хостов:
- shell-options public-key add ssh-rsa AAAAB3NzaC1yc2...wdmD ecss@ecss1
- shell-options public-key add ssh-rsa AAAAB3NzaC1yc2...wewLP ecss@ecss2
На этом настройка закончена. При выполнении команды не будет запрашиваться пароль для подключения к соседнему хосту и CoCon.
Выполнить проверку подключения по ssh и в CoCon следующими командами, все команды должны выполняться без запроса пароля:
- На ecss1 выполнить:
- ssh ecss@ecss2
- ssh admin@ecss1 -p 8023
- ssh admin@ecss2 -p 8023
- ssh ecss@ecss2
- На ecss2 выполнить:
- ssh ecss@ecss1
- ssh admin@ecss2 -p 8023
- ssh admin@ecss1 -p 8023
Пример выполнения команды, подключения к хосту "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 │ └─────────────┴───────────┴─────────────┴───────────┴───────────┘
Пример лога выполнения команды при обнаружении сплита кластера