Балансування навантаження за допомогою haproxy - vscale community

Vscale надає можливість для легкого вертикального масштабування (ви можете менш ніж за хвилину значно збільшити продуктивність свого сервера), проте іноді потрібно масштабування горизонтальне - коли обробка запитів / завдань розподіляється між декількома серверами, це підвищує відмовостійкість (вихід з ладу одного з серверів пулу залишиться непоміченим користувачами, в той час як у випадку вертикально-масштабованого сервісу втрати можуть досить високими) і дає значну гнучкість в налаштуванні і управлінні. Розглянемо балансування на прикладі спеціалізованого рішення - HAProxy. HAProxy використовується такими гігантами як Twitter, Instagram, Github, StackOverflow, Reddit і багатьма іншими. Програма може бути встановлена ​​на безліч різних систем, ми ж будемо використовувати Ubuntu 16.04.

Технічні вимоги

  • один сервер під балансувальник
  • 3 сервера під обробники запитів
  • на кожному з серверів користувач з sudo-правами

Крок 1. Підготовка бекенд

Якщо ви масштабіруете існуючий проект, то швидше за все у вас вже є як мінімум один сервер, який обробляє запити користувачів, тоді вам необхідно відтворити його робоче оточення (набір і конфігурація ПО) на одному або декількох нових серверах.
Ми ж створимо 3 нових сервера, благо vscale дозволяє зробити це в кілька кліків мишкою. HAProxy проксірует призначені для користувача запити, розподіляючи їх між серверами за певним алгоритмом, тому нам на кожній машині потрібен веб-сервер. Отже, на кожному сервері оновимо індекс пакетного менеджера і поставимо nginx:

А також змінимо вітальну сторінку, щоб можна було визначити, який з серверів згенерував відповідь:

Залишимо таке вміст (поставивши всюди унікальну рядок в тег h1):

На цьому підготовку бекенд можна вважати завершеною, переходимо до найцікавішого.

Крок 2. Встановлення балансувальника

При виборі сервера для балансувальника варто виходити з того, що 1Гб ОЗУ вистачає для обслуговування приблизно 20-30 тисяч одночасних сесій, іншими словами, поки ваш сервіс не виріс до розмірів Фейсбук або твіттера, для роботи балансувальника буде досить майже будь-якого сервера.

HAProxy входить в офіційний репозиторій Ubuntu. Оновлюємо індекс менеджера пакетів і встановлюємо HAProxy:

Крок 4. Налаштування балансувальника

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

Пояснення для тих, хто не стикався зі скороченим видом записи: вміст фігурних дужок говорить інтерпретатору командного рядка, що команду потрібно розгорнути до виду "mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup"

Почнемо редагування конфіга:

Отже, перед нами чистий аркуш. Що нам потрібно? HAProxy має дуже гнучкі настройки і конфіругація може містити велику кількість директив і умов, однак ми почнемо з простого. Конфігураційний файл складається з декількох секцій. Деякі секції (frontend, backend, listen) повинні мати своє ім'я, деякі (наприклад, defaults) - можуть, але не зобов'язані, деякі (global) - не повинні.

Додамо глобальні настройки:

Тут ми дали HAProxy наступні вказівки:

  • log - вести лог в / dev / log зберігаючи в "об'єкт" local0
  • chroot - налаштування безпеки, "замикають" HAProxy у вказаній директорії
  • stats socket - настройки сокета, за яким буде передаватися статистика
  • maxconn - максимальна кількість конкуруючих з'єднань на один процес
  • user - користувач, від імені якого буде запущена програма
  • group - група користувача, від імені якого буде запущена програма
  • daemon - запуск процесу як демона


Виставимо значення за замовчуванням:

У секції defaults описуються параметри за замовчуванням для всіх інших секцій, наступних за даною. У вашому файлі конфігрураціі може бути кілька секцій defaults, в такому випадку параметри, описані в даній секції, будуть перевизначені в наступній, і будуть застосовуватися до секцій, хто йшов услід за нею. У даній секції ми описали такі параметри:

  • log - вказує, в якій лог вести записи (global в даному випадку означає, що будуть використовуватися установки, задані в секції global)
  • mode - встановлює протокол взаємодії, приймає одне із значень: tcp, http, health
  • retries - кількість спроб з'єднання з сервером у разі відмови
  • option httplog - формат балки, в разі використання HAProxy для проксінг HTTP-запитів, рекомендується включати дану настройку
  • option redispatch - дозволяє програмі розірвати і перепризначити сесію в разі відмови сервера
  • contimeout - максимальний час очікування успішного з'єднання з сервером


Тепер зазначимо HAProxy, які запити він повинен слухати, для цього потрібна секція frontend, яку в нашому прикладі ми назвемо "front":

Параметр bind зі значенням *: 80 говорить про те, що HAProxy повинен приймати всі запити на 80-й порт. Параметр default_backend вказує, які сервера будуть обробляти ці запити. В даному випадку - backend_servers, так ми назвали наступну секцію:

Тепер все готово до тестування, проте, ймовірно, ви захочете стежити за станом своєї "ферми" і її статистикою, для цього додамо ще одну секцію в файл конфігурації:

Таким чином, в даній секції ми вказали HAProxy, що він повинен показувати статистику на сторінці "/ haproxy_stats" на порту 10001, якщо користувач введе логін "admin" і пароль "password".

Крок 3. Тестування

Крок 4. Вибір алгоритму балансування

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

висновок

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

tglnkLinux tglnkNgnix tglnkgit

Схожі статті