Перейти до вмісту

Багатонодова кластеризація та Heartbeats

Для горизонтального масштабування та забезпечення мінімальної затримки у глобальному масштабі, MirApi Gateway розгортається як розподілений кластер незалежних проксі-нод (вузлів). Цей посібник описує процес координації стану та звітування про працездатність нод за допомогою децентралізованої системи серцебиття (heartbeats) у Redis.


Децентралізоване звітування про стан (Health Reporting)

Section titled “Децентралізоване звітування про стан (Health Reporting)”

Замість використання важкого централізованого шару управління (control plane), проксі-ноди узгоджують свій стан асинхронно через Redis. Кожна нода запускає незалежний фоновий потік надсилання сигналів стану (StartHeartbeat).

  1. Запуск ноди: під час ініціалізації нода визначає власну локальну IP-адресу, зчитує налаштований регіон та реєструє свій первинний стан у Redis.
  2. Періодичний запуск: кожні $N$ секунд (параметр NODE_HEARTBEAT_INTERVAL), нода збирає поточні метрики споживання ресурсів та оновлює свій запис у Redis.
  3. TTL запису (Time-to-Live): запис у Redis створюється зі строгим часом життя (параметр NODE_HEARTBEAT_TTL, наприклад, 15 секунд). Якщо нода раптово вимикається або втрачає зв’язок, її ключ автоматично видаляється з Redis, сигналізуючи дашборду про те, що вона офлайн.
  4. Успішне завершення роботи: при штатному вимкненні перехоплювач сигналів ноди негайно видаляє свій ключ із Redis, тому дашборд реєструє відключення миттєво, не чекаючи завершення TTL.

Схема даних стану ноди (Heartbeat Schema)

Section titled “Схема даних стану ноди (Heartbeat Schema)”

Стан ноди зберігається в Redis за ключем proxy:node:<node_name> у форматі JSON:

{
"node_name": "gateway-eu-1",
"region": "eu-central-1",
"last_heartbeat": "2026-05-26T17:21:00Z",
"ip": "10.0.1.45",
"mem_alloc_mb": 14.85,
"num_goroutine": 42
}

Метрики, що відстежуються:

Section titled “Метрики, що відстежуються:”
  • node_name: унікальний ідентифікатор конкретної ноди.
  • region: географічний регіон або хмарний регіон розгортання ноди.
  • last_heartbeat: UTC-мітка часу останнього успішного оновлення стану.
  • ip: приватна/локальна IP-адреса ноди в мережі кластера.
  • mem_alloc_mb: обсяг оперативної пам’яті в мегабайтах, виділений Go-рантаймом (отримується через runtime.ReadMemStats).
  • num_goroutine: кількість активних Go-потоків виконання (горутин) на ноді в даний момент. Цей показник відображає поточне навантаження за підключеннями.

Візуалізація стану кластера на дашборді

Section titled “Візуалізація стану кластера на дашборді”

Адміністративна панель MirApi робить запит до Redis за шаблоном ключів proxy:node:*. Отримані записи об’єднуються, формуючи реальну картину стану кластера:

  • Кількість активних нод: кількість запущених екземплярів шлюзу.
  • Споживання ресурсів: сумарний обсяг RAM та кількість горутин у розрізі всього кластера.
  • Географічний розподіл навантаження: візуалізація трафіку за активними регіонами (наприклад, перенаправлення європейських користувачів на ноди eu-central-1).