wydanie balansu obciążenia , umożliwiającego rozdzielanie ruchu HTTP oraz dowolnych zapytań TCP pomiędzy grupą serwerów, biorąc pod uwagę wiele czynników (na przykład sprawdza dostępność serwerów, ocenia poziom obciążenia, ma środki przeciwdziałania DDoS) oraz przeprowadza wstępną filtrację danych (na przykład można analizować nagłówki HTTP, filtrować przekazywanie niepoprawnych parametrów zapytania, blokować wstrzykiwanie SQL i XSS, podłączać agenty przetwarzania treści). HAProxy może również służyć do koordynacji interakcji komponentów w systemach opartych na architekturze mikroserwisów. Kod projektu napisany jest w języku C i na licencji GPLv2. Projekt jest używany na wielu dużych stronach, w tym Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter i Vimeo.
Kluczowe cechy wydania:
- Wprowadzono nowe API , które umożliwia zarządzanie ustawieniami HAProxy w locie za pośrednictwem REST Web API. W tym można dynamicznie dodawać i usuwać backendy i serwery, tworzyć ACL, zmieniać trasowanie zapytań, zmieniać powiązania procesorów z IP;
- Dodano dyrektywę nbthread, która pozwala skonfigurować liczbę wątków używanych w HAProxy w celu optymalizacji pracy na procesorach wielordzeniowych. Domyślnie liczba wątków roboczych jest wybierana w zależności od dostępnych rdzeni CPU w aktualnym środowisku, a w środowiskach chmurowych domyślnie ustawiana jest na jeden wątek. Aby ustawić sztywne limity, dodano opcje kompilacji MAX_THREADS i MAX_PROCS, które ograniczają górny limit liczby wątków i procesów;
- Uproszczono użycie dyrektywy bind do przypisywania procesorów do adresów sieciowych. Przy konfigurowaniu nie jest teraz konieczne określanie parametrów procesu — domyślnie połączenia będą rozdzielane pomiędzy wątki w zależności od liczby aktywnych połączeń.
- Uproszczono konfigurację logów przy uruchamianiu w izolowanych kontenerach — log można teraz skierować do stdout i stderr, a także do dowolnego istniejącego deskryptora pliku (na przykład „log fd@1 local0”);
- Domyślnie włączone jest wsparcie dla HTX (Native HTTP Representation), które zapewnia równoważenie obciążenia w przypadku stosowania zaawansowanych funkcji, takich jak end-to-end HTTP/2, Layer 7 Retries i gRPC. HTX nie zastępuje nagłówków na miejscu, ale ogranicza operację zmiany do usunięcia i dodania nowego nagłówka na końcu listy, co umożliwia manipulowanie jakimikolwiek rozszerzonymi wariantami protokołu HTTP, zachowując pierwotną semantykę nagłówków i umożliwiając uzyskanie wyższej wydajności przy translacji HTTP/2 na HTTP/1.1 i odwrotnie;
- Dodano oficjalne wsparcie dla trybu End-to-End HTTP/2 (przetwarzanie wszystkich etapów w HTTP/2, w tym zapytań do backendu, a nie tylko interakcji proxy z klientem);
- Wprowadzono pełne wsparcie dla dwukierunkowego proxy protokołu gRPC z możliwością analizy strumieni gRPC, wydzielania pojedynczych wiadomości, rejestrowania ruchu gRPC w dzienniku oraz filtrowania wiadomości za pomocą ACL. gRPC umożliwia organizację pracy mikroserwisów w różnych językach programowania, które współdziałają ze sobą za pomocą uniwersalnego API. Interakcja sieciowa w gRPC jest realizowana na bazie protokołu HTTP/2 i opiera się na zastosowaniu Protocol Buffers do serializacji danych.
- Dodano wsparcie dla trybu „Layer 7 Retries”, który umożliwia ponowne wysyłanie żądań HTTP w przypadku błędów programowych, niezwiązanych z problemami nawiązywania połączenia sieciowego (na przykład w przypadku braku odpowiedzi lub pustej odpowiedzi na żądanie POST). Aby wyłączyć tryb, do opcji „http-request” dodano flagę „disable-l7-retry”, a w celu zaawansowanej konfiguracji w sekcjach defaults, listen i backend pojawiła się opcja „retry-on”. Dostępne są następujące przesłanki do ponownego wysłania: all-retryable-errors, none, conn-failure, empty-response, junk-response, response-timeout, 0rtt-rejected, oraz powiązanie z kodami stanu odpowiedzi (404 itd.);
- Wprowadzono nowy menedżer procesów (Process Manager), który umożliwia skonfigurowanie wywołania zewnętrznych plików wykonywalnych z obsługiwaczami dla HAProxy.
Na przykład w postaci takiego zewnętrznego obsługiwacza zrealizowano API Data Plan (/usr/sbin/dataplaneapi), a także różne silniki do przetwarzania strumieni Offload; - Dla .NET Core, Go, Lua i Pythona dodano wiązania do tworzenia rozszerzeń SPOE (Stream Processing Offload Engine) i SPOP (Stream Processing Offload Protocol). Wcześniej wsparcie dla rozwoju rozszerzeń istniało tylko w języku C;
- Dodano zewnętrzny obsługiwacz spoa-mirror ( /usr/sbin/spoa-mirror ) do mirrorowania zapytań na oddzielny serwer (na przykład do kopiowania części ruchu roboczego w celu testowania eksperymentalnego środowiska w rzeczywistym obciążeniu);
- Przedstawiony w celu zapewnienia integracji z platformą Kubernetes;
- Dodano wbudowane wsparcie dla eksportu statystyk do systemu monitorowania, ;
- Rozszerzono protokół Peers Protocol, używany do wymiany informacji z innymi węzłami w HAProxy. W tym dodano wsparcie dla Heartbeat i szyfrowanej transmisji danych;
- Do dyrektywy „log” dodano parametr „sample”, pozwalający na zapisywanie w logu tylko części zapytań, na przykład 1 z 10, do tworzenia analitycznej próbki;
- Dodano tryb automatycznego profilowania (dyrektywa profiling.tasks, która może przyjmować wartości auto, on i off). Automatyczne profilowanie włącza się, gdy średnia wartość opóźnienia przekracza 1000 ms. Aby zobaczyć dane profilowania w API Runtime, dodano polecenie „show profiling” lub istnieje możliwość zresetowania statystyk w logu;
- Dodano wsparcie dla zdalnego dostępu do serwerów backendowych przy użyciu protokołu SOCKS4;
- Dodano końcowe (end-to-end, w swoim przebiegu przetwarzania zapytania, obejmujące backend) wsparcie dla mechanizmu szybkiego otwierania połączeń TCP (TFO — TCP Fast Open, RFC 7413), który pozwala skrócić liczbę kroków nawiązywania połączenia poprzez połączenie w jednym żądaniu pierwszego i drugiego kroku klasycznego 3-etapowego procesu negocjacji połączenia oraz umożliwia wysyłanie danych na wczesnym etapie nawiązywania połączenia;
- Dodano nowe akcje:
- „http-request replace-uri” do zastępowania URL za pomocą wyrażenia regularnego;
- „tcp-request content do-resolve” i „http-request do-resolve” do rozwiązywania nazwy hosta;
- „tcp-request content set-dst” i „tcp-request content set-dst-port” do podstawienia docelowego adresu IP i portu.
- Dodano nowe moduły konwersji:
- aes_gcm_dev do odszyfrowywania strumieni za pomocą algorytmów AES128-GCM, AES192-GCM i AES256-GCM;
- protobuf do wyodrębniania pól z wiadomości Protocol Buffers;
- ungrpc do wyodrębniania pól z wiadomości gRPC.
Źródło: opennet.ru
