Випуск HTTP/TCP-балансувальника HAProxy 2.0

Опубліковано реліз балансувальника навантаження HA Proxy 2.0, що дозволяє розподіляти HTTP-трафік та довільні TCP-запити між групою серверів, враховуючи безліч факторів (наприклад, перевіряє доступність серверів, оцінює рівень навантаження, має засоби протистояння DDoS) та проводить первинну фільтрацію даних (наприклад, можна розбирати HTTP-заголовки, відфільтровувати передачу некоректних параметрів запиту, блокувати підстановку SQL та XSS, підключати агенти обробки контенту). HAProxy також може застосовуватися для координації взаємодії компонентів у системах з урахуванням архітектури микросервисов. Код проекту написаний мовою Сі та поставляється ліцензія GPLv2. Проект використовується на багатьох великих сайтах, включаючи Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter та Vimeo.

Ключові особливості випуску:

  • Представлено новий API План даних, що дозволяє на льоту керувати налаштуваннями HAProxy через REST Web API. У тому числі можна динамічно додавати та видаляти бекенди та сервери, створювати ACL, змінювати маршрутизацію запитів, змінювати прив'язки обробників до IP;
  • Додано директиву nbthread, що дозволяє налаштувати кількість потоків, що використовуються в HAProxy для оптимізації роботи на багатоядерних CPU. За промовчанням кількість робочих потоків вибирається залежно від доступних у поточному оточенні ядер CPU, а в хмарних оточеннях за умовчанням встановлюється один потік. Для завдання жорстких лімітів додані складальні опції MAX_THREADS і MAX_PROCS, що обмежують верхню межу числа потоків і процесів;
  • Спрощено використання директиви bind для прив'язки обробників до мережевих адрес. При налаштуванні тепер не обов'язково визначення параметрів процесу — за умовчанням з'єднання розподілятимуться потоками залежно від кількості активних з'єднань.
  • Спрощено налаштування логів при запуску в ізольованих контейнерах - лог тепер можна направити в stdout і stderr, а також будь-який існуючий файловий дескриптор (наприклад, «log fd@1 local0»);
  • За умовчанням включена підтримка HTX (Native HTTP Representation), що дозволяє забезпечити балансування при застосуванні розширених можливостей, таких як end-to-end HTTP/2, Layer 7 Retries та gRPC. HTX не замінює заголовки за місцем, а зводить операцію зміни до видалення та додавання нового заголовка в кінець списку, що дозволяє маніпулювати будь-якими розширеними варіантами протоколу HTTP, зберігаючи вихідну семантику заголовків і дозволяючи досягти більш високої продуктивності при трансляції HTTP/2 і HTTP/1.1. навпаки;
  • Додана офіційна підтримка режиму End-to-End HTTP/2 (обробка всіх стадій у HTTP/2, у тому числі звернень до бекенду, а не лише взаємодія проксі з клієнтом);
  • Реалізовано повну підтримку двонаправленого проксування протоколу gRPC з можливістю розбору потоків gRPC, виділяючи окремі повідомлення, відображаючи gRPC-трафік у лозі та відфільтровуючи повідомлення за допомогою ACL. gRPC дозволяє організувати роботу мікросервісів різними мовами програмування, які взаємодіють між собою за допомогою універсального API. Мережа взаємодія в gRPC реалізована поверх протоколу HTTP/2 і базується на застосуванні Protocol Buffers для серіалізації даних.
  • Додана підтримка режиму «Layer 7 Retries», що дозволяє надсилати повторні HTTP-запити у разі програмних збоїв, не пов'язаних із проблемами встановлення мережного з'єднання (наприклад, за відсутності відповіді або порожньої відповіді на POST-запит). Для відключення режиму до опції «http-request» доданий прапор «disable-l7-retry», а для тонкого налаштування в секціях defaults, listen та backend з'явилася опція «retry-on». Доступні такі ознаки для повторного відправлення: all-retryable-errors, none, conn-failure, empty-response, junk-response, response-timeout, 0rtt-rejected, а також прив'язка до кодів стану, що повертаються (404 і т.п.) ;
  • Реалізовано новий менеджер процесів (Process Manager), що дозволяє налаштувати виклик зовнішніх файлів, що виконуються з обробниками для HAProxy.
    Наприклад, у вигляді такого зовнішнього оброблювача реалізований API Data Plan (/usr/sbin/dataplaneapi), а також різні двигуни Offload-обробки потоків;

  • Для .NET Core, Go, Lua та Python додані біндинги для розробки розширень SPOE (Stream Processing Offload Engine) та SPOP (Stream Processing Offload Protocol). Раніше підтримувалась розробка розширення тільки на Сі;
  • Додано зовнішній обробник spoa-mirror (/usr/sbin/spoa-mirror) для дзеркалування запитів на окремий сервер (наприклад, для копіювання частини робочого трафіку для тестування експериментального оточення на реальному навантаженні);
  • представлений HAProxy Kubernetes Ingress Controller для забезпечення інтеграції із платформою Kubernetes;
  • Додано вбудовану підтримку експорту статистики до системи моніторингу Прометей;
  • Розширено протокол Peers Protocol, який використовується для обміну інформацією з іншими вузлами з HAProxy. У тому числі додано підтримку Heartbeat та шифрованої передачі даних;
  • У директиву «log» доданий параметр «sample», що дозволяє скидати в балку лише частину запитів, наприклад 1 з 10, для формування аналітичної вибірки;
  • Додано режим автоматичного профілювання (директива profiling.tasks, яка може приймати значення auto, on та off). Автоматичне профілювання включається, якщо середня величина затримки перевищує позначку в 1000 мс. Для перегляду даних профілю в Runtime API додана команда show profiling або є можливість скидання статистики в лог;
  • Додано підтримку звернення до бекенд-серверів з використанням протоколу SOCKS4;
  • Додано кінцеву (end-to-end, на своєму шляху обробки запиту, охоплюючи бекенд) підтримка механізму швидкого відкриття TCP-з'єднань (TFO — TCP Fast Open, RFC 7413), який дозволяє скоротити число кроків встановлення з'єднання за рахунок комбінування в один запит першого і другого кроків класичного 3-етапного процесу узгодження з'єднання та дає можливість надсилання даних на початковому етапі встановлення з'єднання;
  • Додані нові дії:
    • "http-request replace-uri" для заміни URL з використанням регулярного виразу;
    • "tcp-request content do-resolve" та "http-request do-resolve" для резолвінгу імені хоста;
    • "tcp-request content set-dst" та "tcp-request content set-dst-port" для встановлення цільової IP-адреси та порту.
  • Додані нові модулі конвертування:
    • aes_gcm_dev для розшифрування потоків з використанням алгоритмів AES128-GCM, AES192-GCM та AES256-GCM;
    • protobuf для отримання полів з повідомлень Protocol Buffers;
    • ungrpc для отримання полів з повідомлень gRPC.

    Джерело: opennet.ru

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