Achitekti yon balanse chaj rezo nan Yandex.Cloud

Achitekti yon balanse chaj rezo nan Yandex.Cloud
Bonjou, mwen se Sergey Elantsev, mwen devlope rezo chaj balanse nan Yandex.Cloud. Précédemment, mwen te dirije devlopman nan balans lan L7 pou pòtal Yandex la - kòlèg blag ke kèlkeswa sa mwen fè, li vire soti yo dwe yon balanse. Mwen pral di lektè Habr ki jan yo jere chaj la nan yon platfòm nwaj, ki sa nou wè kòm zouti ideyal pou reyalize objektif sa a, ak ki jan nou ap deplase nan direksyon pou bati zouti sa a.

Premyèman, ann prezante kèk tèm:

  • VIP (Virtual IP) - adrès IP balanse
  • Sèvè, backend, egzanp - yon machin vityèl kouri yon aplikasyon
  • RIP (Real IP) - adrès IP sèvè
  • Healthcheck - tcheke preparasyon pou sèvè
  • Zòn Disponibilite, AZ - izole enfrastrikti nan yon sant done
  • Rejyon - yon sendika diferan AZ

Ekilib chaj yo rezoud twa travay prensipal yo: yo fè balans nan tèt li, amelyore tolerans nan fay nan sèvis la, ak senplifye dekale li yo. Tolerans fay asire atravè jesyon trafik otomatik: balanse a kontwole eta aplikasyon an epi eskli sikonstans nan balanse ki pa pase chèk la vivan. Echèl la asire lè yo distribye chay la nan chak sikonstans, osi byen ke mete ajou lis ka yo sou vole. Si balans lan pa inifòm ase, kèk nan ka yo pral resevwa yon chaj ki depase limit kapasite yo, epi sèvis la ap vin mwens serye.

Yon balans chaj souvan klase pa kouch nan pwotokòl soti nan modèl OSI sou ki li kouri. Cloud Balancer la opere nan nivo TCP, ki koresponn ak katriyèm kouch, L4.

Ann ale nan yon apèsi sou achitekti Cloud balans lan. Nou pral piti piti ogmante nivo detay. Nou divize eleman balans yo an twa klas. Klas avyon konfigirasyon an responsab pou entèraksyon itilizatè a epi li estoke eta sib sistèm lan. Avyon kontwòl la estoke eta aktyèl sistèm lan ak jere sistèm nan klas avyon done yo, ki responsab dirèkteman pou transpòte trafik soti nan kliyan nan ka ou yo.

Done avyon

Trafik la fini sou aparèy chè yo rele routeur fwontyè. Pou ogmante tolerans fay, plizyè aparèy sa yo opere ansanm nan yon sant done. Apre sa, trafik la ale nan balans, ki anonse adrès IP anycast nan tout AZ atravè BGP pou kliyan yo. 

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Trafik transmèt sou ECMP - sa a se yon estrateji routage selon ki ka gen plizyè wout egalman bon nan sib la (nan ka nou an, sib la pral adrès IP destinasyon an) ak pake yo ka voye ansanm nenpòt nan yo. Nou sipòte tou travay nan plizyè zòn disponiblite dapre konplo sa a: nou fè piblisite yon adrès nan chak zòn, trafik ale nan youn ki pi pre a epi yo pa ale pi lwen pase limit li yo. Pita nan pòs la nou pral gade an plis detay sou sa k ap pase nan trafik.

