Відмовостійкість блокчейн-ноди: HA з балансуванням і резервуванням

Уявіть: ваш DeFi-сервіс втрачає зв'язок з Ethereum на 10 хвилин через збій — втрати на ліквідності сягають $50 000 на годину. А якщо це платіжний шлюз для крипто-мерчанта, кожна година простою приносить збиток до $10 000. Одиночна нода — це single point of failure. downtime ноди дорівнює downtime пр

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1004
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1011

Уявіть: ваш DeFi-сервіс втрачає зв'язок з Ethereum на 10 хвилин через збій — втрати на ліквідності сягають $50 000 на годину. А якщо це платіжний шлюз для крипто-мерчанта, кожна година простою приносить збиток до $10 000. Одиночна нода — це single point of failure. downtime ноди дорівнює downtime продукту. Ми налаштовуємо відмовостійкі конфігурації блокчейн-нод для production-сервісів. Наші інженери мають досвід з Ethereum, Solana, Polygon, Arbitrum та іншими мережами, понад 5 років на ринку та 10+ проєктів з налаштування нод. У документації Ethereum сказано: health check must verify not only connectivity but also synchronization status.

Проблеми одиночної ноди

Downtime виникає не лише через апаратні збої. Найчастіше проблеми пов'язані з відставанням ноди від chain tip — після крашу Ethereum потребує пересинхронізації, Solana — доганяє слоти. Перевантаження RPC — один інстанс не справляється з навантаженням запитів від кількох сервісів. Планові оновлення клієнта під час rolling update роблять ноду тимчасово недоступною. Апаратні відмови диска, RAM або мережевої карти виводять її з ладу. Пошкодження snapshot при неочікуваному вимкненні живлення також призводить до тривалого відновлення.

Чому варто обрати Active-Active архітектуру?

Active-Active архітектура вирішує ці проблеми в корені. Вона забезпечує вдвічі швидший failover порівняно з Active-Passive, оскільки обидві ноди постійно обслуговують трафік. При Active-Passive друга нода простоює, а при збої потрібен час на промоцію. Active-Active ж миттєво перерозподіляє навантаження, а health check кожні 5 секунд гарантує, що несинхронізована нода не отримає трафік.

Client requests │ ┌───▼───┐ │ HAProxy / Nginx │ ← health check кожні 5s └───┬───┘ │ ┌────┴────┐ ▼ ▼ Node-1 Node-2 ← різні AZ / датацентри │ │ └────┬────┘ │ Shared або independent storage 

Приклад конфігурації HAProxy для Ethereum RPC:

global maxconn 50000 log stdout format raw daemon defaults mode http timeout connect 5s timeout client 60s timeout server 60s option http-server-close option forwardfor frontend ethereum_rpc bind *:8545 bind *:8546 # WebSocket default_backend ethereum_nodes backend ethereum_nodes balance leastconn option httpchk POST / HTTP/1.1\r\nHost:\ localhost\r\nContent-Type:\ application/json\r\nContent-Length:\ 68\r\n\r\n{\"jsonrpc\":\"2.0\",\"method\":\"eth_syncing\",\"params\":[],\"id\":1} http-check expect string '"result":false' # нода в sync якщо eth_syncing = false server node1 10.0.1.10:8545 check inter 5s fall 2 rise 3 server node2 10.0.1.11:8545 check inter 5s fall 2 rise 3 # Sticky sessions для WebSocket (не можна перемикати mid-subscription) stick-table type ip size 100k expire 30m stick on src frontend ethereum_ws bind *:8546 default_backend ethereum_ws_nodes backend ethereum_ws_nodes balance source # WebSocket — по source IP для sticky server node1 10.0.1.10:8546 check inter 10s fall 2 rise 3 server node2 10.0.1.11:8546 check inter 10s fall 2 rise 3 

Критичний момент для WebSocket: підписки (eth_subscribe, Solana slotSubscribe) — stateful, при failover клієнт має перестворити підписки. Використовуємо sticky sessions по IP.

Який health check потрібен для Ethereum RPC?

HTTP health check (status 200) недостатній — нода може відповідати, але відставати на 1000 блоків. Правильна перевірка:

