Netramesh - çareseriya tevna karûbarê sivik

Gava ku em ji serîlêdanek yekparêz berbi mîmariya mîkroxizmetê ve diçin, em bi pirsgirêkên nû re rû bi rû dimînin.

Di serîlêdanek monolîtîk de, bi gelemperî pir hêsan e ku meriv diyar bike ku xeletî di kîjan beşa pergalê de çêbûye. Bi îhtîmalek mezin, pirsgirêk di koda monolîtê bixwe de, an di databasê de ye. Lê gava ku em dest bi lêgerîna pirsgirêkek di mîmariya mîkroxizmetê de dikin, êdî her tişt ne ew qas eşkere ye. Pêdivî ye ku em tevahiya riya ku daxwaz ji destpêkê heya dawiyê girtiye bibînin û wê ji bi sedan mîkroservisan hilbijêrin. Digel vê yekê, gelek ji wan jî xwedan dezgehên hilanînê yên xwe ne, ku di heman demê de dibe sedema xeletiyên mantiqî, û her weha pirsgirêkên performansê û tolerasyona xeletiyê.

Netramesh - çareseriya tevna karûbarê sivik

Ez demek dirêj li amûrek digerim ku dê ji pirsgirêkên weha re bibe alîkar (min li ser vê yekê li ser Habré nivîsî: 1, 2), lê di dawiyê de min çareseriya xweya çavkaniya vekirî çêkir. Di vê gotarê de ez li ser feydeyên nêzîkatiya tevna karûbarê diaxivim û ji bo pêkanîna wê amûrek nû parve dikim.

Şopandina belavkirî çareseriyek hevpar e ji bo pirsgirêka dîtina xeletiyan di pergalên belavbûyî de. Lê çi dibe bila bibe ev nêzîkatiya berhevkirina agahdariya di derheqê danûstendinên torê de hîn di pergalê de nehatiye bicîh kirin, an jî xirabtir, di beşek pergalê de ew jixwe bi rêkûpêk dixebite, lê beşek jî nake, ji ber ku ew li karûbarên kevn nehatiye zêdekirin ? Ji bo destnîşankirina sedema rastîn a pirsgirêkê, pêdivî ye ku meriv wêneyek bêkêmasî ya ku di pergalê de diqewime hebe. Bi taybetî girîng e ku meriv fêm bike ka kîjan mîkroxizmet di rêyên girîng ên karsaziya krîtîk de beşdar dibin.

Li vir nêzîkatiya tevna karûbarê dikare were alîkariya me, ku dê bi hemî makîneyên berhevkirina agahdariya torê re di astek ji karûbarên ku bixwe dixebitin re mijûl bibe. Ev nêzîkatî dihêle ku em hemî seyrûseferê bişopînin û wê li ser firînê analîz bikin. Wekî din, serîlêdan ne hewce ne ku di derheqê wê de tiştek zanibin.

Nêzîkatiya tevna xizmetê

Fikra bingehîn a nêzîkbûna tevna karûbarê ev e ku meriv qatek binesaziyê ya din li ser torê zêde bike, ku dê bihêle ku em bi danûstendina nav-karûbar re her tiştî bikin. Pir sepanan bi vî rengî dixebitin: konteynirek kêlek din a bi proxyek zelal li her mîkroxizmetê tê zêdekirin, ku tê de hemî seyrûsefera ketin û derketinê ya karûbarê derbas dibe. Û ev cihê ku em dikarin hevsengiya xerîdar bikin, polîtîkayên ewlehiyê bicîh bînin, li ser hejmara daxwazan sînordar bikin û li ser danûstendina karûbaran di hilberînê de agahdariya girîng berhev bikin.

Netramesh - çareseriya tevna karûbarê sivik

Rûsya

Jixwe çend pêkanînên vê rêbazê hene: Istio и linkerd2. Ew gelek taybetmendiyên ji qutiyê peyda dikin. Lê di heman demê de, sermayek mezin li ser çavkaniyan tê. Digel vê yekê, koma ku tê de pergalek wusa tevdigere her ku mezintir bibe, ji bo domandina binesaziya nû dê ewqas çavkanî hewce bike. Li Avito, em komên kubernetes ên ku bi hezaran mînakên karûbarê vedigirin dixebitin (û hejmara wan bi lez mezin dibe). Di pêkanîna xwe ya heyî de, Istio ji bo nimûne karûbarê ~ 300 Mb RAM dixwe. Ji ber hejmareke mezin a îmkanan, hevsengiya zelal jî bandorê li dema bersivdana giştî ya karûbaran dike (heta 10ms).

