Чому штатне налаштування HAProxy ламається під навантаженням
Штатне налаштування HAProxy — це набір значень за замовчуванням, яких вистачає на стенді й не вистачає на піку.
Перше вузьке місце — не задані явно таймаути з'єднань: поки клієнт утримує неактивне з'єднання, а сервер застосунків відповідає довше за звичайне, слоти обробки закінчуються раніше, ніж трафік.
Черга зростає, час відповіді збільшується лавиноподібно, і балансування навантаження починає розподіляти вже не запити, а затримки.
Відсутність перевірок стану вузлів — друга міна. За замовчуванням балансувальник нерідко перевіряє лише доступність порту: застосунок може віддавати помилки, але залишатися в ротації й отримувати свою частку трафіку.
Один деградований вузол тягне вниз весь пул, а проблему виявляють за скаргами користувачів, а не за метриками.
Третє — єдиний вхід у систему як точка відмови. Один процес, одна адреса, ручне редагування конфігурації: оновлення або перезапуск означають розрив активних сесій, а відмова самого балансувальника кладе весь сервіс.
Статистика при цьому не знімається, тому розбір інциденту відбувається вже після нього, за логами застосунків.
Розбираємо, як це закривається: явні таймаути під профіль трафіку, перевірки стану за прикладним відгуком, резервування входу й моніторинг, який показує деградацію до того, як вона стане відмовою.
Що змінюється після переробки конфігурації та вмикання моніторингу
Що змінюємо в конфігурації, видно за трьома метриками: час відгуку на піку, частка помилкових відповідей і час, за який система повертається до норми після падіння вузла.
На піку трафік перестає впиратися в один сервер: алгоритм балансування обирає вузол за кількістю активних з'єднань, а не по колу, кількість одночасних сесій на кожен вузол обмежена, а з'єднання до застосунків перевикористовуються замість відкриття нового на кожен запит.
Таймаути виставлені за фактичним розподілом часу обробки, тому повільний, але живий вузол встигає відповісти, а не обривається раніше строку, і черга на вході не зростає лавиноподібно.
HAProxy тримає окрему перевірку здоров'я для кожного вузла: інтервал, поріг послідовних невдач і умови повернення в ротацію.
Це закриває клас відмов, який до переробки був основним джерелом 5xx — деградований вузол, який відповідає, але повільно, продовжував отримувати свою частку трафіку й псував відповіді частині користувачів.
Тепер вузол виводиться з ротації до того, як почне віддавати помилки, повтор надсилається лише на безпечні для повтору запити, а решта отримують явну відповідь замість підвішеного з'єднання.
Час відновлення після падіння вузла задається інтервалом перевірки й порогом невдач — це настроювана величина, а не наслідок удачі.
Назад у ротацію вузол входить плавно: спочатку отримує невелику частку трафіку, і тільки якщо час відгуку тримається в нормі, повертається до повної. Резервний вузол вмикається в роботу, коли основний пул деградував цілком, тому сплеск відмов не перетворюється на повний простій.
Моніторинг навантаження спирається на журнали доступу й лічильники: час обробки за кожним запитом, розподіл трафіку між вузлами, частка помилок, очікування в черзі, стан кожного сервера.
З цих даних видно, деградував конкретний вузол чи зріс загальний трафік, і оповіщення виставляються від спостережуваного профілю навантаження, а не на око.
Через кілька діб після вмикання стає зрозуміло, які пороги стали зайвими, а де потрібен запас — конфігурація уточнюється за фактом, а не за припущеннями.
HAProxy налаштування: варіанти балансування та їхні обмеження
Схема балансування — це не одна директива, а набір: алгоритм розподілу, перевірки стану, резервний контур і точка входу. Помилка на будь-якому рівні виглядає однаково — частина запитів іде на неробочий вузол і висить там до закінчення очікування.
Чотири схеми та їхні межі
| Варіант | Коли підходить | Обмеження |
|---|---|---|
| Розподіл за з'єднаннями (roundrobin, leastconn) | Однорідні вузли, короткі запити | Довгі з'єднання перекошують навантаження; щойно доданий вузол забирає весь потік |
З активними перевірками стану (option httpchk) |
Сервіс живий, але відповідає помилками | Перевірка окремої адреси не бачить деградацію бази; часті опитування дають хибні знімання |
З резервним контуром (backup) |
Критичний сервіс з обмеженим запасом потужності | Резерв вмикається лише за повної відмови основного; його деградація непомітна до аварії |
| Із зовнішнім розподілом на вході (DNS-запис, вищий вузол) | Кілька точок входу, географія | Кеш записів і затримка знімання тримають трафік на вузлі, що впав, хвилинами |
Перед вибором перевіряємо три речі: за скільки секунд вузол виводиться з ротації, що відбувається за відмови самого балансувальника і де живе стан сесії.
Якщо сесії липкі, а вузол іде — користувач втрачає кошик; якщо перевірка дивиться лише на відкритий порт, деградація залишається невидимою. Схему підбираємо під профіль трафіку, а не за замовчуванням.
Як проходить впровадження: від розбору схеми до передачі
Порядок робіт однаковий і для нового впровадження, і для перебудови балансувальника, що вже працює: спочатку фіксуємо фактичний стан, потім збираємо цільову схему й перевіряємо її в тестовому контурі, і лише після цього чіпаємо робочий контур. Вартість розраховується після аудиту.
- Аудит інфраструктури. Знімаємо карту сервісів, адрес і портів, дивимося, де стоїть балансувальник відносно периметра й захисту. Розбираємо статистику та логи: де губляться запити, як живе сесія, які правки вносилися на серверах руками.
- Цільова схема. Вирішуємо, що балансується на рівні з'єднання, а що потребує розбору заголовків, як розподіляється навантаження, де зберігається стан сесії. Схему узгоджуємо до першого рядка конфігурації.
- Конфігурація на стенді. Розгортаємо HAProxy у тестовому контурі з тими самими ролями серверів. Тут же налаштовуємо збирання статистики, логи й обмеження частоти звернень.
- Перевірка під навантаженням. Проганяємо профіль, близький до пікового: час відповіді, розподіл за серверами, поведінка за зростання кількості з'єднань і повільних клієнтів. Правки вносимо, поки стенд, а не користувачі.
- Випробування відмовами. По черзі виводимо сервери з ладу, перевіряємо роботу перевірок доступності та самостійне повернення вузла в стрій. Тут же фіксуємо сценарій відкату змін.
- Переведення трафіку. Перемикаємо поетапно: спочатку частка запитів, потім весь потік, зі спостереженням за помилками й затримками. Якщо метрики виходять за межі, відкат займає хвилини.
- Передача черговій зміні. Віддаємо схему, конфігурацію, порядок типових операцій і розбір інцидентів. Черговий інженер разом з нашим проходить перезавантаження конфігурації й навчальний збій.
Що залишається у вас: конфігурації, схеми, регламенти
Балансувальник залишається у вашому контурі, а отже, все потрібне для його роботи й правок має залишитися у вашої команди, а не в листуванні з нами.
Тому здаємо не «файли на пам'ять», а комплект артефактів, за яким черговий інженер без нашої допомоги підніме контур, змінить маршрут і відкотить невдалу правку.
Кожен документ пишемо під людину, яка бачить систему вперше: де дивитися, що перевірити після зміни, на який сигнал реагувати першим.
- Робочі конфігурації — файли HAProxy за всіма середовищами, з коментарями до неочевидних рішень: чому вибрано такий час очікування відповіді, як розподіляються черги, що зарезервовано під пікові навантаження.
- Схема потоків — звідки приходить трафік, де завершується шифрування, які вузли стоять за балансувальником і які місця залишаються точками відмови. Відновлення картини займає хвилини, а не години розбору логів.
- Політики доступу — правила, хто і з яких адрес потрапляє в панель керування й статистику, як обмежені зміни на бойовому контурі та хто має право їх підтверджувати.
- Інструкція з відкату — покрокове повернення попередньої конфігурації однією операцією, список перевірок після повернення й порядок дій, якщо відкат не допоміг.
- Версіонування змін — конфігурації в системі контролю версій, кожна правка окремим набором з описом: видно, хто, коли й навіщо змінив маршрут або правило.
- Регламент моніторингу — які показники знімаємо, за яких порогів приходить оповіщення, куди воно йде й хто чергує.
- Порядок передачі — облікові записи, ролі та права видаються вашим людям, наші доступи закриваються одразу після здачі.
Кейс: перевели трафік на резервний контур без простою
До робіт вхідний трафік обслуговував один вузол балансування: на ньому сходилися термінація шифрованого трафіку, прив'язка клієнтських сесій до конкретного сервера й перевірки доступності бекендів.
Будь-яке планове оновлення конфігурації означало перезапуск процесу — за логами це давало до 400 перерваних сесій за вікно обслуговування й сплеск відповідей 502 на вході. Резервний контур існував, але перемикалися на нього вручну й лише в аварійному порядку.
Ми перевели вхід на пару вузлів HAProxy зі спільною плаваючою адресою: конфігурація збирається з одного джерела й розкочується цілком, а безшовне перезавантаження передає слухаючі сокети новому процесу, не розриваючи вже встановлені з'єднання.
Прив'язку сесій прибрали — стан винесли в спільне сховище, тому запит обслуговує будь-який вузол. Перемиканням між контурами тепер керують перевірки доступності, а не черговий інженер.
Що показали заміри
Перевіряли двома способами: прогоном профілю навантаження, знятого з бойового трафіку, і контрольованим вимкненням вузла в робочі години. Медіана часу відгуку на вході скоротилася майже втричі, частка відповідей довше секунди впала з 7% до 0,3%, а відповіді 5xx — з 2,4% до 0,02%.
Перерваних сесій під час обслуговування більше немає: перемикання на резервний контур укладається в один інтервал перевірки, і користувач його не помічає. Зворотне переведення контуру — та сама операція з тим самим результатом.
Чим відрізняється мережевий балансувальник від прикладного?
Мережевий рівень працює з потоком з'єднань: балансувальник бачить адресу й порт, обирає сервер за алгоритмом і далі в трафік не втручається. Вміст пакетів не розбирається, тому затримка мінімальна, а поведінка однакова для HTTP, СУБД і довготривалих з'єднань.
Обмеження одне: одиниця балансування — з'єднання цілком, і якщо клієнт тримає один канал, різні типи запитів усередині нього за призначенням не розвести.
Прикладний рівень розбирає прикладний протокол і бачить метод, шлях, заголовки, cookie. Звідси маршрутизація запитів: статику віддає один пул серверів, API — другий, службові адреси — третій, і правила змінюються на вході без правок на самих серверах.
Там же працює прив'язка сесії за cookie і точна перевірка доступності: вузол, що відповідає помилкою на службовій адресі, виводиться з ротації, хоча на мережевому рівні виглядав би живим.
Завершення шифрування — окреме рішення зі своєю ціною. Коли шифр знімається на вході, сертифікати й параметри з'єднання живуть в одному місці, внутрішні сервіси отримують відкритий трафік, а правила маршрутизації бачать вміст цілком.
Наскрізне шифрування до сервера залишає трафік закритим для балансувальника, але маршрутизація тоді йде лише за метаданими, а оновлення сертифікатів лягає на кожен вузол.
На практиці режими співіснують: HAProxy веде частину сервісів на мережевому рівні, а HTTP-навантаження — на прикладному, і режим задається для кожного пулу серверів окремо.
Часті технічні сумніви перед стартом робіт
Сумніви в інженерної команди зазвичай ті самі: що станеться за відмови вузла, як швидко відкотитися, хто відповідає за сертифікати й чи не доведеться ловити деградацію за скаргами користувачів.
Ми проговорюємо ці точки до старту, щоб схема залишалася ремонтопридатною, а не «працює, поки її не торкнеш».
Нижче — короткі відповіді в розкривних блоках. Якщо вашого питання тут немає, додамо його в розбір задачі й повернемося з оцінкою та планом робіт.
Як швидко ви зрозумієте, що вузол випав?
Балансувальник перевіряє не лише доступність порту, а й готовність застосунку відповідати — за окремою адресою стану. Вузол, який перестав проходити перевірку задану кількість разів підряд, виводиться з ротації за секунди, без очікування скарг.
Пороги перевірок, інтервали й таймаути з'єднання фіксуємо в конфігурації й узгоджуємо з вашим профілем навантаження: надто жорсткий поріг дає хибні відключення, надто м'який — довге утримання мертвого вузла.
Що буде, якщо сам балансувальник стане єдиною точкою відмови?
Ставимо два вузли в режимі гарячого резерву зі спільною віртуальною адресою: активний обслуговує трафік, другий тримає стан і приймає керування за втрати зв'язку.
Перемикання займає частки секунди й не потребує ручних дій — сесії та таблиці з'єднань зберігаються завдяки синхронізації.
Як бути із сертифікатами та їхнім продовженням?
Шифрування термінується на балансувальнику, сертифікати продовжуються автоматично, а ланцюжок перевіряється до викочування в продуктив. Заміна сертифіката проходить без розриву активних з'єднань: спочатку підхоплюється новий, потім витісняється старий.
Чи можна відкотити зміни й розібрати інцидент?
Конфігурація живе в системі контролю версій, викочування йде через перевірку синтаксису й плавне перезавантаження без обриву з'єднань. Відкат — повернення попередньої ревізії однією операцією.
Для розбору інцидентів збираємо журнали з мітками часу, кодами відповідей і часом відгуку за кожним вузлом: за ними видно, де почалася деградація й який вузол її спричинив.
Обговоримо вашу схему й повернемося з планом робіт
Щоб оцінка була предметною, а не «на око», потрібен мінімум вихідних даних. Надішліть поточну схему проходження трафіку, конфігурацію балансувальника, перелік сервісів за ним і вимоги до доступності — цього достатньо, щоб побачити вузькі місця й повернутися з планом робіт.
Ми не беремося «зробити все» замість вас: частину задач розумніше залишити внутрішній команді, і це теж відобразимо в плані.
Далі рухаємося за етапами, і на кожному зрозуміло, що відбувається й навіщо.
- Вихідні дані: точки входу, домени, сертифікати, цільові сервіси та правила маршрутизації.
- Розбір поточної схеми: як розподіляється трафік, де єдина точка відмови, що вже налаштовано в HAProxy.
- План впровадження: зміни за кроками з перевіркою після кожного — від правки конфігурації до перемикання трафіку.
- Вікно робіт: узгоджуємо інтервал з мінімальним впливом на користувачів і готовим відкатом на попередню конфігурацію.
- Моніторинг: метрики, оповіщення й панель за балансувальником — щоб проблему бачили раніше, ніж прийдуть звернення.
- Оцінка строків: тривалість кожного етапу й загальний графік з точками, де потрібне ваше узгодження.
- Передача: інструкції з експлуатації та розбір типових ситуацій з вашою командою.
Опишіть задачу у вільній формі — повернемося з оцінкою, планом і складом робіт.







