Netramesh ā€“ viegls servisa tÄ«kla risinājums

Pārejot no monolītas lietojumprogrammas uz mikropakalpojumu arhitektūru, mēs saskaramies ar jauniem izaicinājumiem.

MonolÄ«tā lietojumprogrammā parasti ir diezgan viegli noteikt, kurā sistēmas daļā radusies kļūda. Visticamāk, problēma ir paŔā monolÄ«ta kodā vai datu bāzē. Bet, kad mēs sākam meklēt problēmu mikropakalpojumu arhitektÅ«rā, viss vairs nav tik acÄ«mredzams. Mums ir jāatrod viss ceļŔ, kas tika veikts pieprasÄ«jumam no sākuma lÄ«dz beigām, un jāatlasa tas no simtiem mikropakalpojumu. Turklāt daudziem no tiem ir arÄ« savas krātuves, kas var izraisÄ«t arÄ« loÄ£iskas kļūdas, kā arÄ« problēmas ar veiktspēju un kļūdu toleranci.

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Es jau ilgu laiku meklēju rÄ«ku, kas palÄ«dzētu tikt galā ar Ŕādām problēmām (par to rakstÄ«ju HabrĆ©: 1, 2), bet beigās es izveidoju savu atvērtā pirmkoda risinājumu. Å ajā rakstā es runāju par pakalpojumu tÄ«kla pieejas priekÅ”rocÄ«bām un dalos ar jaunu rÄ«ku tās ievieÅ”anai.

Izkliedētā izsekoÅ”ana ir izplatÄ«ts risinājums kļūdu atraÅ”anas problēmai sadalÄ«tajās sistēmās. Bet ko darÄ«t, ja Ŕī pieeja informācijas vākÅ”anai par tÄ«kla mijiedarbÄ«bu sistēmā vēl nav ieviesta vai, vēl ļaunāk, daļā sistēmas tā jau darbojas pareizi, bet daļēji ne, jo tā nav pievienota veciem pakalpojumiem. ? Lai noteiktu precÄ«zu problēmas cēloni, ir nepiecieÅ”ams pilnÄ«gs priekÅ”stats par to, kas notiek sistēmā. ÄŖpaÅ”i svarÄ«gi ir saprast, kuri mikropakalpojumi ir iesaistÄ«ti galvenajos biznesam kritiskajos ceļos.

Å eit mums var palÄ«dzēt pakalpojumu tÄ«kla pieeja, kas tiks galā ar visām tÄ«kla informācijas vākÅ”anas maŔīnām zemākā lÄ«menÄ«, nekā darbojas paÅ”i pakalpojumi. Å Ä« pieeja ļauj mums pārtvert visu trafiku un analizēt to lidojuma laikā. Turklāt lietojumprogrammām pat nekas par to nav jāzina.

Servisa tīkla pieeja

Pakalpojumu tÄ«kla pieejas galvenā ideja ir tÄ«klam pievienot vēl vienu infrastruktÅ«ras slāni, kas ļaus mums veikt jebkādas darbÄ«bas ar starppakalpojumu mijiedarbÄ«bu. Lielākā daļa implementāciju darbojas Ŕādi: katram mikropakalpojumam tiek pievienots papildu blakusvāģa konteiners ar caurspÄ«dÄ«gu starpniekserveri, caur kuru tiek nodota visa pakalpojuma ienākoŔā un izejoŔā trafika. Un tieÅ”i Å”eit mēs varam veikt klientu lÄ«dzsvaroÅ”anu, piemērot droŔības politikas, noteikt pieprasÄ«jumu skaita ierobežojumus un apkopot svarÄ«gu informāciju par pakalpojumu mijiedarbÄ«bu ražoÅ”anā.

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Risinājumi

Å ai pieejai jau ir vairāki varianti: Istio Šø linkerd2. Tie nodroÅ”ina daudzas funkcijas no kastes. Bet tajā paŔā laikā ir lielas pieskaitāmās izmaksas resursiem. Turklāt, jo lielākā klasterÄ« darbojas Ŕāda sistēma, jo vairāk resursu bÅ«s nepiecieÅ”ams jaunās infrastruktÅ«ras uzturÄ“Å”anai. Uzņēmumā Avito mēs pārvaldām kubernetes klasterus, kuros ir tÅ«kstoÅ”iem pakalpojumu gadÄ«jumu (un to skaits turpina strauji pieaugt). PaÅ”reizējā ievieÅ”anā Istio patērē ~ 300 Mb RAM uz vienu pakalpojuma gadÄ«jumu. Pateicoties lielajam iespēju skaitam, caurskatāmā balansÄ“Å”ana ietekmē arÄ« kopējo pakalpojumu reakcijas laiku (lÄ«dz 10ms).

