Wydanie balansera HTTP/TCP HAProxy 2.0

opublikowany wydanie modułu równoważenia obciążenia HA Proxy 2.0, który pozwala na dystrybucję ruchu HTTP i dowolnych żądań TCP pomiędzy grupą serwerów z uwzględnieniem wielu czynników (m.in. sprawdza dostępność serwerów, ocenia poziom obciążenia, posiada zabezpieczenia DDoS) oraz przeprowadza podstawowe filtrowanie danych ( np. możesz analizować nagłówki HTTP, filtrować transmisję nieprawidłowych parametrów zapytań, blokować podstawienia SQL i XSS, łączyć agenty przetwarzające treść). HAProxy też może stosować do koordynowania interakcji komponentów w systemach opartych na architekturze mikroserwisów. Kod projektu jest napisany w języku C i dostarczane licencjonowany na licencji GPLv2. Projekt jest używany na wielu dużych serwisach, w tym Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter i Vimeo.

Kluczowe funkcje wydania:

  • Wprowadzono nowe API Plan danych, który umożliwia zarządzanie ustawieniami HAProxy na bieżąco poprzez REST Web API. W tym możesz dynamicznie dodawać i usuwać backendy i serwery, tworzyć listy ACL, zmieniać routing żądań, zmieniać powiązania obsługi z IP;
  • Dodano dyrektywę nbthread, która umożliwia skonfigurowanie liczby wątków używanych w HAProxy w celu optymalizacji wydajności na procesorach wielordzeniowych. Domyślnie liczba wątków roboczych jest wybierana w zależności od rdzeni procesora dostępnych w bieżącym środowisku, a w środowiskach chmurowych domyślnie jest to jeden wątek. Aby ustawić twarde limity, dodano opcje montażu MAX_THREADS i MAX_PROCS, ograniczając górny limit liczby wątków i procesów;
  • Uproszczono użycie dyrektywy bind do wiązania procedur obsługi z adresami sieciowymi. Podczas konfiguracji nie jest już konieczne definiowanie parametrów procesu - domyślnie połączenia będą rozdzielane pomiędzy wątki w zależności od liczby aktywnych połączeń.
  • Uproszczono konfigurowanie dzienników podczas pracy w izolowanych kontenerach - dziennik można teraz wysłać na standardowe wyjście i stderr, a także do dowolnego istniejącego deskryptora pliku (na przykład „log fd@1 local0”);
  • Obsługa HTX (natywnej reprezentacji HTTP) jest domyślnie włączona, co pozwala na równoważenie podczas korzystania z zaawansowanych funkcji, takich jak kompleksowe HTTP/2, ponowne próby w warstwie 7 i gRPC. HTX nie zastępuje nagłówków w miejscu, ale ogranicza operację modyfikacji do usunięcia i dodania nowego nagłówka na końcu listy, co pozwala na manipulowanie dowolnymi rozszerzonymi wariantami protokołu HTTP, zachowując oryginalną semantykę nagłówków i umożliwiając aby osiągnąć wyższą wydajność przy tłumaczeniu 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 wywołań do backendu, a nie tylko interakcji pomiędzy proxy a klientem);
  • Zaimplementowano pełną obsługę dwukierunkowego proxy protokołu gRPC z możliwością analizowania strumieni gRPC, podświetlania poszczególnych komunikatów, odzwierciedlania ruchu gRPC w dzienniku i filtrowania komunikatów za pomocą list ACL. gRPC pozwala organizować pracę mikroserwisów w różnych językach programowania, które współdziałają ze sobą za pomocą uniwersalnego API. Komunikacja sieciowa w gRPC jest realizowana w oparciu o protokół HTTP/2 i opiera się na wykorzystaniu buforów protokołu do serializacji danych.
  • Dodano obsługę trybu „Layer 7 Retries”, który umożliwia wysyłanie powtarzających się żądań HTTP w przypadku awarii oprogramowania niezwiązanych z problemami z nawiązaniem połączenia sieciowego (np. w przypadku braku odpowiedzi lub pustej odpowiedzi na żądanie POST). Aby wyłączyć ten tryb, do opcji „http-request” dodano flagę „disable-l7-retry” oraz opcję „retry-on” w celu dostrojenia sekcji ustawień domyślnych, nasłuchiwania i zaplecza. Do ponownego wysłania dostępne są następujące znaki: all-retryable-errors, none, conn-failure, pusta odpowiedź, śmieciowa odpowiedź, limit czasu odpowiedzi, 0rtt-rejected, a także powiązanie z zwracaniem kodów stanu (404 itp.) ;
  • Zaimplementowano nowy menedżer procesów, który pozwala skonfigurować wywoływanie zewnętrznych plików wykonywalnych za pomocą procedur obsługi dla HAProxy.
    Na przykład interfejs Data Plan API (/usr/sbin/dataplaneapi), a także różne silniki przetwarzania strumienia Offload są zaimplementowane w postaci takiego zewnętrznego modułu obsługi;

  • Dodano powiązania dla platform .NET Core, Go, Lua i Python w celu tworzenia rozszerzeń SPOE (Stream Processing Offload Engine) i SPOP (Stream Processing Offload Protocol). Wcześniej rozwój rozszerzeń był obsługiwany tylko w języku C;
  • Dodano zewnętrzną procedurę obsługi spoa-mirror (/usr/sbin/spoa-mirror) do tworzenia kopii lustrzanych żądań na oddzielnym serwerze (na przykład w celu kopiowania części ruchu produkcyjnego w celu testowania środowiska eksperymentalnego pod rzeczywistym obciążeniem);
  • Przesłane przez Kontroler wejścia HAProxy Kubernetes zapewnienie integracji z platformą Kubernetes;
  • Dodano wbudowaną obsługę eksportu statystyk do systemu monitorowania Prometheus;
  • Rozszerzono protokół Peers, służący do wymiany informacji z innymi węzłami, na których działa HAProxy. W tym dodana obsługa Heartbeat i szyfrowanej transmisji danych;
  • Do dyrektywy „log” dodano parametr „sample”, który umożliwia zrzucenie do logu tylko części żądań, np. 1 z 10, w celu utworzenia próbki analitycznej;
  • Dodano tryb automatycznego profilowania (dyrektywa profiling.tasks, która może przyjmować wartości auto, on i off). Automatyczne profilowanie jest włączone, jeśli średnie opóźnienie przekracza 1000 ms. Aby wyświetlić dane profilowania, do Runtime API dodano polecenie „show profiling” lub istnieje możliwość zresetowania statystyk do logu;
  • Dodano obsługę dostępu do serwerów zaplecza przy użyciu protokołu SOCKS4;
  • Dodano kompleksową obsługę mechanizmu szybkiego otwierania połączeń TCP (TFO - TCP Fast Open, RFC 7413), co pozwala ograniczyć liczbę kroków zestawiania połączenia poprzez połączenie pierwszego w jedno żądanie, a drugiego kroku klasyczny 3-etapowy proces negocjacji połączenia i umożliwia przesłanie danych już na początkowym etapie nawiązywania połączenia;
  • Dodano nowe akcje:
    • „http-request zamiany-uri”, aby zastąpić adres URL wyrażeniem regularnym;
    • „tcp-request content do-resolve” i „http-request do-resolve” do rozpoznawania nazwy hosta;
    • „tcp-request content set-dst” i „tcp-request content set-dst-port” w celu zastąpienia docelowego adresu IP i portu.
  • Dodano nowe moduły konwersji:
    • aes_gcm_dev do deszyfrowania strumieni przy użyciu algorytmów AES128-GCM, AES192-GCM i AES256-GCM;
    • protobuf do wyodrębniania pól z komunikatów buforów protokołu;
    • ungrc, aby wyodrębnić pola z wiadomości gRPC.

    Źródło: opennet.ru

Dodaj komentarz