Wekî encamek, me tam li kîjan kapasîteyên ku em niha hewce ne nihêrîn, û biryar da ku sedema bingehîn a ku me dest bi cîbicîkirina çareseriyên weha kir, şiyana berhevkirina agahdariya şopandinê ji tevahiya pergalê bi zelalî bû. Di heman demê de me xwest ku em li ser danûstendina karûbaran bibin xwedî kontrol û bi sernavên ku di navbera karûbaran de têne veguheztin manîpulasyonên cihêreng bikin.

Di encamê de, em gihîştin biryara xwe:  Netramesh.

Netramesh

Netramesh çareseriyek tevna karûbarê sivik e ku bi şiyana pîvandina bêdawî, bêyî ku hejmara karûbarên di pergalê de hebe.

Armancên sereke yên çareseriya nû sermaya çavkaniyê kêm û performansa bilind bûn. Ji taybetmendiyên sereke, me tavilê xwest ku em karibin bi zelalî şopên şopandinê ji pergala xweya Jaeger re bişînin.

Îro, piraniya çareseriyên ewr li Golang têne bicîh kirin. Û, bê guman, sedemên vê yekê hene. Nivîsandina serîlêdanên torê yên li Golang ên ku bi I/O re asynkron dixebitin û li gorî hewcedariyê li ser navîkan pîvandin rehet û pir hêsan e. Û, ya ku di heman demê de pir girîng e, performans ji bo çareserkirina vê pirsgirêkê bes e. Ji ber vê yekê me jî Golang hilbijart.

Berhemdariyê

Me xebatên xwe li ser bidestxistina berhemdariya herî zêde rawestandiye. Ji bo çareseriyek ku li kêleka her mînakek karûbarê hatî bicîh kirin, vexwarinek piçûk a dema RAM û CPU hewce ye. Û, bê guman, derengiya bersivê jî divê piçûk be.

Ka em bibînin ka me çi encam girt.

BERAN

Netramesh bêyî seyrûseferê ~ 10Mb û herî zêde 50Mb bi barkirina heya 10000 RPS-ê ji bo nimûneyê vedixwe.

Proxeya nûnerê Istio her gav di nav komên me de bi hezaran mînakan ~ 300 Mb dixwe. Ev rê nade ku ew bi tevahî komê were pîvan kirin.

Netramesh - çareseriya tevna karûbarê sivik

Netramesh - çareseriya tevna karûbarê sivik

Bi Netramesh re me ~ 10x kêmkirina mezaxtina bîranînê girt.

CPU

Bikaranîna CPU-ê di bin barkirinê de bi rengek wekhev e. Ew bi hejmara daxwaznameyên her yekîneya wextê ve girêdayî ye ku li kêlekê. Nirxên li ser 3000 daxwazî ​​di çirkeyê de di lûtkeyê de:

Netramesh - çareseriya tevna karûbarê sivik

Netramesh - çareseriya tevna karûbarê sivik

Xalek girîngek din jî heye: Netramesh - çareseriyek bêyî balafirek kontrolê û bêyî barkirinê dema CPU-ê naxwe. Bi Istio re, kêlîk her gav xalên dawiya karûbarê nûve dikin. Wekî encamek, em dikarin vê wêneyê bêyî barkirinê bibînin:

Netramesh - çareseriya tevna karûbarê sivik

Em HTTP/1 ji bo danûstendina di navbera karûbaran de bikar tînin. Zêdebûna dema bersivê ji bo Istio dema ku bi navgîniya nûnerê veguhezîne heya 5-10ms bû, ku ji bo karûbarên ku amade ne ku di milîsaniyeyekê de bersivê bidin pir pir e. Bi Netramesh re ev dem daketiye 0.5-2ms.

Scalability

Rêjeya piçûk a çavkaniyên ku ji hêla her proxy ve tê vexwarin dihêle ku ew li tenişta her karûbar bi cîh bike. Netramesh bi mebest bêyî hêmanek balafirek kontrolê hate afirandin ku bi hêsanî her kêlek sivik bimîne. Bi gelemperî di çareseriyên tevna karûbarê de, balafira kontrolê agahdariya vedîtina karûbarê li her kêlekê belav dike. Li gel wê agahdarî li ser dem û mîhengên hevsengiyê tê. Hemî ev dihêle hûn gelek tiştên kêrhatî bikin, lê, mixabin, ew bi mezinahiyê kêlekan dişewitîne.