#!/bin/bash # /etc/haproxy/scripts/check_eth_node.sh NODE_URL="http://localhost:8545" # 1. Перевіряємо, що нода не в процесі синхронізації SYNCING=$(curl -sf -X POST "$NODE_URL" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | \ jq -r '.result') if [ "$SYNCING" != "false" ]; then exit 1 fi # 2. Перевіряємо, що блок не старше 3 хвилин (180 секунд) BLOCK_HEX=$(curl -sf -X POST "$NODE_URL" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}' | \ jq -r '.result.timestamp') BLOCK_TIME=$((16#${BLOCK_HEX#0x})) NOW=$(date +%s) AGE=$((NOW - BLOCK_TIME)) if [ $AGE -gt 180 ]; then exit 1 fi exit 0 

Аналогічно для Solana — перевіряємо getSlot та getEpochInfo, допуск 50–100 слотів.

Метод health check Що перевіряє Недолік
HTTP 200 Доступність порту Не бачить відставання
eth_syncing Синхронізація Не дає вік блоку
eth_getBlockByNumber Час останнього блоку Потребує скрипт

Як оновлювати ноди без downtime?

Rolling update — оновлюємо по одній ноді, виводячи з ротації:

#!/bin/bash # rolling_update.sh # Крок 1: виводимо node1 з rotation haproxy -sf $(cat /var/run/haproxy.pid) -f /etc/haproxy/haproxy_node2_only.cfg # Крок 2: чекаємо drain існуючих з'єднань sleep 30 # Крок 3: оновлюємо node1 ssh node1 "systemctl stop geth && apt upgrade -y ethereum && systemctl start geth" # Крок 4: чекаємо sync node1 while ! /etc/haproxy/scripts/check_eth_node.sh node1; do echo "Waiting for node1 to sync..." sleep 30 done # Крок 5: повертаємо node1, оновлюємо node2 haproxy -sf $(cat /var/run/haproxy.pid) -f /etc/haproxy/haproxy.cfg sleep 30 ssh node2 "systemctl stop geth && apt upgrade -y ethereum && systemctl start geth" 

Як моніторити стан HA-кластера?

Використовуємо Prometheus + Grafana з метриками:

Метрика Поріг алерту Критичність
eth_block_age_seconds > 120s Critical
haproxy_backend_active_servers < 1 Critical
haproxy_backend_response_time_ms > 2000ms Warning
node_disk_io_time_percent > 80% Warning
node_memory_available_bytes < 10% Warning

Алерти налаштовуємо в PagerDuty або Telegram. Для backend_active_servers < 1 — негайне сповіщення чергового.

Типові помилки при налаштуванні HA

При налаштуванні HA часто зустрічаються помилки: однакові health checks для всіх нод, відсутність моніторингу age блоку, ігнорування WebSocket sticky sessions, ручне оновлення та недостатня ємність для resync. Розберемо кожен кейс. Якщо перевіряти лише порт, балансувальник вважатиме обидві ноди здоровими, навіть якщо одна відстає — запити потрапляють на застарілі дані. Нода може висіти на 50-му блоці годинами, а health check не спрацьовує — використовуйте eth_getBlockByNumber з таймстемпом. Клієнт, який підписався на події через ноду, при failover втрачає підписку без перепідключення. Без скрипта rolling update легко допустити простій — автоматизуйте за допомогою HAProxy та API. Після збою нода може пересинхронізуватися кілька годин — враховуйте це при виборі дисків і каналу.

Процес роботи: від аналізу до деплою

  1. Аналіз — вивчаємо поточну інфраструктуру, вимоги до uptime, бюджет.
  2. Проєктування — обираємо схему (Active-Active або Active-Passive), провайдерів, інструменти моніторингу.
  3. Реалізація — розгортаємо ноди в різних зонах доступності, налаштовуємо балансувальник та health checks.
  4. Тестування — симулюємо відмови, перевіряємо failover та час відновлення.
  5. Деплой та документація — здаємо конфігурацію, інструкції з обслуговування та плани дій при збоях.

Що входить в послугу

  • Розгортання другої ноди в окремій AZ/датацентрі.
  • Налаштування HAProxy або Nginx з розумними health checks.
  • Скрипти rolling update для оновлень без downtime.
  • Prometheus метрики, Grafana дашборд, алерти.
  • Документація процедур failover та відновлення.

Якщо ваша система потребує uptime 99.9% — зв'яжіться з нами для аудиту поточної архітектури. Замовте налаштування відмовостійкості вашої блокчейн-ноди — ми підберемо оптимальне рішення за 5 робочих днів. Отримайте консультацію: оцінимо ваш проєкт і запропонуємо тариф.