# Установка KUMA с отказоустойчивым ядром - RAFT

<p class="callout info">Информация, приведенная на данной странице, является разработкой команды pre-sales и/или community KUMA и **НЕ** является официальной рекомендацией вендора. Официальная документация по данному разделу приведена в [Онлайн-справке](https://support.kaspersky.ru/help/KUMA/4.0/ru-RU/303366.htm) на продукт.</p>

Кластер RAFT **поддерживается в KUMA с версии 4.0** и позволяет обеспечить доступность компонентов ядра KUMA, в случае сбоя работы одного из компонентов. Допустимо развертывать только нечетное количество сервисов Ядра KUMA.

**Схема ядра в RAFT (хранилище представлено с двумя репликами, т.е. с копией данных)**

[![Схема сетевого взаимодействия KUMA 4 Raft+.drawio.png](https://kb.kuma-community.ru/uploads/images/gallery/2026-03/scaled-1680-/sxema-setevogo-vzaimodeistviia-kuma-4-raft-drawio.png)](https://kb.kuma-community.ru/uploads/images/gallery/2026-03/sxema-setevogo-vzaimodeistviia-kuma-4-raft-drawio.png)

#### Теория

В кластере Raft каждый из серверов в каждый момент времени находится в одном из трёх состояний:

- Leader (лидер) – обрабатывает все клиентские запросы, является source of truth всех данных в логе, поддерживает лог фоловеров.
- Follower (фоловер) – пассивный сервер, который только «слушает» новые записи в лог от лидера и редиректит все входящие запросы от клиентов на лидера. По сути, является hot-standby репликой лидера.
- Candidate (кандидат) – специальное состояние сервера, возможное только во время выбора нового лидера.

Во время нормальной работы в кластере только один сервер является лидером, все остальные – его фоловеры. Например, в случае 3 компонентов ядра из строя может выйти толкьо 1 компонент, для иного количества компонентов - пока работает формула **(n+1)/2**. Полезная ссылка для понимания механизма работы: [https://thesecretlivesofdata.com/raft/](https://thesecretlivesofdata.com/raft/)

Сетевые задержки не должны превышать 150 мс.

#### Расширение ядра до кластера в Raft

<p class="callout success">Сценарии установки с установкой Ядра в кластере Raft смотреть можно [тут](https://support.kaspersky.ru/help/KUMA/4.0/ru-RU/303370.htm)</p>

Данный сценарий реализуется, если KUMA находится в инсталяции, где одно ядро (standalone). Для этого необходимо [подготовить](https://support.kaspersky.com/help/KUMA/3.4/ru-RU/231034.htm) дополнительные целевые машины для установки сервисов, а также на контрольной машинке настроить обмен SSH [ключами](https://support.kaspersky.ru/help/KUMA/4.0/ru-RU/222083.htm). После создать копию файла на контрольной машине (с которой предполагается развертывание) **expand.inventory.yml.template** из распакованного архива KUMA

```bash
cp expand.inventory.yml.template expand.inventory.yml
```

Далее отредактировать файл **expand.inventory.yml** (разворачиваем дополнительные ядра 2 и 3):

![конфигурациоонный файл.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/scaled-1680-/konfiguracioonnyi-fail.png)

В хостах указываем FQDN и проверяем их доступность с контрольной машины, а также на всех компонентах ядра должно быть единое время, настройте на всех машинах NTP.

Далее на контрольной машине с доступом root из папки с распакованным установщиком (скриншот выше) выполните следующую команду для начала установки:

```bash
./expand.sh expand.inventory.yml
```

В результате выполнения команды на каждой целевой машине, указанной в файле инвентаря expand.inventory.yml, появятся файлы для создания и установки дополнительных сервисов Ядра KUMA, для этого проверьте **наличие директории /opt/kaspersky/kuma/kuma**

В разделе **<span class="guicharacter">Ресурсы</span> → <span class="guicharacter">Активные сервисы</span>** нажмите **<span class="guicharacter">Добавить</span>** и в раскрывающемся списке выберите **<span class="guicharacter">Добавить сервис Ядро</span>.**

##### ![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/scaled-1680-/u8Yimage.png)

В открывшемся окне Добавить сервис Ядро укажите имя сервиса в поле Имя сервиса Ядро и нажмите Добавить. Добавленный сервис появится в списке Сервисы.

##### ![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/scaled-1680-/KM2image.png)

Установите флажок рядом с добавленным сервисом Ядра KUMA и на панели инструментов нажмите ![more_vertical](https://support.kaspersky.ru/help/KUMA/4.0/ru-RU/more_vertical.png), в открывшемся меню нажмите Копировать идентификатор. Идентификатор сервиса Ядра KUMA понадобится для установки сервиса на сервере.

Далее на целевой машине необходимо установить службу специальным образом:

```bash
sudo /opt/kaspersky/kuma/kuma core --raft.join <FQDN хоста из секции kuma_core, где запущен первый сервис Ядра KUMA>:7210 --id <идентификатор сервиса Ядра KUMA, скопированный в веб-интерфейсе> --install
```

Повторите создание клиентской и серверной части сервиса Ядра KUMA для каждого хоста из группы kuma\_core\_peers.

<p class="callout warning">На каждом хосте может быть установлен только один сервис Ядра KUMA.</p>

После успешной установки в веб-интерфейсе KUMA, вы увидеть статус сервисов **Вкл**

##### [![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/scaled-1680-/1gsimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/1gsimage.png)

Если ведущий узел выходит из строя, сервер будет следовать за новым ведущим, обеспечивая непрерывный доступ к интерфейсу SIEM или API.

<p class="callout info">Журналы Ядра KUMA хранятся в директории /opt/kaspersky/kuma/core/&lt;`идентификатор сервиса Ядра KUMA`&gt;/log/core.</p>

#### Установка балансировщика - nginx

Установим балансировщик нагрузки nginx для удобства работы с кластером Raft, а именно обращение по единому hostname / IP-адресу.

<p class="callout info">Когда одна из нод кластера отказывает, балансировщик перенаправляет запросы на активные ноды </p>

Для установки балансировщика поднимем отдельный сервер и на него установим **nginx,** далее необходимо отредактировать файл `/etc/nginx/nginx.conf` и добавить конфиг в конец файла

```json
stream {
    upstream raft_backend {
        server kuma-test.local:7220 max_fails=1 fail_timeout=5s;
        server kuma-core-2.local:7220 backup;
        server kuma-core-3.local:7220 backup;
    }

    server {
        listen 443;
        proxy_pass raft_backend;
        ssl_preread on;
    }
}
```

Далее перезапустить сервис `systemctl restart nginx.service`

Для проверки работоспособности отключаем сервис ядра на **kuma-test**  командой `systemctl stop kuma-core-<идентификатор-ядра>.service.` В браузере вводим `https://<ip-балансировщика>`, появится форма входа в интерфейс.

Далее нужно перейти в "**Ресурсы**" -&gt; "**Активные сервисы".** Увидим, что сервис ядра отключен, но независимые компоненты имеют Статус: **"Вкл"**

##### [![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/scaled-1680-/IMRimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-08/IMRimage.png)

Не забудьте запустить службу отключенного компонента, ядра `systemctl start kuma-core-<идентификатор-ядра>.service`

В данном случае в кластере всего три ноды, и больше одного выведенного из строя компонента ядра нельзя себе позволить, поскольку с менее чем 2 рабочими нодами теряется доступ к системе и перестает работать кластер

<p class="callout danger">В основу алгоритма Raft заложено понятие кворум - минимальное количество нод, необходимое для принятия решений, или большинство. При большинстве рабочих нод в кластере можно проводить голосование, выбирать лидера и принимать изменения</p>

В нашем случае, если останется 1 живая нода - не сработает. Нода не образует кворум, а если захочет стать лидером, это никто не подтвердит.

##### Возможные ошибки кластера ядра:

Если вы столкнулись с ошибками после установки балансировщика, примеры:

```
request dropped as the cluster is not ready
failed to lookup: can't serve requests, not enough healthy nodes
```

Убедитесь, что у вас достаточное количество рабочих нод в кластере для его работы.

#### Альтернатива балансировщику - установка keepalived<span lang="en-us" style="font-size: 12pt; line-height: 107%; font-family: 'Kaspersky Sans Display Light', sans-serif;"> </span>

В основу данного способа заложена интеграция виртуального IP-адреса (VIP) с использованием функции keepalived для предоставления единой точки доступа. Такая конфигурация обеспечивает автоматическое переключение между узлами при отказе. <span style="font-size: 11pt; line-height: 107%; font-family: Calibri, sans-serif;"> На каждом запускается скрипт для мониторинга состояния соответствующей службы ядра. </span>Все узлы обслуживают веб-интерфейс через собственные полные доменные имена (FQDN), но VIP обеспечивает унифицированный и стабильный доступ, обеспечивая доступность без вмешательства пользователя. [![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/iUWimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/iUWimage.png)

Детализация демонстрационных машин

[![{2A55985B-9F21-43DF-A1CF-00C60B34E330}.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/mdb2a55985b-9f21-43df-a1cf-00c60b34e330.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/mdb2a55985b-9f21-43df-a1cf-00c60b34e330.png)

Мы также рекомендуем предоставлять отдельный сервера для каждого компонента.

После подготовки файла <span lang="en-us">distributed</span>.<span lang="en-us">inventory</span>.<span lang="en-us">yml, н</span>еобходимо сконфигурировать <span lang="en-us">VIP</span> для всех нод

Установка Keepalived на все основные узлы: <span style="background-color: rgb(255,255,255); color: rgb(0,0,0);">`dnf install -y keepalived`</span>

Для каждого узла требуется собственный скрипт для мониторинга локальной службы KUMA Core. Сохраните скрипт как `/etc/keepalived/check_kuma.sh.`

Пример для Core1 (ksiem-core1):

```bash
#!/bin/bash
if systemctl is-active --quiet kuma-core-00000000-0000-0000-0000-000000000000; then  
exit 0
else  exit 1
fi
```

Настройте имя службы для каждого узла (каждый имеет уникальное имя). Вы можете найти основную службу KUMA, выполнив команду на каждом узле: `<span lang="en-us">systemctl list-units --type=service | grep kuma-core</span>`

Сделайте скрипт исполняемым: `<span lang="en-us">chmod +x /etc/keepalived/check_kuma.sh</span>`

<span lang="en-us">Далее настройте keepalived. Создайте или отредактируйте файл /etc/keepalived/keepalived.conf на каждом узле. Ниже представлена </span><span lang="en-us" style="font-family: Arial, sans-serif;">​​</span><span lang="en-us">адаптированная</span> <span lang="en-us">конфигурация</span><span lang="en-us">.</span>

**<span lang="en-us">Core -1</span>**

```json
vrrp_script chk_kuma {
    script "/etc/keepalived/check_kuma.sh"
    interval 2
    timeout 3
    fall 2
    rise 3
}
vrrp_instance VI_1 {
    state MASTER
    interface ens34              #необходимо поменять в соотетсвии со своей конфигурацией
    virtual_router_id 51
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secretpass
    }
    virtual_ipaddress {
        192.168.100.200
    }
    track_script {
        chk_kuma
    }
} 
```

**<span lang="en-us">Core -2 </span>**

```json
vrrp_script chk_kuma {
    script "/etc/keepalived/check_kuma.sh"
    interval 2
    timeout 3
    fall 2
    rise 3
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens34             #поменяйте в соответcвии со своими параметрами
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secretpass
    }
    virtual_ipaddress {
        192.168.100.200
    }
    track_script {
        chk_kuma
    }
}
```

**Core - 3**

```json
vrrp_script chk_kuma {
    script "/etc/keepalived/check_kuma.sh"
    interval 2
    timeout 3
    fall 2
    rise 3
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens34             #поменяйте в соответcвии со своими сетевыми параметрами
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secretpass
    }
    virtual_ipaddress {
        192.168.100.200
    }
    track_script {
        chk_kuma
    }
}
```

Далее выполните команды

```bash
systemctl enable keepalived
systemctl start keepalived
```

Зайдите в веб-интерфейс <span lang="en-us">KUMA</span> через <span lang="en-us">VIP</span> <span lang="en-us">FKDN</span> (<span lang="en-us">ksiem</span>.<span lang="en-us">demo</span>.<span lang="en-us">lab</span>) активируйте <span lang="en-us">KUMA</span> и убедитесь, что все ноды сервисов установлены и их статус "зеленый"

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/Trtimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/Trtimage.png)

#### Возможные проблемы

##### Проблема 1

Когда устанавливается сервис хранилища или другие ноды хранилища, необходимо указать все <span lang="en-us">FQDN</span> ядер в команде, ниже представлен пример того, как установить хранилище в <span lang="en-us">Raft</span> -е ( 2 <span lang="en-us">replica</span> и 3 <span lang="en-us">keeper</span>)

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/QeHimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/QeHimage.png)

##### Проблема 2. Как коллектор и коррелятор будут работать в этом режиме?

Когда вы создаете коллектор или коррелятор, все 3 ноды автоматически добавятся в скрипт, запустите этот скрипт на сервере (коллектора или коррелятора), в этом случае, если <span lang="en-us">core</span>1 упадет, то вы все равно будете иметь доступ к настройкам коррелятора или коллектора

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/J3uimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/J3uimage.png)

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/scaled-1680-/7Yfimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-09/7Yfimage.png)