У цій статті ми розглянемо настройку відмовостійкої конфігурації з двох проксі серверів squid для доступу користувачів в Інтернет з корпоративної мережі з простою балансуванням навантаження через Round Robin DNS. Для побудови відмовостійкої конфігурації ми створимо HA-кластер за допомогою keepalived.
HA-кластер - це група серверів із закладеною надмірністю, яка створюється з метою мінімізації часу простою додатки, в разі апаратних або програмних проблем одного з членів групи. Виходячи з цього визначення, для роботи HA-кластера необхідно реалізувати наступне:
- Перевірка стану серверів;
- Автоматичне перемикання ресурсів в разі відмови сервера;
Обидві ці завдання дозволяє виконати keepalived. Keepalived - системний демон на Linux системах, що дозволяє організувати відмовостійкість сервісу та балансування навантаження. Відмовостійкість досягається за рахунок "плаваючого» IP адреси, який переключається на резервний сервер у разі відмови основного. Для автоматичного перемикання IP адреси між серверами keepalived використовується протокол VRRP (Virtual Router Redundancy Protocol), він стандартизований, описаний в RFC (https://www.ietf.org/rfc/rfc2338.txt).
зміст:
- Принципи роботи протоколу VRRP
- Установка і настройка keepalived на CentOS
- Keepalived: відстеження стану додатків і інтерфейсів
- Keepalived: тестування перемикання при відмові
Принципи роботи протоколу VRRP
В першу чергу потрібно розглянути теорію і основні визначення протоколу VRRP.
- VIP - Virtual IP, віртуальний IP адреса, який може автоматично перемикатися між серверами в разі збоїв;
- Master - сервер, на якому в даний момент активний VIP;
- Backup - сервера на які переключиться VIP, в разі збою майстра;
- VRID - Virtual Router ID, сервера об'єднані загальним віртуальним IP (VIP) утворюють так званий віртуальний роутер, унікальний ідентифікатор якого, приймає значення від 1 до 255. Сервер може одночасно перебувати в кількох VRID, при цьому для кожної VRID повинні використовуватися унікальні віртуальні IP адреси.
Загальний алгоритм роботи:
- Master сервер із заданим інтервалом відправляє VRRP пакети на зарезервований адресу multicast (многоадресной) розсилки 224.0.0.18, а все slave сервера слухають цю адресу. Multicast розсилка - це коли відправник один, а одержувачів може бути багато.
важливо. Для роботи серверів в режимі multicast, мережеве обладнання повинно підтримувати передачу multicast трафіка. - Якщо Slave сервер не отримує пакети, він починає процедуру вибору Master і якщо він переходить в стан Master за пріоритетом, то активує VIP і отруює gratuitous ARP. Gratuitous ARP - це особливий вид ARP відповіді, який оновлює MAC таблицю на підключених комутаторах, щоб проінформувати про зміну власника віртуального IP адреси і mac адреси для перенаправлення трафіку.
Установка і настройка keepalived на CentOS
Встановлення та налаштування будемо проводити на прикладі серверів proxy-serv01 і proxy-serv02 на Centos 7 з встановленим Squid. У нашій схемі ми будемо використовувати найпростіший спосіб розподілу (балансування) навантаження - Round Robin DNS. Цей спосіб передбачає, що для одного імені в DNS реєструється кілька IP адрес, і клієнти, при запиті отримують по черзі спочатку одну адресу, а потім другий. Тому нам знадобиться два віртуальних IP адреси, які будуть зареєстровані в DNS на одне ім'я і на які в підсумку будуть звертатися клієнти. Схема мережі:
У кожного Linux сервера є два фізичних мережевих інтерфейсу: eth1 з білим IP адресою і доступом в Інтернет, і eth0 в локальній мережі.
В якості реальних IP адрес серверів використовуються:
192.168.2.251 - для proxy-server01
192.168.2.252 - для proxy-server02
Як віртуальних IP адрес, які будуть автоматично перемикатися між серверами в разі збоїв використовуються:
192.168.2.101
192.168.2.102
Встановити пакет keepalived потрібно на обох серверах, командою:
yum install keepalived
Після завершення установки на обох серверах правимо конфігураційний файл
/etc/keepalived/keepalived.conf
Кольором виділені рядки з відмінними параметрами:
на сервері proxy-serv01 | на сервері proxy-serv02 |
Розберемо опції більш докладно:
- vrrp_instance - секція, яка визначає екземпляр VRRP;
- state - початковий стан при запуску;
- interface - інтерфейс, на якому буде працювати VRRP;
- virtual_router_id - унікальний ідентифікатор VRRP примірника, повинен збігатися на всіх серверах;
- priority - задає пріоритет при виборі MASTER, сервер з великим пріоритетом стає MASTER;
- virtual_ipaddress - блок віртуальних IP адрес, які будуть активні на сервері в стані MASTER. Повинні збігатися на всіх серверах всередині VRRP примірника.
Якщо поточна мережева конфігурація не дозволяє використовувати multicast, в keepalived є можливість використовувати unicast, тобто передавати VRRP пакети безпосередньо серверів, які задаються списком. Щоб використовувати unicast, знадобляться опції:
- unicast_src_ip - адреса джерело для VRRP пакетів;
- unicast_peer - блок IP адрес серверів, на які будуть розсилатися VRPP пакети.
Таким чином, наша конфігурація визначає два VRRP примірника, proxy_ip1 і proxy_ip2. При штатній роботі, сервер proxy-serv01 буде MASTER для віртуального IP 192.168.2.101 і BACKUP для 192.168.2.102, а сервер proxy-serv02 навпаки, буде MASTER для віртуального IP 192.168.2.102, і BACKUP для 192.168.2.101.
Якщо на сервері активований файрвол, то потрібно додати дозволяють правила для multicast трафіку і vrrp протоколу за допомогою iptables:
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
Активуємо автозавантаження і запустимо службу keepalived на обох серверах:
systemctl enable keepalived
systemctl start keepalived
Після запуску служби keepalived, віртуальні IP будуть присвоєні інтерфейсів з конфігураційного файлу. Подивимося поточні IP адреси на інтерфейсі eth0 серверів:
ip a show eth0
На сервері proxy-serv01:
На сервері proxy-serv02:
Keepalived: відстеження стану додатків і інтерфейсів
Завдяки протоколу VRRP штатно забезпечується моніторинг стану сервера, наприклад, при повному фізичному відмову сервера, або мережевого порту на сервері або комутаторі. Однак, можливі й інші проблемні ситуації:
- помилка в роботі служби проксі сервера - клієнти, які потраплять на віртуальний адреса цього сервера, будуть отримувати повідомлення в браузері з помилкою, що проксі сервер недоступний;
- відмова в роботі другого інтерфейсу в інтернет - клієнти, які потраплять на віртуальний адреса цього сервера, будуть отримувати повідомлення в браузері з помилкою, що не вдалося встановити з'єднання.
Для обробки перерахованих вище ситуацій, скористаємося наступними опціями:
- track_interface - моніторинг стану інтерфейсів, переводить VRRP екземпляр в стан FAULT, якщо один з перерахованих інтерфейсів знаходиться в стані DOWN;
- track_script - моніторинг з використанням скрипта, який повинен повертати 0 якщо перевірка завершилася успішно, 1 - якщо перевірка завершилася з помилкою.
Оновимо конфігурацію, додамо моніторинг інтерфейсу eth1 (за замовчуванням, VRRP екземпляр буде перевіряти інтерфейс, до якого він прив'язаний, тобто в поточній конфігурації eth0):
track_interface eth1
Директива track_script запускає скрипт з параметрами, визначеними в блоці vrrp_script, який має такий вигляд:
vrrp_script script interval - періодичність запуску скрипта, за замовчуванням 1 секунда fall - кількість разів, яке скрипт повернувся не нульове значення, при якому перейти в стан FAULT rise - кількість разів, яке скрипт повернув нульове значення, при якому вийти зі стану FAULT timeout - час очікування, поки скрипт поверне результат, після якого повернути нульове значення. weight - значення, на яке буде зменшений пріоритет сервера, в разі переходу в стан FAULT. За умовчанням 0, що означає, що сервер перейде в стан FAULT, після невдалого виконання скрипта за кількість разів, певне параметром fall.
Налаштуємо моніторинг роботи Squid. Перевірити, що процес активний, можна командою:
squid -k check
створимо vrrp_script, з параметрами періодичності виконання кожні 3 секунди. Цей блок визначається за межами блоків vrrp_instance.
vrrp_script chk_squid_service script "/ usr / sbin / squid -k check" interval 3
Додамо наш скрипт в моніторинг, всередині обох блоків vrrp_instance:
track_script chk_squid_service
Тепер при помилку в роботі служби проксі Squid, віртуальний IP адреса переключиться на інший сервер.
Ви можете додати додаткові дії при зміні стану сервера.
Якщо Squid налаштований на прийом підключень з будь-якого інтерфейсу, тобто http_port 0.0.0.0:3128, то при перемиканні віртуального IP адреси, ніяких проблем не виникне, Squid буде приймати підключення на нову адресу. Але, якщо налаштовані конкретні IP адреси, наприклад:
http_port 192.168.2.101:3128 http_port 192.168.2.102:3128
то Squid не знатиме про те, що в системі з'явився новий адресу, на якому потрібно слухати запити від клієнтів. Для обробки подібних ситуацій, коли потрібно скористатися додатковими функціями при перемиканні віртуального IP адреси, в keepalived закладена можливість виконання скрипта при настанні події зміни стану сервера, наприклад, з MASTER на BACKUP, або навпаки. Реалізується опцією:
notify "шлях до виконуваного файлу"
Keepalived: тестування перемикання при відмові
Після настройки віртуальних IP, перевіримо, наскільки коректно відбувається обробка збоїв. Перша перевірка - імітація збою одного з серверів. Відключимо від мережі внутрішній мережевий інтерфейс eth0 сервера proxy-serv01, при цьому він перестане відправляти VRRP пакети і сервер proxy-serv02 повинен активувати у себе віртуальний IP адреса 192.168.2.101. Результат перевіримо командою:
ip a show eth0
На сервері proxy-serv01:
На сервері proxy-serv02:
Як і очікувалося, сервер proxy-serv02 активував у себе віртуальний IP адреса 192.168.2.101. Подивимося, що при цьому відбувалося в логах, командою:
cat / var / log / messages | grep -i keepalived
на сервері proxy-serv01 | на сервері proxy-serv02 |
Keepalived_vrrp [xxxxx]: Kernel is reporting: interface eth0 DOWN Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering FAULT STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) removing protocol VIPs. Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Now in FAULT state | Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Transition to MASTER STATE |
Keepalived отримує сигнал, що інтерфейс eth0 знаходиться в стані DOWN, і переводить VRRP екземпляр proxy_ip1 в стан FAULT, звільняючи віртуальні IP адреси. | Keepalived переводить VRRP екземпляр proxy_ip1 в стан MASTER, активує адресу 192.168.2.101 на інтерфейсі eth0 і відправляє gratuitous ARP. |
І перевіримо, що після включення в мережу інтерфейсу eth0 на сервері proxy-serv01, віртуальний IP 192.168.2.101 переключиться назад.
на сервері proxy-serv01 | на сервері proxy-serv02 |
Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) forcing a new MASTER election Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Transition to MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) setting protocol VIPs. Keepalived_vrrp [xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101 | Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Received advert with higher priority 255, ours 100 Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering BACKUP STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) removing protocol VIPs. |
Keepalived отримує сигнал про відновлення інтерфейсу eth0 і починає нові вибори MASTER для VRRP примірника proxy_ip1. Після переходу в стан MASTER, активує адресу 192.168.2.101 на інтерфейсі eth0 і відправляє gratuitous ARP. | Keepalived отримує пакет з великим пріоритетом для VRRP примірника proxy_ip1 і переводить proxy_ip1 в стан BACKUP і звільняє віртуальні IP адреси. |
Друга перевірка - імітація збою інтерфейсу зовнішній мережі, для цього відключимо від мережі зовнішній мережевий інтерфейс eth1 сервера proxy-serv01. Результат перевірки проконтролюємо по логам.
на сервері proxy-serv01 | на сервері proxy-serv02 |
Keepalived_vrrp [xxxxx]: Kernel is reporting: interface eth1 DOWN Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering FAULT STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) removing protocol VIPs. Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Now in FAULT state | Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Transition to MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) setting protocol VIPs. Keepalived_vrrp [xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101 |
Keepalived отримує сигнал, що інтерфейс eth1 знаходиться в стані DOWN, і переводить VRRP екземпляр proxy_ip1 в стан FAULT, звільняючи віртуальні IP адреси. | Keepalived переводить VRRP екземпляр proxy_ip1 в стан MASTER, активує адресу 192.168.2.101 на інтерфейсі eth0 і відправляє gratuitous ARP. |
Третя перевірка - імітація збою роботи служби проксі Squid, для цього вручну залишимо службу командою: systemctl stop squid
Результат перевірки проконтролюємо по логам.
на сервері proxy-serv01 | на сервері proxy-serv02 |
Keepalived_vrrp [xxxxx]: VRRP_Script (chk_squid_service) failed Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering FAULT STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) removing protocol VIPs. Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Now in FAULT state | Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Transition to MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) Entering MASTER STATE Keepalived_vrrp [xxxxx]: VRRP_Instance (proxy_ip1) setting protocol VIPs. Keepalived_vrrp [xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101 |
Скрипт перевірки активності служби проксі squid завершується з помилкою. Keepalived переводить VRRP екземпляр proxy_ip1 в стан FAULT, звільняючи віртуальні IP адреси. | Keepalived переводить VRRP екземпляр proxy_ip1 в стан MASTER, активує адресу 192.168.2.101 на інтерфейсі eth0 і відправляє gratuitous ARP. |
Всі три перевірки пройдено успішно, keepalived налаштований коректно. У продовженні цієї статті буде зроблена настройка HA-кластера за допомогою Pacemaker, і розглянута специфіка кожного з цих інструментів.
Підсумковий конфігураційний файл /etc/keepalived/keepalived.conf для сервера proxy-serv01:
vrrp_script chk_squid_service script "/ usr / sbin / squid -k check" interval 3 vrrp_instance proxy_ip1 state MASTER interface eth0 virtual_router_id 1 priority 255 virtual_ipaddress 192.168.2.101/24 dev eth0 label eth0: 1 track_interface eth1 track_script chk_squid_service vrrp_instance proxy_ip2 state BACKUP interface eth0 virtual_router_id 2 priority 100 virtual_ipaddress 192.168.2.102/24 dev eth0 label eth0: 2 track_interface eth1 track_script chk_squid_service
Підсумковий конфігураційний файл /etc/keepalived/keepalived.conf для сервера proxy-serv02:
vrrp_script chk_squid_service script "/ usr / sbin / squid -k check" interval 3 vrrp_instance proxy_ip1 state BACKUP interface eth0 virtual_router_id 1 priority 100 virtual_ipaddress 192.168.2.101/24 dev eth0 label eth0: 1 track_interface eth1 track_script chk_squid_service vrrp_instance proxy_ip2 state MASTER interface eth0 virtual_router_id 2 priority 255 virtual_ipaddress 192.168.2.102/24 dev eth0 label eth0: 2 track_interface eth1 track_script chk_squid_service