Vedîtina xizmetê

Netramesh - çareseriya tevna karûbarê sivik

Netramesh ji bo vedîtina karûbarê mekanîzmayên din zêde nake. Hemî seyrûsefer bi şefafî bi navgîniya kêleka netra ve tê veguheztin.

Netramesh protokola serîlêdanê ya HTTP/1 piştgirî dike. Ji bo pênasekirina wê, navnîşek mîhengbar a portan tê bikar anîn. Bi gelemperî, pergalê gelek port hene ku pêwendiya HTTP bi wan re çêdibe. Mînakî, em 80, 8890, 8080 ji bo danûstendina di navbera karûbar û daxwazên derveyî de bikar tînin NETRA_HTTP_PORTS.

Ger hûn Kubernetes wekî orkestrator û mekanîzmaya saziya Karûbarê wê ji bo danûstendina hundurîn-komê di navbera karûbaran de bikar bînin, wê hingê mekanîzma tam heman dimîne. Pêşîn, microservice navnîşek IP-ya karûbarê bi karanîna kube-dns digire û pêwendiyek nû jê re vedike. Ev pêwendiya yekem bi netra-sidecara herêmî re tê saz kirin û hemî pakêtên TCP di destpêkê de digihîjin netra. Dûv re, netra-sidecar têkiliyek bi cîhê bingehîn re saz dike. NAT li ser pod IP-ya li ser girêkê tam wekî bêyî netra dimîne.

Şopandin û şandina kontekstê belav kirin

Netramesh fonksiyona ku ji bo şandina şopên di derheqê danûstendinên HTTP de hewce dike peyda dike. Netra-sidecar protokola HTTP par dike, derengiya daxwazê ​​dipîve, û agahdariya pêwîst ji sernavên HTTP derdixe. Di dawiyê de, em hemî şopan di yek pergala Jaeger de digirin. Ji bo veavakirina hûrgulî, hûn dikarin guhêrbarên jîngehê yên ku ji hêla pirtûkxaneya fermî ve hatî peyda kirin jî bikar bînin jaeger here pirtûkxane.

Netramesh - çareseriya tevna karûbarê sivik

Netramesh - çareseriya tevna karûbarê sivik

Lê pirsgirêkek heye. Heya ku karûbar sernavek uber-a taybetî neafirînin û bişînin, em ê di pergalê de şopên pêvekirî nebînin. Û ev e ya ku em hewce ne ku zû sedema pirsgirêkan bibînin. Li vir dîsa çareseriyek Netramesh heye. Proxies sernavên HTTP-ê dixwînin û, heke ew nasnameya şopa uber nehewînin, yekê çêdikin. Netramesh di heman demê de agahdariya li ser daxwazên hatin û derketinê di kêlekek de hilîne û wan bi sernavên daxwazên derketinê yên pêwîst dewlemend dike. Tişta ku hûn hewce ne ku di karûbaran de bikin ev e ku hûn tenê sernavek bişînin X-Request-Id, ku dikare bi karanîna guhêrbarek jîngehê were mîheng kirin NETRA_HTTP_REQUEST_ID_HEADER_NAME. Ji bo kontrolkirina mezinahiya çarçoveyê li Netramesh, hûn dikarin guhêrbarên jîngehê yên jêrîn bicîh bikin: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (dema ku tê de dê were hilanîn) û NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (frekansa paqijkirina çarçoveyê).

Di heman demê de mimkun e ku meriv gelek rêçikan li ser pergala xwe bi îşaretek danişîna taybetî nîşan bide. Netra destûrê dide te ku saz bike HTTP_HEADER_TAG_MAP da ku sernavên HTTP-ê veguherînin etîketên paşîn ên şopandinê yên têkildar. Ev dikare bi taybetî ji bo ceribandinê kêrhatî be. Piştî ku ceribandina fonksiyonê derbas kir, hûn dikarin bibînin ka kîjan beşek pergalê ji hêla fîlterkirina bişkojka danişîna têkildar ve hatî bandor kirin.

Diyarkirina Çavkaniya Daxwazê

Ji bo destnîşankirina ku daxwaz ji ku hatî, hûn dikarin fonksiyona ku bixweber sernavek bi çavkaniyê re zêde bikin bikar bînin. Bikaranîna guherbarek jîngehê NETRA_HTTP_X_SOURCE_HEADER_NAME Hûn dikarin navek sernavê ku dê bixweber were saz kirin diyar bikin. Bi karanîna NETRA_HTTP_X_SOURCE_VALUE hûn dikarin nirxa ku sernavê X-Source dê ji bo hemî daxwazên derketinê were danîn destnîşan bikin.

