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

Апублікаваны рэліз балансавальніка нагрузкі HA проксі 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 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;
  • Дададзена ўбудаваная падтрымка экспарту статыстыкі ў сістэму маніторынгу Праметэй;
  • Пашыраны пратакол 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

Дадаць каментар