Выпуск HTTP/TCP-балансировщика HAProxy 2.0
20 июня 2019 года
Опубликован релиз балансировщика нагрузки HAProxy 2.0, позволяющего распределять HTTP-трафик и произвольные TCP-запросы между группой серверов, учитывая множество факторов (например, проверяет доступность серверов, оценивает уровень нагрузки, имеет средства противостояния DDoS) и проводит первичную фильтрацию данных (например, можно разбирать HTTP-заголовки, отфильтровывать передачу некорректных параметров запроса, блокировать подстановку SQL и XSS, подключать агенты обработки контента). HAProxy также может применяться для координации взаимодействия компонентов в системах на базе архитектуры микросервисов. Код проекта написан на языке Си и поставляется под лицензией GPLv2. Проект используется на многих крупных сайтах, включая Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter и Vimeo.
Ключевые особенности выпуска:
- Представлен новый API Data Plan, позволяющий на лету управлять настройками 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 c возможностью разбора потоков 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;
- Добавлена встроенная поддержка экспорта статистики в систему мониторинга Prometheus;
- Расширен протокол 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.
Источники править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.