Rezultātā mēs apskatÄ«jām, kādas tieÅ”i iespējas mums Å”obrÄ«d ir vajadzÄ«gas, un nolēmām, ka galvenais iemesls, kāpēc sākām ieviest Ŕādus risinājumus, bija iespēja caurskatāmi savākt izsekoÅ”anas informāciju no visas sistēmas. Mēs arÄ« vēlējāmies kontrolēt pakalpojumu mijiedarbÄ«bu un veikt dažādas manipulācijas ar galvenēm, kas tiek pārsÅ«tÄ«tas starp pakalpojumiem.

Rezultātā mēs nonācām pie sava lēmuma:ā€Š Netramesh.

Netramesh

Netramesh ir viegls pakalpojumu tīkla risinājums ar iespēju bezgalīgi mērogot neatkarīgi no pakalpojumu skaita sistēmā.

Jaunā risinājuma galvenie mērÄ·i bija zemas pieskaitāmās izmaksas un augsta veiktspēja. Starp galvenajām funkcijām mēs nekavējoties vēlējāmies, lai mÅ«su Jaeger sistēmai bÅ«tu iespēja pārredzami nosÅ«tÄ«t izsekoÅ”anas posmus.

MÅ«sdienās lielākā daļa mākoņa risinājumu tiek ieviesti Golangā. Un, protams, tam ir iemesli. TÄ«kla lietojumprogrammu rakstÄ«Å”ana Golangā, kas darbojas asinhroni ar I/O un pēc vajadzÄ«bas mērogojas starp kodoliem, ir ērti un diezgan vienkārÅ”i. Un, kas ir arÄ« ļoti svarÄ«gi, veiktspēja ir pietiekama, lai atrisinātu Å”o problēmu. Tāpēc arÄ« izvēlējāmies Golangu.

ŠŸŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøтŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ

Mēs esam koncentrējuÅ”i savus centienus uz maksimālās produktivitātes sasniegÅ”anu. Risinājumam, kas tiek izvietots blakus katram pakalpojuma gadÄ«jumam, ir nepiecieÅ”ams neliels RAM un CPU laika patēriņŔ. Un, protams, arÄ« reakcijas aizkavei jābÅ«t nelielai.

Paskatīsimies, kādus rezultātus saņēmām.

RAM

Netramesh patērē ~ 10 Mb bez trafika un 50 Mb maksimāli ar slodzi lÄ«dz 10000 XNUMX RPS vienā eksemplārā.

Istio sÅ«tņa starpniekserveris vienmēr patērē ~300Mb mÅ«su klasteros ar tÅ«kstoÅ”iem gadÄ«jumu. Tas neļauj to mērogot uz visu klasteru.

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Izmantojot Netramesh, atmiņas patēriņŔ ir samazinājies ~ 10x.

CPU

CPU lietojums ir salÄ«dzinoÅ”i vienāds ar slodzi. Tas ir atkarÄ«gs no pieprasÄ«jumu skaita laika vienÄ«bā blakusvāģim. VērtÄ«bas pie 3000 pieprasÄ«jumiem sekundē maksimumā:

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Ir vēl viens svarÄ«gs punkts: Netramesh - risinājums bez vadÄ«bas plaknes un bez slodzes nepatērē CPU laiku. Izmantojot Istio, blakusvāģi vienmēr atjaunina servisa galapunktus. Rezultātā mēs varam redzēt Å”o attēlu bez slodzes:

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Saziņai starp pakalpojumiem mēs izmantojam HTTP/1. Istio reakcijas laika pieaugums, izmantojot starpniekserveri, bija lÄ«dz 5-10 ms, kas ir diezgan daudz pakalpojumiem, kas ir gatavi atbildēt milisekundē. Izmantojot Netramesh, Å”is laiks ir samazinājies lÄ«dz 0.5-2 ms.

Mērogojamība

Katra starpniekservera patērētais nelielais resursu apjoms ļauj to novietot blakus katram pakalpojumam. Netramesh tika ar nolÅ«ku izveidots bez vadÄ«bas plaknes komponenta, lai katrs blakusvāģis bÅ«tu viegls. Bieži vien servisa tÄ«kla risinājumos vadÄ«bas plakne izplata servisa atklāŔanas informāciju katrai blakusvāģim. Kopā ar to ir informācija par taimautiem un balansÄ“Å”anas iestatÄ«jumiem. Tas viss ļauj paveikt daudz noderÄ«gu lietu, taču diemžēl tas uzpÅ«Å” blakusvāģus.