Avyon konfigirasyon

 
Eleman kle nan plan konfigirasyon an se API a, atravè ki operasyon debaz ak balans yo fèt: kreye, efase, chanje konpozisyon an nan ka, jwenn rezilta chèk sante, elatriye. Sou yon bò, sa a se yon API REST, ak sou la. lòt, nou nan Cloud la trè souvan itilize fondasyon gRPC a, kidonk nou "tradwi" REST nan gRPC ak Lè sa a, sèvi ak sèlman gRPC. Nenpòt demann mennen nan kreyasyon an nan yon seri travay asynchrone idempotent ke yo egzekite sou yon pisin komen nan Yandex.Cloud travayè yo. Travay yo ekri nan yon fason ke yo ka sispann nenpòt ki lè epi answit rekòmanse. Sa a asire évolutivité, repetibilite ak antre nan operasyon yo.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Kòm yon rezilta, travay ki soti nan API a pral fè yon demann bay kontwolè sèvis balans lan, ki ekri nan Go. Li ka ajoute epi retire balans, chanje konpozisyon backend ak anviwònman. 

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Sèvis la estoke eta li nan Yandex Database, yon baz done distribye jere ke ou pral byento kapab itilize. Nan Yandex.Cloud, jan nou deja te di, konsèp manje chen an aplike: si nou menm nou sèvi ak sèvis nou yo, Lè sa a, kliyan nou yo pral kontan tou sèvi ak yo. Yandex Database se yon egzanp aplikasyon an nan yon konsèp konsa. Nou estoke tout done nou yo nan YDB, epi nou pa bezwen reflechi sou kenbe ak echèl baz done a: pwoblèm sa yo rezoud pou nou, nou itilize baz done a kòm yon sèvis.

Ann retounen nan kontwolè balanse a. Travay li se sove enfòmasyon sou balans lan epi voye yon travay pou tcheke preparasyon pou machin vityèl la bay kontwolè a chèk sante.

Kontwolè Healthcheck

Li resevwa demann pou chanje règ chèk yo, sove yo nan YDB, distribye travay nan mitan nœuds healtcheck ak total rezilta yo, ki Lè sa a, yo sove nan baz done a epi yo voye bay kontwolè a loadbalancer. Li, nan vire, voye yon demann pou chanje konpozisyon gwoup la nan avyon an done nan loadbalancer-nœud la, ki mwen pral diskite anba a.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Ann pale plis sou chèk sante. Yo ka divize an plizyè klas. Odit yo gen diferan kritè siksè. Chèk TCP yo bezwen etabli yon koneksyon avèk siksè nan yon kantite tan fiks. Chèk HTTP mande tou de yon koneksyon siksè ak yon repons ak yon kòd estati 200.

Epitou, chèk yo diferan nan klas la nan aksyon - yo aktif ak pasif. Chèk pasif tou senpleman kontwole sa k ap pase ak trafik san yo pa pran okenn aksyon espesyal. Sa a pa travay trè byen sou L4 paske li depann de lojik pwotokòl ki pi wo yo: sou L4 pa gen okenn enfòmasyon sou konbyen tan operasyon an te pran oswa si fini koneksyon an te bon oswa move. Chèk aktif mande pou balans lan voye demann bay chak egzanp sèvè.

Pifò chaj balanse fè chèk liveness tèt yo. Nan Cloud, nou deside separe pati sa yo nan sistèm nan ogmante évolutivité. Apwòch sa a pral pèmèt nou ogmante kantite balanse pandan y ap kenbe kantite demann pou chèk sante nan sèvis la. Chèk yo fèt pa nœuds chèk sante separe, atravè ki sib chèk yo sharded ak repwodui. Ou pa ka fè chèk nan yon sèl lame, paske li ka echwe. Lè sa a, nou pa pral jwenn eta a nan enstans li tcheke yo. Nou fè chèk sou nenpòt nan ka ki soti nan omwen twa nœuds Healthcheck. Nou divize objektif chèk yo ant nœuds lè l sèvi avèk algoritm hashing ki konsistan.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Separe balans ak chèk sante ka mennen nan pwoblèm. Si nœud Healthcheck a fè demann nan egzanp lan, kontoune balanse a (ki pa kounye a sèvi trafik), Lè sa a, yon sitiyasyon etranj rive: resous la sanble ap vivan, men trafik la pa pral rive jwenn li. Nou rezoud pwoblèm sa a fason sa a: nou gen garanti pou kòmanse trafik chèk sante atravè balans. Nan lòt mo, konplo a pou deplase pake ak trafik soti nan kliyan ak nan chèk sante diferan minim: nan tou de ka, pake yo pral rive balanse yo, ki pral delivre yo nan resous yo sib.

