rilascio del bilanciatore di carico , che consente di distribuire il traffico HTTP e le richieste TCP arbitrarie tra un gruppo di server, tenendo conto di numerosi fattori (ad esempio, verifica la disponibilità dei server, valuta il carico, include mezzi per contrastare attacchi DDoS) e svolge una prima filtrazione dei dati (ad esempio, è possibile analizzare le intestazioni HTTP, filtrare la trasmissione di parametri di richiesta non validi, bloccare l'iniezione SQL e XSS, connettere agenti di elaborazione dei contenuti). HAProxy può anche per coordinare l'interazione dei componenti nei sistemi basati su architettura a microservizi. Il codice del progetto è scritto in linguaggio C e sotto licenza GPLv2. Il progetto è utilizzato su molti grandi siti, tra cui Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter e Vimeo.
Caratteristiche principali del rilascio:
- È stata introdotta una nuova API , che consente di gestire le impostazioni di HAProxy al volo tramite REST Web API. Include la possibilità di aggiungere e rimuovere dinamicamente backend e server, creare ACL, modificare la routazione delle richieste, modificare i binding dei gestori a IP;
- È stata aggiunta la direttiva nbthread, che consente di configurare il numero di thread utilizzati in HAProxy per ottimizzare l'uso delle CPU multi-core. Per impostazione predefinita, il numero di thread lavoratori viene scelto in base ai core CPU disponibili nell'ambiente attuale e, negli ambienti cloud, viene impostato su un thread. Sono state aggiunte opzioni di compilazione MAX_THREADS e MAX_PROCS per impostare limiti rigidi, limitando il numero massimo di thread e processi.
- È stato semplificato l'uso della direttiva bind per associare i gestori agli indirizzi di rete. Nella configurazione, non è più necessario definire i parametri del processo: per impostazione predefinita, le connessioni verranno distribuite tra i thread in base al numero di connessioni attive.
- È stata semplificata la configurazione dei log durante l'avvio in contenitori isolati: ora il log può essere indirizzato a stdout e stderr, così come a qualsiasi descrittore di file esistente (ad esempio, "log fd@1 local0").
- La supporto HTX (Rappresentazione HTTP Nativa) è abilitato di default, consentendo il bilanciamento quando si utilizzano funzionalità avanzate come HTTP/2 end-to-end, ritentativi Layer 7 e gRPC. HTX non sostituisce gli header in loco, ma riduce l'operazione di modifica all'eliminazione e all'aggiunta di un nuovo header alla fine della lista, il che consente di manipolare qualsiasi variante avanzata del protocollo HTTP, mantenendo la semantica originale degli header e permettendo prestazioni più elevate nella traduzione da HTTP/2 a HTTP/1.1 e viceversa;
- Aggiunta la supporto ufficiale per la modalità End-to-End HTTP/2 (gestione di tutte le fasi in HTTP/2, comprese le richieste al backend, non solo l'interazione tra proxy e client);
- È stata implementata il supporto completo per il proxying bidirezionale del protocollo gRPC, con la possibilità di analizzare i flussi gRPC, separando i singoli messaggi, registrando il traffico gRPC nei log e filtrando i messaggi tramite ACL. gRPC consente di organizzare il funzionamento dei microservizi in diversi linguaggi di programmazione, che interagiscono tra loro tramite un'API universale. L'interazione di rete in gRPC è implementata sopra il protocollo HTTP/2 e si basa sull'uso di Protocol Buffers per la serializzazione dei dati.
- È stata aggiunta la supporto alla modalità "Layer 7 Retries", che consente di inviare nuovamente le richieste HTTP in caso di errori software non correlati a problemi di stabilità della connessione di rete (ad esempio, in assenza di una risposta o di una risposta vuota a una richiesta POST). Per disattivare la modalità, è stato aggiunto il flag "disable-l7-retry" all'opzione "http-request", e per una configurazione più fine, nelle sezioni defaults, listen e backend è stata aggiunta l'opzione "retry-on". I seguenti indicatori sono disponibili per la ritrasmissione: all-retryable-errors, none, conn-failure, empty-response, junk-response, response-timeout, 0rtt-rejected, e legami con i codici di stato restituiti (404 e simili);
- È stato implementato un nuovo gestore dei processi (Process Manager) che consente di configurare l'invocazione di file eseguibili esterni con gestori per HAProxy.
Ad esempio, un gestore esterno è stato realizzato per l'API Data Plan (/usr/sbin/dataplaneapi), insieme a vari motori di offload per il trattamento dei flussi; - Per .NET Core, Go, Lua e Python sono stati aggiunti binding per lo sviluppo di estensioni SPOE (Stream Processing Offload Engine) e SPOP (Stream Processing Offload Protocol). In precedenza, era supportato lo sviluppo di estensioni solo in C;
- È stato aggiunto un gestore esterno spoa-mirror (/usr/sbin/spoa-mirror) per lo specchiamento delle richieste su un server separato (ad esempio, per copiare parte del traffico di lavoro per testare un ambiente sperimentale sotto carico reale);
- Presentato per garantire l'integrazione con la piattaforma Kubernetes;
- È stato aggiunto il supporto integrato per l'esportazione delle statistiche nel sistema di monitoraggio. ;
- È stato ampliato il protocollo Peers Protocol, utilizzato per lo scambio di informazioni con altri nodi HAProxy. È stata aggiunta anche la supporto per Heartbeat e la trasmissione sicura dei dati;
- Nella direttiva «log» è stato aggiunto il parametro «sample», che consente di registrare solo una parte delle richieste, ad esempio 1 su 10, per la creazione di un campione analitico;
- È stata aggiunta una modalità di profilazione automatica (direttiva profiling.tasks, che può assumere i valori auto, on e off). La profilazione automatica viene attivata quando il valore medio della latenza supera il limite di 1000 ms. Per visualizzare i dati di profilazione nell'API Runtime è stata aggiunta il comando «show profiling» o è possibile resettare le statistiche nel log;
- È stato aggiunto il supporto per l'accesso ai server backend utilizzando il protocollo SOCKS4;
- È stato aggiunto il supporto end-to-end (end-to-end, nel proprio percorso di elaborazione della richiesta, coprendo il backend) per il meccanismo di apertura rapida delle connessioni TCP (TFO — TCP Fast Open, RFC 7413), che consente di ridurre il numero di passaggi di impostazione della connessione combinando in una sola richiesta il primo e il secondo passo del classico processo di handshake a 3 fasi e consente l'invio di dati nella fase iniziale della configurazione della connessione;
- Sono state aggiunte nuove azioni:
- «http-request replace-uri» per sostituire l'URL utilizzando espressioni regolari;
- «tcp-request content do-resolve» e «http-request do-resolve» per la risoluzione del nome host;
- «tcp-request content set-dst» e «tcp-request content set-dst-port» per la sostituzione dell'indirizzo IP e della porta di destinazione.
- Aggiunti nuovi moduli di conversione:
- aes_gcm_dev per la decrittazione dei flussi utilizzando gli algoritmi AES128-GCM, AES192-GCM e AES256-GCM;
- protobuf per l'estrazione dei campi dai messaggi dei Protocol Buffers;
- ungrpc per l'estrazione dei campi dai messaggi gRPC.
Fonte: opennet.ru