Pakalpojuma atklāŔana

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Netramesh nepievieno nekādus papildu mehānismus pakalpojumu atklāŔanai. Visa satiksme tiek nodroŔināta pārredzami caur netra blakusvāģi.

Netramesh atbalsta HTTP/1 lietojumprogrammu protokolu. Lai to definētu, tiek izmantots konfigurējams portu saraksts. Parasti sistēmai ir vairāki porti, caur kuriem notiek HTTP sakari. Piemēram, pakalpojumu un ārējo pieprasījumu mijiedarbībai izmantojam 80, 8890, 8080. Šajā gadījumā tos var iestatīt, izmantojot vides mainīgo. NETRA_HTTP_PORTS.

Ja izmantojat Kubernetes kā organizētāju un tā pakalpojuma entÄ«tijas mehānismu klastera iekŔējai saziņai starp pakalpojumiem, mehānisms paliek tieÅ”i tāds pats. Pirmkārt, mikropakalpojums iegÅ«st pakalpojuma IP adresi, izmantojot kube-dns, un atver jaunu savienojumu ar to. Å is savienojums vispirms tiek izveidots ar vietējo netra blakusvāģi, un visas TCP paketes sākotnēji nonāk pie netra. Pēc tam netra blakusvāģis izveido savienojumu ar sākotnējo galamērÄ·i. NAT uz pod IP mezglā paliek tieÅ”i tāds pats kā bez netras.

Izplatīta izsekoŔana un konteksta pārsūtīŔana

Netramesh nodroÅ”ina funkcionalitāti, kas nepiecieÅ”ama, lai nosÅ«tÄ«tu HTTP mijiedarbÄ«bas izsekoÅ”anas posmus. Netra-sidecar parsē HTTP protokolu, mēra pieprasÄ«jumu aizkaves un iegÅ«st nepiecieÅ”amo informāciju no HTTP galvenēm. Galu galā mēs iegÅ«stam visas pēdas vienā Jaeger sistēmā. PrecÄ«zai konfigurācijai varat izmantot arÄ« vides mainÄ«gos, ko nodroÅ”ina oficiālā bibliotēka jaeger go bibliotēkā.

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Bet ir problēma. Kamēr pakalpojumi neÄ£enerēs un nenosÅ«tÄ«s Ä«paÅ”u Uber galveni, mēs neredzēsim saistÄ«tos izsekoÅ”anas posmus sistēmā. Un tas ir nepiecieÅ”ams, lai ātri atrastu problēmu cēloni. Å eit atkal Netramesh ir risinājums. Starpniekserveri nolasa HTTP galvenes un, ja tajos nav Uber izsekoÅ”anas ID, Ä£enerē to. Netramesh arÄ« saglabā informāciju par ienākoÅ”ajiem un izejoÅ”ajiem pieprasÄ«jumiem blakusvāģī un saskaņo tos, bagātinot tos ar nepiecieÅ”amajām izejoÅ”o pieprasÄ«jumu galvenēm. Viss, kas jums jādara pakalpojumos, ir jānosÅ«ta tikai viena galvene X-Request-Id, ko var konfigurēt, izmantojot vides mainÄ«go NETRA_HTTP_REQUEST_ID_HEADER_NAME. Lai kontrolētu konteksta lielumu programmā Netramesh, varat iestatÄ«t Ŕādus vides mainÄ«gos: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (laiks, cik ilgi konteksts tiks saglabāts) un NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (konteksta tÄ«rÄ«Å”anas biežums).

Ir iespējams arÄ« apvienot vairākus ceļus savā sistēmā, atzÄ«mējot tos ar Ä«paÅ”u sesijas marÄ·ieri. Netra ļauj instalēt HTTP_HEADER_TAG_MAP lai HTTP galvenes pārvērstu par atbilstoÅ”iem izsekoÅ”anas diapazona tagiem. Tas var bÅ«t Ä«paÅ”i noderÄ«gi testÄ“Å”anai. Pēc funkcionālās pārbaudes nokārtoÅ”anas jÅ«s varat redzēt, kuru sistēmas daļu ietekmēja filtrÄ“Å”ana pēc atbilstoŔās sesijas atslēgas.

Pieprasījuma avota noteikŔana

Lai noteiktu, no kurienes ir saņemts pieprasÄ«jums, varat izmantot funkcionalitāti, kas automātiski pievieno galveni ar avotu. Vides mainÄ«gā izmantoÅ”ana NETRA_HTTP_X_SOURCE_HEADER_NAME Varat norādÄ«t galvenes nosaukumu, kas tiks automātiski instalēts. Izmantojot NETRA_HTTP_X_SOURCE_VALUE varat iestatÄ«t vērtÄ«bu, uz kādu tiks iestatÄ«ta X-Source galvene visiem izejoÅ”ajiem pieprasÄ«jumiem.