Diferans lan se ke kliyan fè demann bay VIP, pandan y ap chèk sante fè demann nan chak RIP endividyèl. Yon pwoblèm enteresan rive isit la: nou bay itilizatè nou yo opòtinite pou yo kreye resous nan rezo IP gri. Ann imajine ke gen de pwopriyetè nwaj diferan ki kache sèvis yo dèyè balans. Chak nan yo gen resous nan subnet 10.0.0.1/24, ak menm adrès yo. Ou bezwen kapab yon jan kanmenm distenge yo, epi isit la ou bezwen plonje nan estrikti a nan rezo a vityèl Yandex.Cloud. Li pi bon pou jwenn plis detay nan videyo ki soti nan about:cloud event, li enpòtan pou nou kounye a ke rezo a se milti-kouch epi li gen tinèl ki ka distenge pa id subnet.

Healthcheck nœuds kontakte balanse yo lè l sèvi avèk sa yo rele adrès quasi-IPv6. Yon quasi-adrès se yon adrès IPv6 ki gen yon adrès IPv4 ak idantifikasyon subnet itilizatè entegre andedan li. Trafik la rive nan balans lan, ki ekstrè adrès resous IPv4 la nan li, ranplase IPv6 ak IPv4 epi voye pake a nan rezo itilizatè a.

Trafik ranvèse ale nan menm fason an: balanse a wè ke destinasyon an se yon rezo gri soti nan Healthcheckers, epi konvèti IPv4 nan IPv6.

VPP - kè a nan avyon an done

Balanse a aplike lè l sèvi avèk teknoloji Vector Packet Processing (VPP), yon fondasyon Cisco pou pwosesis pakèt nan trafik rezo a. Nan ka nou an, fondasyon an ap travay sou tèt bibliyotèk jesyon aparèy rezo itilizatè-espas la - Data Plane Development Kit (DPDK). Sa a asire pèfòmans segondè pwosesis pake: anpil mwens entèwonp rive nan nwayo a, epi pa gen okenn switch kontèks ant espas nwayo ak espas itilizatè. 

VPP ale menm pi lwen ak peze menm plis pèfòmans soti nan sistèm nan pa konbine pakè nan lo. Pwogrè pèfòmans yo soti nan itilizasyon agresif nan kachèt sou processeurs modèn. Tou de kachèt done yo itilize (pake yo trete nan "vektè", done yo pre youn ak lòt) ak kachèt enstriksyon: nan VPP, pwosesis pake swiv yon graf, nœuds yo ki gen fonksyon ki fè menm travay la.

Pou egzanp, pwosesis la nan pake IP nan VPP rive nan lòd sa a: premye, en-tête yo pake yo analize nan ne a par, epi Lè sa a, yo voye yo nan ne a, ki voye pake yo pi lwen dapre tab routage.

Yon ti kras hardcore. Otè yo nan VPP pa tolere konpwomi nan itilize nan kachèt processeur, kidonk kòd tipik pou trete yon vektè nan pake gen vektorizasyon manyèl: gen yon bouk pwosesis nan ki yon sitiyasyon tankou "nou gen kat pake nan keu la" trete, Lè sa a, menm bagay la tou pou de, Lè sa a, - pou youn. Enstriksyon Prefetch yo souvan itilize pou chaje done nan kachèt pou pi vit aksè a yo nan iterasyon ki vin apre yo.

n_left_from = frame->n_vectors;
while (n_left_from > 0)
{
    vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
    // ...
    while (n_left_from >= 4 && n_left_to_next >= 2)
    {
        // processing multiple packets at once
        u32 next0 = SAMPLE_NEXT_INTERFACE_OUTPUT;
        u32 next1 = SAMPLE_NEXT_INTERFACE_OUTPUT;
        // ...
        /* Prefetch next iteration. */
        {
            vlib_buffer_t *p2, *p3;

            p2 = vlib_get_buffer (vm, from[2]);
            p3 = vlib_get_buffer (vm, from[3]);

            vlib_prefetch_buffer_header (p2, LOAD);
            vlib_prefetch_buffer_header (p3, LOAD);

            CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, STORE);
            CLIB_PREFETCH (p3->data, CLIB_CACHE_LINE_BYTES, STORE);
        }
        // actually process data
        /* verify speculative enqueues, maybe switch current next frame */
        vlib_validate_buffer_enqueue_x2 (vm, node, next_index,
                to_next, n_left_to_next,
                bi0, bi1, next0, next1);
    }

    while (n_left_from > 0 && n_left_to_next > 0)
    {
        // processing packets by one
    }

    // processed batch
    vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}

