Встановлюємо балансувальник навантаження HAProxy на CentOS

Переклад статті підготовлений напередодні старту курсу «Адміністратор Linux. Віртуалізація та кластеризація»

Встановлюємо балансувальник навантаження HAProxy на CentOS

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

HAProxy прагне оптимізувати використання ресурсів, максимізувати пропускну спроможність, мінімізувати час відгуку та уникнути перевантаження кожного окремо взятого ресурсу. Вона може бути встановлена ​​на безлічі дистрибутивів Linux, таких як CentOS 8, на якому ми зупинимося в цьому посібнику, а також у системах Debian 8 и Ubuntu 16.

Встановлюємо балансувальник навантаження HAProxy на CentOS

HAProxy особливо підходить для веб-сайтів з дуже високим трафіком і тому часто використовується для підвищення надійності та продуктивності конфігурацій веб-служб із кількома серверами. У цьому посібнику викладено кроки з налаштування HAProxy як балансувальника навантаження на хмарному хості CentOS 8, який потім направляє трафік на ваші веб-сервери.

В якості необхідної умови для досягнення найкращих результатів у вас має бути як мінімум два веб-сервери та сервер для балансування навантаження. На веб-серверах має бути запущена хоча б базова веб-служба, така як nginx або httpd, щоб можна було перевірити балансування навантаження між ними.

Установка HAProxy на CentOS 8

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

sudo yum info haproxy

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

У цьому посібнику ми будемо встановлювати останню стабільну версію 2.0, яка ще не була доступна в стандартних репозиторіях на момент написання керівництва. Вам потрібно буде встановити її з першоджерела. Але спочатку перевірте, чи виконані у вас необхідні умови для завантаження та компіляції програми.

sudo yum install gcc pcre-devel tar make -y

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

wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.7.tar.gz -O ~/haproxy.tar.gz

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

tar xzvf ~/haproxy.tar.gz -C ~/

Перейдіть до розпакованого каталогу з вихідними джерелами:

cd ~/haproxy-2.0.7

Потім скомпілюйте програму під вашу систему:

make TARGET=linux-glibc

І, нарешті, встановіть саму HAProxy:

sudo make install

Тепер HAProxy встановлена, але для її роботи потрібні деякі додаткові маніпуляції. Продовжимо налаштування програмного забезпечення та сервісів нижче.

Налаштування HAProxy під ваш сервер

Тепер додайте наступні каталоги та файл статистики для записів HAProxy:

sudo mkdir -p /etc/haproxy
sudo mkdir -p /var/lib/haproxy 
sudo touch /var/lib/haproxy/stats

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

sudo ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

Якщо ви хочете додати проксі-сервер до системи як службу, скопіюйте файл haproxy.init з examples у свій каталог /etc/init.d. Відредагуйте права доступу до файлу, щоб скрипт виконувався, а потім перезавантажте демон systemd:

sudo cp ~/haproxy-2.0.7/examples/haproxy.init /etc/init.d/haproxy
sudo chmod 755 /etc/init.d/haproxy
sudo systemctl daemon-reload

Вам також необхідно дозволити службі автоматичне перезавантаження під час запуску системи:

sudo chkconfig haproxy on

Для зручності також рекомендується додати нового користувача для запуску HAProxy:

sudo useradd -r haproxy

Після цього ви можете перевірити номер встановленої версії за допомогою наступної команди:

haproxy -v
HA-Proxy version 2.0.7 2019/09/27 - https://haproxy.org/

У нашому випадку версія має бути 2.0.7, як показано у прикладі виведення вище.

Нарешті, файрвол CentOS 8 за умовчанням досить рестриктивний для цього проекту. Використовуйте такі команди, щоб дозволити необхідні служби та перезавантажити файрвол:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-port=8181/tcp
sudo firewall-cmd --reload

Налаштування балансувальника навантаження

Налаштування HAProxy – досить простий процес. По суті, все, що вам потрібно зробити, це повідомити HAProxy, які з'єднання він повинен прослуховувати і куди їх ретранслювати.

Це робиться шляхом створення конфігураційного файлу /etc/haproxy/haproxy.cfg з визначальними налаштуваннями. Ви можете прочитати параметри конфігурації HAProxy на сторінці документаціїякщо хочете дізнатися про це більше.

Балансування навантаження на транспортному рівні (layer 4)

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

sudo vi /etc/haproxy/haproxy.cfg

Додайте до файлу наступні розділи. Замініть ім'я_сервера тим, що має викликати ваші сервери на сторінці статистики, а private_ip — приватними IP-адресами серверів, на які ви хочете надсилати веб-трафік. Ви можете перевірити приватні IP-адреси на панелі керування UpCloud та на вкладці Приватна мережа в меню мережу.

global
   log /dev/log local0
   log /dev/log local1 notice
   chroot /var/lib/haproxy
   stats timeout 30s
   user haproxy
   group haproxy
   daemon

defaults
   log global
   mode http
   option httplog
   option dontlognull
   timeout connect 5000
   timeout client 50000
   timeout server 50000

frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

backend http_back
   balance roundrobin
   server server_name1 private_ip1:80 check
   server server_name2 private_ip2:80 check

Це визначає балансувальник навантаження транспортного рівня (layer 4) із зовнішнім ім'ям http_front, що прослуховує порт 80, який потім направляє трафік до бекенду за умовчанням з ім'ям http_back. Додаткова статистика /haproxy?stats підключає сторінку статистики за вказаною адресою.