Tas ļauj Ŕīs noderÄ«gās galvenes sadalÄ«jumu vienmērÄ«gi sadalÄ«t visā tÄ«klā. Pēc tam varat to izmantot pakalpojumos un pievienot žurnāliem un metrikām.

Satiksmes marÅ”rutÄ“Å”ana un Netramesh iekŔējie elementi

Netramesh sastāv no divām galvenajām sastāvdaļām. Pirmais, netra-init, nosaka tÄ«kla noteikumus, lai pārtvertu trafiku. ViņŔ lieto iptables novirzÄ«Å”anas noteikumi lai pārtvertu visu vai daļu no satiksmes blakusvāģī, kas ir otra galvenā Netramesh sastāvdaļa. Varat konfigurēt, kuri porti ir jāpārtver ienākoÅ”ajām un izejoÅ”ajām TCP sesijām: INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

RÄ«kam ir arÄ« interesanta funkcija - varbÅ«tiskā marÅ”rutÄ“Å”ana. Ja izmantojat Netramesh tikai izsekoÅ”anas diapazonu apkopoÅ”anai, ražoÅ”anas vidē varat ietaupÄ«t resursus un iespējot varbÅ«tisko marÅ”rutÄ“Å”anu, izmantojot mainÄ«gos. NETRA_INBOUND_PROBABILITY Šø NETRA_OUTBOUND_PROBABILITY (no 0 lÄ«dz 1). Noklusējuma vērtÄ«ba ir 1 (visa satiksme tiek pārtverta).

Pēc veiksmÄ«gas pārtverÅ”anas Netra blakusvāģis pieņem jauno savienojumu un izmanto SO_ORIGINAL_DST ligzdas opciju, lai iegÅ«tu sākotnējo galamērÄ·i. Pēc tam Netra atver jaunu savienojumu ar sākotnējo IP adresi un izveido divvirzienu TCP saziņu starp pusēm, klausoties visu cauri ejoÅ”o trafiku. Ja ports ir definēts kā HTTP, Netra mēģina to parsēt un izsekot. Ja HTTP parsÄ“Å”ana neizdodas, Netra atgriežas pie TCP un pārredzami izmanto starpniekserveri.

Atkarības grafika izveide

Pēc liela apjoma izsekoÅ”anas informācijas saņemÅ”anas Jaeger, es vēlos iegÅ«t pilnÄ«gu sistēmas mijiedarbÄ«bas grafiku. Bet, ja jÅ«su sistēma ir diezgan noslogota un dienā uzkrājas miljardiem izsekoÅ”anas diapazonu, to apkopoÅ”ana nav tik viegls uzdevums. Ir oficiāls veids, kā to izdarÄ«t: dzirksteles atkarÄ«bas. Tomēr pilnÄ«gas diagrammas izveide prasÄ«s stundas, un pēdējo XNUMX stundu laikā bÅ«s nepiecieÅ”ams lejupielādēt visu datu kopu no Jaeger.

Ja izmantojat Elasticsearch, lai saglabātu izsekoÅ”anas laidumus, varat izmantot vienkārÅ”a Golang utilÄ«ta, kas dažu minÅ«Å”u laikā izveidos to paÅ”u grafiku, izmantojot Elasticsearch funkcijas un iespējas.

Netramesh ā€“ viegls servisa tÄ«kla risinājums

Kā lietot Netramesh

Netra var viegli pievienot jebkuram pakalpojumam, kurā darbojas jebkurÅ” orÄ·estrētājs. JÅ«s varat redzēt piemēru Å”eit.

Å obrÄ«d Netra nav iespējas automātiski ieviest blakusvāģus servisos, taču ir plāni ievieÅ”anai.

Netramesh nākotne

galvenais mērÄ·is Netramesh ir panākt minimālas resursu izmaksas un augstu veiktspēju, nodroÅ”inot pamata iespējas starpdienestu komunikācijas novērojamÄ«bai un kontrolei.

Nākotnē Netramesh atbalstÄ«s ne tikai HTTP, bet arÄ« citus lietojumprogrammu slāņa protokolus. L7 marÅ”rutÄ“Å”ana bÅ«s pieejama tuvākajā nākotnē.

Izmantojiet Netramesh, ja rodas līdzīgas problēmas, un rakstiet mums ar jautājumiem un ieteikumiem.

Avots: www.habr.com

Pievieno komentāru