Se konsa, Healthchecks pale sou IPv6 ak VPP a, ki vire yo nan IPv4. Sa a se fè pa yon ne nan graf la, ke nou rele algorithmic NAT. Pou trafik ranvèse (ak konvèsyon soti nan IPv6 a IPv4) gen menm ne algorithmic NAT la.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Trafik dirèk soti nan kliyan balanse yo ale nan nœuds graf yo, ki fè balans lan tèt li. 

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Premye ne a se sesyon kolan. Li estoke hash la nan 5-tuple pou sesyon etabli yo. 5-tuple gen ladan adrès ak pò kliyan an ki soti nan ki enfòmasyon yo transmèt, adrès la ak pò nan resous ki disponib pou resevwa trafik, osi byen ke pwotokòl rezo a. 

Hash la 5-tuple ede nou fè mwens kalkil nan ne ki vin apre a ki konsistan, osi byen ke pi byen okipe chanjman lis resous dèyè balans lan. Lè yon pake pou ki pa gen okenn sesyon rive nan balans lan, yo voye li nan node hashing ki konsistan. Sa a se kote balanse fèt lè l sèvi avèk hachaj konsistan: nou chwazi yon resous nan lis resous ki disponib "viv". Apre sa, pakè yo voye nan ne NAT la, ki aktyèlman ranplase adrès destinasyon an epi rekalkile chèk yo. Kòm ou ka wè, nou swiv règ yo nan VPP - renmen renmen, gwoupman kalkil ki sanble ogmante efikasite nan kachèt processeur.

Hashing konsistan

Poukisa nou te chwazi li e kisa li menm? Premyèman, ann konsidere travay anvan an - chwazi yon resous nan lis la. 

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Avèk hachaj enkonsistan, yo kalkile hachaj nan pake ki fèk ap rantre a, epi yo chwazi yon resous nan lis la pa rès divize hachaj sa a pa kantite resous yo. Osi lontan ke lis la rete san chanjman, konplo sa a mache byen: nou toujou voye pake ki gen menm 5-tuple a nan menm egzanp. Si, pou egzanp, kèk resous sispann reponn a chèk sante, Lè sa a, pou yon pati enpòtan nan hashes yo chwa a pral chanje. Koneksyon TCP kliyan an pral kraze: yon pake ki te rive nan egzanp A ka kòmanse rive nan egzanp B, ki pa abitye ak sesyon an pou pake sa a.

Hashing konsistan rezoud pwoblèm ki dekri a. Fason ki pi fasil pou eksplike konsèp sa a se sa a: imajine ke ou gen yon bag kote ou distribye resous pa hash (pa egzanp, pa IP:port). Chwazi yon resous se vire volan an pa yon ang, ki se detèmine pa hash la nan pake a.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Sa a minimize redistribisyon trafik lè konpozisyon resous yo chanje. Efase yon resous pral sèlman afekte pati nan bag la hashing ki konsistan kote resous la te lokalize. Ajoute yon resous tou chanje distribisyon an, men nou gen yon ne sesyon kolan, ki pèmèt nou pa chanje sesyon deja etabli nan nouvo resous.

Nou te gade sa k ap pase dirèk trafik ant balans lan ak resous yo. Koulye a, ann gade nan trafik retounen. Li swiv menm modèl ak trafik chèk - atravè algorithmic NAT, se sa ki, nan ranvèse NAT 44 pou trafik kliyan ak nan NAT 46 pou trafik chèk sante. Nou respekte pwòp plan nou an: nou inifye trafik chèk sante ak trafik itilizatè reyèl.

Loadbalancer-ne ak konpozan reyini