Ev dihêle ku belavkirina vê sernavê kêrhatî li seranserê torê bi yekrengî were belavkirin. Wê hingê hûn dikarin wê di karûbaran de bikar bînin û wê li têketin û metrîkan zêde bikin.

Rêvekirina trafîkê û hundurên Netramesh

Netramesh ji du beşên sereke pêk tê. Ya yekem, netra-init, qaîdeyên torê destnîşan dike ku seyrûseferê bigire. Ew bikar tîne qaîdeyên beralîkirina iptables ku hemî an beşek ji seyrûsefera li ser kêlekê, ku duyemîn pêkhateya sereke ya Netramesh e, bigire. Hûn dikarin mîheng bikin ka kîjan portan ji bo danişînên TCP yên hatinî û derketinê hewce ne ku werin girtin: INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

Di heman demê de amûrek xwedan taybetmendiyek balkêş e - rêvekirina îhtîmalî. Ger hûn Netramesh tenê ji bo berhevkirina şopên şopandinê bikar tînin, wê hingê di hawîrdorek hilberînê de hûn dikarin çavkaniyan hilînin û bi karanîna guhêrbaran rêça îhtîmalî çalak bikin. NETRA_INBOUND_PROBABILITY и NETRA_OUTBOUND_PROBABILITY (ji 0 heta 1). Nirxa xwerû 1 e (hemû seyrûsefer tê asteng kirin).

Piştî navgîniya serfiraz, netra sidecar pêwendiya nû qebûl dike û bikar tîne SO_ORIGINAL_DST vebijarka soketê ji bo bidestxistina cîhê bingehîn. Dûv re Netra pêwendiyek nû bi navnîşana IP-ya orjînal vedike û pêwendiya TCP-ya du-alî di navbera aliyan de saz dike, guh dide hemî seyrûsefera ku tê de derbas dibe. Ger port wekî HTTP were pênase kirin, Netra hewl dide ku wê parsek bike û bişopîne. Ger parskirina HTTP têk biçe, Netra vedigere TCP-ê û bi şefaf bîtan prox dike.

Avakirina grafiyek girêdayîbûnê

Piştî ku li Jaeger gelek agahdariya şopandinê werdigirim, ez dixwazim grafiyek bêkêmasî ya danûstendinên di pergalê de bistînim. Lê heke pergala we pir barkirî be û bi mîlyaran şopên şopandinê her roj berhev dibin, komkirina wan ne karekî wusa hêsan dibe. Ji bo vê yekê rêyek fermî heye: çirûsk-girêdayî. Lêbelê, ew ê çend demjimêran bigire da ku grafikek bêkêmasî were çêkirin û dê we neçar bike ku hûn 24 demjimêrên paşîn tevahiya databasê ji Jaeger dakêşin.

Ger hûn Elasticsearch-ê bikar tînin da ku hûn pêlên şopandinê hilînin, hûn dikarin bikar bînin amûrek Golang a hêsan, ku dê heman grafîkê di çend hûrdeman de bi karanîna taybetmendî û kapasîteyên Elasticsearch ava bike.

Netramesh - çareseriya tevna karûbarê sivik

Meriv çawa Netramesh bikar tîne

Netra dikare bi hêsanî li her karûbarek ku her orkestratorek dixebite were zêdekirin. Hûn dikarin mînakek bibînin vir.

Heya nuha, Netra ne xwediyê şiyana ku bixweber karûbarên kêlekê bicîh bike, lê ji bo bicîhkirinê plan hene.

Pêşeroja Netramesh

Armanca sereke Netramesh bidestxistina lêçûnên çavkaniyê yên hindik û performansa bilind e, peydakirina kapasîteyên bingehîn ji bo çavdêrîkirin û kontrolkirina ragihandina nav-karûbar.

Di pêşerojê de, Netramesh dê ji bilî HTTP-ê protokolên qata serîlêdanê yên din piştgirî bike. Rêwîtiya L7 dê di demek nêzîk de peyda bibe.

Ger hûn bi pirsgirêkên bi vî rengî re rû bi rû bimînin Netramesh bikar bînin û bi pirs û pêşniyaran ji me re binivîsin.

Source: www.habr.com

Add a comment