Різні алгоритми балансування навантаження.

Вказівка ​​серверів у розділі бекенда дозволяє HAProxy використовувати ці сервери для балансування навантаження відповідно до алгоритму циклічного перебору, коли це можливо.

Алгоритми балансування використовуються визначення того, який сервер в бекенде передається кожне з'єднання. Ось деякі з корисних опцій:

  • Roundrobin: кожен сервер використовується по черзі відповідно до своєї ваги. Це найплавніший і найчесніший алгоритм, коли час обробки серверами залишається рівномірно розподіленим. Цей алгоритм динамічний, що дозволяє регулювати вагу сервера на льоту.
  • Leastconn: вибирається сервер із найменшою кількістю з'єднань. Циклічний перебір виконується між серверами з однаковим навантаженням. Використання цього алгоритму рекомендується для довгих сеансів, таких як LDAP, SQL, TSE тощо, але не дуже підходить для коротких сеансів, таких як HTTP.
  • Перший: перший сервер із доступними слотами для підключення отримує з'єднання. Сервери вибираються від найнижчого числового ідентифікатора до найвищого, який за умовчанням відповідає положенню сервера у фермі. Як тільки сервер досягає значення maxconn, використовується наступний сервер.
  • джерело: IP-адреса джерела хешується і ділиться на загальну вагу запущених серверів, щоб визначити, який сервер отримуватиме запит. Таким чином, один і той же IP-адреса клієнта буде завжди діставатися одному й тому серверу, тоді як сервери залишаються незмінними.

Налаштування балансування навантаження на прикладному рівні (layer 7)

Ще одна доступна можливість – налаштувати балансувальник навантаження для роботи на прикладному рівні (layer 7), що корисно, коли частини вашої веб-програми розташовані на різних хостах. Це може бути досягнуто шляхом регулювання передачі з'єднання, наприклад URL.

Відкрийте конфігураційний файл HAProxy за допомогою текстового редактора:

sudo vi /etc/haproxy/haproxy.cfg

Потім налаштуйте сегменти фронтенд і бекенд відповідно до прикладу нижче:

frontend http_front
   bind *:80
   stats uri /haproxy?stats
   acl url_blog path_beg /blog
   use_backend blog_back if url_blog
   default_backend http_back

backend http_back
   balance roundrobin
   server server_name1 private_ip1:80 check
   server server_name2 private_ip2:80 check

backend blog_back
   server server_name3 private_ip3:80 check

Фронтенд оголошує правило ACL з ім'ям url_blog, яке застосовується до всіх з'єднань із шляхами, що починаються з /blog. Use_backend визначає, що з'єднання, що відповідають умові url_blog, повинні обслуговуватися бекендом з ім'ям blog_back, а решта запитів обробляються бекендом за умовчанням.

З боку бекенда конфігурація встановлює дві групи серверів: http_back, як і раніше, і нову blog_back, яка обслуговує з'єднання з example.com/blog.

Після зміни налаштувань збережіть файл і перезапустіть HAProxy за допомогою наступної команди:

sudo systemctl restart haproxy

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

Тестування налаштування

Коли HAProxy налаштовано та запущено, відкрийте публічну IP-адресу сервера балансувальника навантаження у браузері та перевірте, чи правильно ви підключилися до бекенду. Параметр stats uri конфігурації створює сторінку статистики за вказаною адресою.

http://load_balancer_public_ip/haproxy?stats

Коли ви завантажуєте сторінку статистики, якщо всі ваші сервери відображаються зеленим, налаштування пройшло успішно!

Встановлюємо балансувальник навантаження HAProxy на CentOS

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

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

sudo systemctl status haproxy

Захист сторінки статистики за допомогою пароля

Однак, якщо сторінка статистики просто вказана у фронтенді, вона відкрита для загального огляду, що може виявитися не дуже гарною ідеєю. Натомість ви можете призначити їй власний номер порту, додавши наведений нижче приклад у кінець вашого файлу haproxy.cfg. Замініть ім'я користувача и пароль на щось безпечне:

listen stats
   bind *:8181
   stats enable
   stats uri /
   stats realm Haproxy Statistics
   stats auth username:password

Після додавання нової групи слухачів видаліть старе посилання на stats uri з фронтенду групи. Після завершення збережіть файл і перезапустіть HAProxy.

sudo systemctl restart haproxy

Потім знову відкрийте балансувальник навантаження з новим номером порту та увійдіть до системи з ім'ям користувача та паролем, які ви вказали у файлі конфігурації.

http://load_balancer_public_ip:8181

Переконайтеся, що всі ваші сервери, як і раніше, відображаються зеленим, а потім відкрийте лише IP-балансувальника навантаження без будь-яких номерів портів у вашому браузері.

http://load_balancer_public_ip/

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

Висновок: балансувальник навантаження HAProxy

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

Використовуючи кілька хостів для захисту вашого веб-сервісу за допомогою запасу потужності, сам балансувальник навантаження все одно може становити точку відмови. Ви можете ще більше підвищити високу доступність, встановивши плаваючий IP між кількома балансувальниками навантаження. Ви можете дізнатися більше про це в нашій статті про плаваючі IP-адреси на UpCloud.

Докладніше про курс «Адміністратор Linux. Віртуалізація та кластеризація»***

Джерело: habr.com

Додати коментар або відгук