Отримання права балансування навантаження за допомогою relayd

Після того, як ви запустили розподіл навантаження за допомогою round-robin

перенаправлення, ви могли помітити, що перенаправлення присходит не автоматично, а адаптується до зовнішніх умов Для прикладу, якщо не прийняті спеціальні заходи,

якщо хост в списку цілей перенаправлення «впав», трафік все ще буде

перенаправлятися на IP адреса в список можливих

Очевидно, що потрібно рішення моніторингу На щастя, базова система OpenBSD надає це Relay демон relayd2 взаімодествіі з вашою PF конфігурацією,

надаючи можливість відсіяти функціонуючі хости з вашого пулу

При введенні relayd в вашу настройку, однак, можуть знадобитися деякі незначні зміни в наборі ваших правил

Realyd демон працює у двох основних класах сервісів, які називаються

редіректи (redirects) і релеї (relays) Він очікує, до тих пір поки у нього не зявиться можливість включити або виключити хости з IP адресами в / з таблицю (и) PF якими

він управляє Демон взаємодіє з набором правил через спеціального призначення

2 Спочатку введений в OpenBSD 41 під назвою hoststated, демон розвивався (в основному Рейк Флетері і Пєр-Ів Ришардом) активно протягом декількох років, у тому числі кілька важливих змін в синтаксисі конфігурації і був перейменований в relayd в релізі OpenBSD 43

якорями званимиrelayd  (І у версіях попередніх OpenBSD 47, також перенаправлення якорем, RDR-якір, називався також)

Побачити як ми можемо зробити наш приклад конфігурації працюючої трохи краще використовуючиrelayd, Ми поглянемо назад в правила розподілу навантаження Почнемо з

вершини вашого pfconf файлу, додамо якір для relayd написавши:

