Введення в haproxy і принципи розподілу навантаження

HAProxy (High Availability Proxy) - популярний проксі сервер для Linux, Solaris і FreeBSD з можливістю балансування навантаження TCP / HTTP з відкритим програмним кодом. Його основне завдання - підвищення продуктивності серверного середовища шляхом розподілу робочого навантаження серед кількох серверів (web, додатки, бази даних). Ним користуються такі відомі проекти як GitHub, Imgur, Instagram і Twitter.

Термінологія HAProxy

Існує ряд основних термінів і положень, в яких варто чітко розбиратися при обговоренні розподілу навантаження і проксі серверів. Але перш, ніж почати розбиратися в нових термінах, варто поговорити про те, що таке ACL, backend і frontend.

Список контролю доступу (ACL)

Коли ми розмовляємо про розподіл навантаження, ACL застосовується для перевірки встановлених правил розподілу і для запуску певної дії (наприклад, вибір сервера або блокування мережевого запиту) в залежності від застосування правила.

Використання ACL дозволяє гнучко управляти трафіком, перенаправляючи його в залежності від більшої кількості факторів, серед яких є відповідність паттерну або обмеження кількості з'єднань з бекендом і ін.

Для більш докладного опису використання ACL звертайтеся до інструкції по налаштуванню HAProxy.

Бекендом називається набір серверів, які отримують переслані запити користувачів. Вони вказуються в розділі настройки backend. У загальному випадку бекенд визначається наступними параметрами:

  • алгоритм розподілу навантаження
  • набір серверів і портів

Бекенд може включати в себе як один, так і кілька серверів. Іншими словами, додаючи більше серверів ви збільшуєте максимально можливе навантаження, розподіляючи її по всіх серверів. Так само, таким чином, підвищується відмовостійкість у разі, якщо відмовив один з серверів.

Наведемо приклад налаштування двох бекендов, web-backend і blog-backend обробних запити? надходять на 80 порт:

Рядок balance roundrobin вказує на алгоритм балансування, який описаний в секції Алгоритми розподілу навантаження нижче.

Mode http вказує на те, що буде використаний 7 шар проксі, який також описаний в Типи розподілу навантаження.

Параметр check означає, що ці сервери повинні перевірятися на працездатність.

Фронтенд визначає яким чином запити повинні бути перенаправлені на бекенд. Вони вказуються в розділі frontend настройки HAProxy. Їх визначення складається з наступних частин:

Фронтендів можна вказувати різні для різного мережевого трафіку, що ми обговоримо пізніше.

Типи розподілу навантаження

Отже, ми розібралися з основними термінами, давайте перейдемо до типам розподілу навантаження.

відсутність навантаження

Найпростіше web-додаток без розподілу навантаження зазвичай виглядає наступним чином:

Введення в haproxy і принципи розподілу навантаження

Розподіл навантаження 4 рівня

Наведемо діаграму простого прикладу застосування балансування 4 рівня:

Введення в haproxy і принципи розподілу навантаження

Користувач звертається до балансувальник, який в свою чергу перенаправляє запит на групу web-backend бекенд серверів. Відповідний бекенд сервер відповідає користувачеві. В ідеалі, всі сервери повинні видавати ідентичний контент, в противному випадку може отримає несподівані результати. У загальному випадку, всі сервери повинні бути підключені до однієї бази даних.

Розподіл навантаження 7 рівня

Наступний, більш складний, спосіб - балансування навантаження 7 рівня (рівень додатки). Такий спосіб дозволяє управляти потоком трафіку в залежності від змісту запиту. Так само він допускає виконання декількох веб-додатків на одному домені і порте.

Наведемо діаграму простого прикладу застосування балансування 7 рівня:

Введення в haproxy і принципи розподілу навантаження

В цьому випадку, якщо користувач звернувся до yourdomain.com/blog. то він перенаправляється на бекенд, що відповідає за blog, тобто до серверів, що працюють з блогом додатки. Всі інші запити направляються на web-backend, який вже використовує зовсім іншу програму. В даному прикладі обидва бекенда використовують один сервер бази даних.

Приклад настройки фронтендів зазвичай виглядає наступним чином:

Ця установка визначає фронтенд по імені http. який відповідає за весь вхідний трафік 80 порту.

use_backend blog-backend if url_blog перенаправляє трафік в соотетствіі з правилами ACL.

default_backend web-backend вказує на те, що весь трафік буде перенаправлений на web-backend.

Алгоритми розподілу навантаження

Алгоритм розподілу навантаження відповідає за вибір сервера для обробки запиту користувача. HAProxy пропонує нам кілька алгоритмів. На додаток до алгоритму, ми можемо вказати вагу кожного сервера, відповідно до якого він буде обраний частіше або рідше.

Ми розглянемо тільки часто використовувані алгоритми, хоча HAProxy пропонує їх набагато більше. В інструкції по налаштуванню HAProxy ви зможете ознайомиться з ними більш докладно.

Наведемо основні алгоритми:

Алгоритм, який застосовується за умовчанням. Перебирає сервера по черзі.

Вибирає сервер з найменшим числом активних сполук. Рекомендується до використання для довгих сесій. Сервера в одному бекенде варіюються циклічно.

Вибирає сервер виходячи з хешу, побудованого на основі IP користувача. Таким чином, користувач завжди звертається до одного й того ж сервера.

тривалі сесії

Іноді додатку потрібно, щоб користувач був приєднаний до одного й того ж сервера. Це може бути досягнуто шляхом застосування параметра appsession для необхідного бекенда.

Перевірка працездатності

HAProxy застосовує перевірку працездатності сервера, щоб визначити чи здатний він обробити запит. Так нам не доводиться вручну виключати сервер з налаштування бекенда. За замовчуванням HAProxy намагається встановити TCP з'єднання з сервером і перевіряє виробляє той обробку даних, що надходять на 80 порт.

Якщо сервер не проходить перевірку, то він автоматично виключається з бекенда і трафік на нього не перенаправляється до тих пір, поки сервер знову не стане доступний. Якщо ж падають все сервера, то додаток стає недоступно поки не відновить свою роботи хоча б один сервер.

Для деяких же видів серверів, як, наприклад, сервера баз даних, такої перевірки недостатньо.

інші рішення

Якщо HAProxy здався вам занадто складним для вирішення ваших проблем, спробуйте розглянути наступні варіанти:

  • Linux Virtual Servers (LVS) - просто балансувальник 4 рівня, що входить в більшість Linux дистрибутивів.
  • Nginx - швидкий і надійний веб сервер, який так само можна використовувати в якості балансувальника. Він дуже часто використовується в зв'язці з HAProxy завдяки своїм можливостям кешування і архівування.

висновок

Отже, ви познайомилися з основами розподілу навантаження і маєте уявлення яким чином HAProxy здатний вам допомогти. Тепер ви можете сміливо почати імпровізувати для досягнення кращих результатів роботи вашого сервера.

Схожі статті