Konpozisyon balans ak resous nan VPP rapòte pa sèvis lokal la - loadbalancer-node. Li abònman nan kouran an nan evènman soti nan loadbalancer-kontwolè epi li se kapab trase diferans ki genyen ant eta aktyèl la VPP ak eta a sib resevwa nan men kontwolè a. Nou jwenn yon sistèm fèmen: evènman ki soti nan API a vini nan kontwolè a balanse, ki bay travay kontwolè a chèk sante yo tcheke "vivans" nan resous yo. Sa, nan vire, bay travay yo nan healthcheck-node la ak total rezilta yo, apre sa li voye yo tounen nan kontwolè a balanse. Loadbalancer-node abònman nan evènman nan kontwolè a ak chanje eta a nan VPP la. Nan yon sistèm konsa, chak sèvis konnen sèlman sa ki nesesè sou sèvis vwazen yo. Kantite koneksyon limite epi nou gen kapasite pou opere ak echèl diferan segman poukont yo.

Achitekti yon balanse chaj rezo nan Yandex.Cloud

Ki pwoblèm yo te evite?

Tout sèvis nou yo nan avyon kontwòl yo ekri nan Go epi yo gen bon dekale ak karakteristik fyab. Go gen anpil bibliyotèk sous louvri pou bati sistèm distribiye. Nou itilize GRPC aktivman, tout eleman yo genyen yon aplikasyon sous louvri nan dekouvèt sèvis - sèvis nou yo kontwole pèfòmans youn lòt, ka chanje konpozisyon yo dinamik, epi nou lye sa a ak balans GRPC. Pou metrik, nou itilize tou yon solisyon sous louvri. Nan avyon an done, nou te resevwa pèfòmans desan ak yon rezèv resous gwo: li te tounen soti yo dwe trè difisil yo rasanble yon kanpe sou ki nou te ka konte sou pèfòmans nan yon VPP, olye ke yon kat rezo fè.

Pwoblèm ak Solisyon

Kisa ki pat mache byen konsa? Go gen jesyon memwa otomatik, men fwit memwa toujou rive. Fason ki pi fasil pou fè fas ak yo se kouri goroutines epi sonje mete fen nan yo. Takeaway: Gade konsomasyon memwa pwogram Go ou yo. Souvan yon bon endikatè se kantite goroutines. Gen yon plis nan istwa sa a: nan Go li fasil jwenn done ègzekutabl - konsomasyon memwa, kantite goroutines kouri, ak anpil lòt paramèt.

Epitou, Go ka pa pi bon chwa pou tès fonksyonèl. Yo se byen verbose, ak apwòch la estanda nan "kouri tout bagay nan CI nan yon pakèt" se pa trè apwopriye pou yo. Reyalite a se ke tès fonksyonèl yo plis mande resous epi yo lakòz tan reyèl. Poutèt sa, tès yo ka echwe paske CPU a okipe ak tès inite yo. Konklizyon: Si sa posib, fè tès "lou" separeman ak tès inite yo. 

Achitekti evènman Microservice pi konplèks pase yon monolit: kolekte mòso bwa sou plizyè douzèn machin diferan pa trè pratik. Konklizyon: si ou fè mikwosèvis, imedyatman panse sou trase.

Plan nou yo

Nou pral lanse yon balanse entèn, yon balanse IPv6, ajoute sipò pou scripts Kubernetes, kontinye shard sèvis nou yo (kounye a sèlman healthcheck-node ak healthcheck-ctrl yo sharded), ajoute nouvo chèk sante, epi tou aplike agrégation entelijan nan chèk. Nou ap konsidere posiblite pou fè sèvis nou yo menm plis endepandan - pou yo pa kominike dirèkteman youn ak lòt, men lè l sèvi avèk yon keu mesaj. Gen yon sèvis ki konpatib SQS dènyèman parèt nan Cloud la Yandex Message Queue.

Dènyèman, lage piblik Yandex Load Balancer te fèt. Eksplore dokimantasyon nan sèvis la, jere balans nan yon fason ki bon pou ou epi ogmante tolerans nan fay nan pwojè ou yo!

Sous: www.habr.com

Add nouvo kòmantè