anchor “relayd/*”

У версіях попередніх OpenBSD 47, вам також потрібен якір перенаправлення як цей:

rdr-anchor &quotrelayd/*&quot anchor &quotrelayd/*&quot

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

table webpool persist { 19202214, 19202215, 19202216, 19202217 }

У цьому наборі правил створюється перенаправлення:

match in on $ext_if proto tcp to $webserver port $webports rdr-to &ltwebpool&gt round-robin

Або у версіях попередніх OpenBSD 47 ви повинні використовувати наступне:

rdr on $ext_if proto tcp to $webserver port $webports -&gt &ltwebpool&gt round-robin

Це зробить конфігурацію працюючої більш краще, ми видалимо пренаправленіе і таблицю, і дозволимоrelayd  обробляти перенаправлення шляхом створення своїх власних версій всередині якоря (Не видаляйте дозволяють правила, проте, тому що ваш набір правил буде все ще потрібен, щоб мати разрешющій набір правил, що дозволяє трафіку проходити через таблиці IP адрес relayd)

Після частиниpfconf, Якими ми займалися, ми звертаємося до власної конфігурації файлу relaydconf синтаксис цього конфігураційного файлу достатньо схожий на pfconf, Що робить його досить легко читаним і зрозумілим По-перше, ми додамо визначення макросу, який будемо використовувати пізніше:

web1=&quot19202214&quot

web2=&quot19202215&quot

web3=&quot19202216&quot

web4=&quot19202217&quot webserver=&quot19202227&quot sorry_server=&quot19202200&quot

Всі вони соответсвуют опредленних, які ми могли б помістити в pfconf файл За замовчуванням перевірочний інтервал relayd 10 секунд, що означає, що хост може бути недоступний протягом 10 секунд, поки не буде визначено, що він знаходиться в офлайні Будьте обережні, ми встановимо інтервал у 5 секунда, щоб мінімізувати час простою, наступним рядком:

interval 5 # перевірка хоста кожні 5 секунд

Тепер ми зробимо виклик таблиці webpool, яка використовує багато з наших макросів:

table &ltwebpool&gt { $web1, $web2, $web3, $web4 }

З причин, до яких ми повернемося найближчим часом, ми визначимо ще одну таблицю:

table &ltsorry&gt { $sorry_server }

У цій частині, ми готові встановити перенаправлення:

redirect www {

listen on $webserver port 80 sticky-address tag relayd

forward to &ltwebpool&gt check http &quot/statushtml&quot code 200 timeout 300 forward to &ltsorry&gt timeout 300 check icmp

}

Це говорить, що зєднання на 80 порт повинні бути перенаправлені на інших членів таблиці webpool Опція «липкий» адреса має той же ефект тут, що і з rdr в PF правилах: нове зєднання з того ж самого джерела IP адреси (з тимчасовим інтервлом визначеним у значенніtimeout) Перенаправили на той же хост в пулі бекенда як і в попередньому випадку

Relayd  демон повинен перевіряти видимість, якщо хост доступний, опитувати його відповідно до файлом /statushtml, Використовуючи протокол HTTP, і чекаючи повернення коду рівним 200 Це очікуваний результат для клієнта якого опитують на предмет роботи веб сервера, його файл доступний

Без великих сюрпризів досі, чи не так!Relayd  демон подбати про виключення хостів з таблиця, якщо вони «впадуть» Але що якщо всі хости в webpool таблиці впадуть На щастя розробники передбачили і це також, і ввели концепцію резервування таблиці для сервісів Це остання частина визначення веб сервісу, з таблицею sorry як таблицею резервного копіювання: хости в sorry таблиці беруть на себе все обслуговування, якщо таблиця webpool стає порожньою Це означає, що вам потрібно конфігурувати сервіс, щоб була доступно пропозицію Вибачте, у нас проблеми повідомлення у разі, якщо хости у вашому веб пулі «впадуть» З усіма елементами дествияхrelayd   конфігурації ви можете включити вашу нову конфігурацію Перезапустіть ваш набір правил PF, а потім запустіть relayd Якщо ви хочете перевірити вашу конфігурацію до того як запуститиrelayd  ви можете використовувати опцію-n в командному рядку з relayd:

$ sudo relayd -n

Якщо ваша конфігурація коректна, relayd відобразить повідомлення конфігурація ОК і вийде

Щоб дійсно запустити демона, ми нам не потрібний який-небудь прапор в командному рядку, тому наступний послідовність перезавантажить вашу відредаговану

конфігурацію PF і включить relayd

$ sudo pfctl -f /etc/pfconf

$ sudo relayd

Якщо конфігурація правильна, обидві команди спокійно запустяться, без відображення яких-або повідомлень Ви можете перевірити, що relayd  запущений командами top або ps Під обох випадках, ви знайдете три relayd процесу, приблизно як це:

$ ps waux | grep relayd

_relayd 9153 00 01 776 1424 ? S 7:28PM 0:0001 relayd: pf update engine (relayd)

_relayd 6144 00 01 776 1440 ? S 7:28PM 0:0002 relayd: host check engine (relayd)

root 3217 00 01 776 1416 ? Is 7:28PM 0:0001 relayd: parent (relayd)

Практично у всіх випадках, ви захочете, щоб relayd стартував при завантаженні системи

Ви повинні додати ось цей рядок в свій rcconflocal файл:

relayd_flags=&quot&quot # for normal use: &quot&quot

Однак, як тільки конфігурація включена, то більша частина взаємодії з relayd відбудеться через програму адміністрування relayctl Крім контролю статусу, relayctl дозволить вам завантажуватиrelayd  конфігурацію і вибірково відключати або включати хости, таблиці та сервіси Ви завжди можете подивитися статус сервісу в інтерактивному режимі, приблизно як тут:

$ sudo relayctl show summary Id Type Name Avlblty Status

1 redirect www active

1&nbsp table webpool:80 active (2 hosts) 1 host 19202214 10000% up

2&nbsp host 19202215 000% down 3 host 19202216 10000% up 4 host 19202217 000% down 2 table sorry:80 active (1 hosts) 5 host 127001 10000% up

Як приклад, веб пул серйозно впаде, тільки з двома з чотирьох працюючих хостів На щастя, таблиця бекапа все ще функціонує Усі таблиці активні з принаймні одним працюючим хостом Для таблиць, які вже не мають членів, стовпець статусу зміниться на порожній Запитувана relayctl для хостів інформація відображає інформацію про статус в центральній частині відображення:

$ sudo relayctl show hosts

Id Type Name Avlblty Status

1&nbsp table webpool:80 active (3 hosts) 1 host 19202214 10000% up total: 11340/11340 checks

2&nbsp host 19202215 000% down

total: 0/11340 checks, error: tcp connect failed 3 host 19202216 10000% up

total: 11340/11340 checks

4&nbsp host 19202217 000% down

total: 0/11340 checks, error: tcp connect failed 2 table sorry:80 active (1 hosts)

5&nbsp host 127001 10000% up total: 11340/11340 checks

Якщо вам потрібно взяти хост з пулу на обслуговування (або будь-яку іншу тимчасову операцію), ви можете використовувати relayctl, Щоб виключити їх:

$ sudo relayctl host disable 19202217

У більшості випадків, операція відобразить команду succeeded, Що показує, що операція завершена успішно Після завершення обслуговування і після того, як ви поставите машину в онлайн, ви можете знову включити його в якості частини вашого relayd пулу цією командою:

$ sudo relayctl host enable 19202217

Знову ви повинні були побачити повідомлення команди succeeded майже відразу відобразить, що операція була завершена успішно

На додаток до базового розподілу навантаження, продемонстрованого тут, relayd

має розширену версію у недавній OpenBSD, і пропонує кілька характеристик, які зроблять його привабливим в складніших налаштуваннях Для прикладу, він

може тепер обрабативатьс сьомий рівень проксінг або ретранслювати

функції HTTP і HTTPS, включаючи обробку протоколу з додаванням заголовка і перезапису, додаванням URL шляхи і перезапису, і навіть обробку сесій і куки Обробка протоколу повинна бути адаптована для вашої програми Наприклад, нижче наведений просто HTTPS relay для розподілу навантаження зашифрованого веб трафіку від клієнтів на веб-серверах:

http protocol &quothttpssl&quot {

header append &quot$REMOTE_ADDR&quot to &quotX-Forwarded-For&quot

header append &quot$SERVER_ADDR:$SERVER_PORT&quot to &quotX-Forwarded-By&quot header change &quotKeep-Alive&quot to &quot$TIMEOUT&quot

query hash &quotsessid&quot cookie hash &quotsessid&quot

path filter &quot*command=*&quot from &quot/cgi-bin/indexcgi&quot ssl { sslv2, ciphers &quotMEDIUM:HIGH&quot }

tcp { nodelay, sack, socket buffer 65536, backlog 128 }

}

Це визначення обробника протоколу демонструє ряд простих операцій над заголовками HTTP, а також встановлює і SSL параметри і специфічні TCP параметри для оптимізації обробки сполук Параметри заголовка впливають на

заголовки протоколу, включаючи значення змінних, або приєднання до існуючих заголовкам (додати) або зміна змісту нового значення (зміна)

URL та хеш куки використовується для балансування навантаження, щоб вибрати ті хости, які в пулі цільового запиту перенаправляється Специфіка фільтрації шляху така,

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

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

128 бітний або более3 І нарешті, по-третє, tcp опції nodelay задають мінімізацію затримок, що вказують на використання селективних методів (RFC 2018), і

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

прикладами, в більшості випадків, ваш додаток буде добре працювати з цими налаштуваннями зі значеннями за замовчуванням

Визначення relay c допомогою обробника протоколу означає, що шаблон повинен визначатися в ранньому визначенні веб-служби:

relay wwwssl {

# Run as a SSL accelerator

listen on $webserver port 443 ssl protocol &quothttpssl&quot

table &ltwebhosts&gt loadbalance check ssl

}

Проте вашим веб додаткам з підтримкою SSL, швидше за все, буде вигідно мати трохи інший набір параметрів:

Зауваження:

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

Нарешті, для відмовостійкості хостів заснованої на CARP relayd в мережі (дивіться

«Надмірність і відмовостійкість: CARP і pfsync» на сторінці 119) повинен бути налаштований для підтримки CARP взаємодіючи з установками пониження лічильника CARP для зазначеної групи інтерфейсів при виключенні або запуску Схоже всі частини системи OpenBSD йдуть з інформативними сторінками мінлива Для незграбних варіантів не освітлених тут (є кілька), вивчайте сторінки мінлива для relayd,   relaydconf   іrelayctl,   і починайте експериментувати для пошуку тієї конфігурації, що вам потрібна

Джерело: Книга про PF, by Peter NM Hansteen, Переклад виконав Михайлов Олексій aka iboxjo

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*