
Aloha, inimesed! Minu nimi on Oleg Anastasjev, töötan Klassikaaslaste meeskonnas Platvormi osas. Lisaks mulle töötab Klassikaaslaste juures terve hulk tehnikat. Meil on neli andmekeskust, kus on umbes 500 riiulit ĂŒle 8000 serveriga. Ăhel hetkel taipasime, et uue juhtimissĂŒsteemi juurutamine vĂ”imaldab meil tehnika tĂ”husamat kasutamist, juurdepÀÀsuhalduse lihtsustamist, arvutusressursside automatiseeritud (taas)jaotamist, uute teenuste kĂ€ivitamise kiirendamist ning ulatuslike hĂ€irete korral kiiremat reageerimist.
Mida me sellest lÔppkokkuvÔttes saime?
Minu ja hulga tehnikate kĂ”rval on ka inimesi, kes selle tehnikaga töötavad: insenerid, kes on otseselt andmekeskustes; vĂ”rguinsenerid, kes seadistavad vĂ”rgu infrastruktuuri; administraatorid ehk SRE-d, kes tagavad infrastruktuuri töökindluse; ja arendajate meeskonnad, kellel on igaĂŒhel oma osa portaali funktsioonidest. Nende loodud tarkvara töötab umbes niimoodi:

Kasutajate pÀringud tulevad nii pÔhivÀravatesse , kui ka muudele, nÀiteks muusika API frontidele. Need kutsuvad Àriloogika töötlemiseks esile rakenduste serveri, mis pÀringu töötlemisel kutsub vajalikud spetsialiseeritud mikroteenused - one-graph (sotsiaalsete sidemete graaf), user-cache (kasutajaprofiilide vahemÀlu) jne.
IgaĂŒks neist teenustest on paigaldatud paljudele masinatele ning igal neist on vastutavad arendajad, kes vastutavad moodulite toimimise, nende opereerimise ja tehnoloogilise arengu eest. KĂ”ik need teenused kĂ€ivitatakse rauas olevatel serveritel, ja kuni hiljutise ajani kĂ€ivitasime tĂ€pselt ĂŒhe ĂŒlesande ĂŒhel serveril, st see oli spetsialiseeritud konkreetsele ĂŒlesandele.
Miks nii? Sellel lÀhenemisel oli mitmeid plusse:
- Lihtsustatakse massiivne haldamine. Oletame, et ĂŒlesanne nĂ”uab mingisuguseid teeke, mingisuguseid seadistusi. Sel juhul mÀÀratakse server tĂ€pselt ĂŒhte kindlasse gruppi, sellele grupile kirjeldatakse cfengine poliitika (vĂ”i see on juba kirjeldatud), ja see konfiguratsioon levitatakse keskelt ja automaatselt kĂ”igile selle grupi serveritele.
- Lihtsustatakse diagnoosimine. Oletame, et vaatad suurenenud protsessori koormust ja mĂ”istad, et selle koormuse vĂ”is genereerida ainult see ĂŒlesanne, mis töötab sellel raual. SĂŒĂŒdlase otsingud lĂ”ppesid vĂ€ga kiiresti.
- Lihtsustatakse monitooring. Kui serveriga on midagi valesti, teavitab monitor sellest ning tead tĂ€pselt, kes on sĂŒĂŒdi.
Teenusele, mis koosneb mitmest koopiast, eraldatakse mitu serverit â igaĂŒhele oma. Seega antakse teenusele arvutusressursse vĂ€ga lihtsalt: sama palju ressursse, kui teenusel on servereid, seda ta saab maksimaalselt tarbida. "Lihtne" ei tĂ€henda siin seda, et seda on lihtne kasutada, vaid et ressursi jaotamine toimub kĂ€sitsi.
See lĂ€henemine vĂ”imaldas meil ka teha spetsialiseeritud raua konfiguratsioone ĂŒlesande jaoks, mis toimub sellel serveril. Kui ĂŒlesanne hoiab suuri andmehulkasid, kasutame 4U-serverit, mille ĆĄassiis on 38 ketast. Kui ĂŒlesanne on puhtalt arvutuslik, vĂ”ime osta odavama 1U-serveri. See on efektiivne arvutusressursside aspektist. Samuti vĂ”imaldab see lĂ€henemine meil kasutada neli korda vĂ€hem masinaid sama koormuse korral, mis on vĂ”rreldav ĂŒhe meie sĂ”bralikule sotsiaalvĂ”rgustikule.
Selline arvutusressursside efektiivne kasutamine peaks tagama ka majandusliku efektiivsuse, lĂ€htudes vĂ€itest, et kĂ”ige kallim on serverid. Pikka aega oli kĂ”ige kallim just raua hind ja oleme investeerinud palju ressursse raua hinna alandamisse, vĂ€lja mĂ”eldes talitlushĂ€irete vĂ€ltimise algoritmid, et vĂ€hendada seadmete töökindluse nĂ”udmisi. Ja tĂ€na oleme jĂ”udnud faasi, kus serveri hind ei ole enam mÀÀrav. Kui mitte arvesse vĂ”tta vĂ€rsket eksootikat, siis konkreetse serverikonfiguratsiooni paiknemine rackis ei oma tĂ€htsust. NĂŒĂŒd on meil tekkinud teine probleem â serveri hĂ”ivatud ruumi hind andmekeskuses, st ruumi rackis.
MÔistes, et see nii on, otsustasime arvutada, kui tÔhusalt me racke kasutame.
VĂ”tsime kĂ”ige vĂ”imsama serveri hinna, mis on majanduslikult pĂ”hjendatud, arvutasime, kui palju selliseid servereid mahub meie rack'idesse ja kui palju ĂŒlesandeid saaksime neile mÀÀrata, lĂ€htuvalt vanast mudelist "ĂŒks server = ĂŒks ĂŒlesanne" ning kui hĂ€sti suudaksid need ĂŒlesanded varustust Ă€ra kasutada. Tegime arvutusi ja olime ĂŒllatunud. Selgus, et rackide kasutusefektiivsus meie juures on umbes 11%. JĂ€reldus on ilmne: andmekeskuste kasutusefektiivsust tuleb parandada. Esmapilgul tundub, et lahendus on lihtne: tuleb ĂŒhel serveril samal ajal kĂ€ivitada mitu ĂŒlesannet. Kuid siin tekivad probleemid.
Massiline konfiguratsioon muutub jĂ€rsult keeruliseks â nĂŒĂŒd ei saa serverile mÀÀrata ĂŒhte kindlat gruppi. Sest nĂŒĂŒd vĂ”ivad ĂŒhel serveril töötada mitu erinevate meeskondade ĂŒlesannet. Lisaks vĂ”ib konfiguratsioon olla erinevatele rakendustele konfliktselt. Diagnostika muutub samuti keeruliseks: kui saate serveris nĂ€ha kĂ”rgendatud protsessorite vĂ”i ketta kasutust, ei tea te, milline ĂŒlesanne tekitab probleeme.
Kuid peamine asi on see, et ĂŒlesannete vahel, mis on kĂ€ivitatud ĂŒhel masinal, pole isolatsiooni. NĂ€iteks on graafik serveri ĂŒlesande keskmisest vastamisajast enne ja pĂ€rast seda, kui samal serveril kĂ€ivitati veel ĂŒks, mitte mingil moel seotud arvutusrakendus â peamise ĂŒlesande vastamise aeg on oluliselt suurenenud.

Ilmselgelt on vaja ĂŒlesandeid kĂ€ivitada kas konteinerites vĂ”i virtuaalmasinates. Kuna praktiliselt kĂ”ik ĂŒlesanded kĂ€ivitatakse meil ĂŒhe operatsioonisĂŒsteemi (Linuxi) all vĂ”i on selleks kohandatud, ei ole meil vajalik toetada mitmeid erinevaid operatsioonisĂŒsteeme. Seega ei ole virtualiseerimine vajalik; tĂ€nu lisaĂŒlekandekuludele on see konteineriseerimisest vĂ€hem efektiivne.
Docker on konteinerite kasutamise jaoks hea lahendus serverites: failisĂŒsteemi pildid lahendavad hĂ€sti konflikti kohanduste probleemid. Pildid, mida saab koostada mitmest kihist, vĂ”imaldavad meil oluliselt vĂ€hendada andmemahu, mis on vajalik nende juurutamiseks infrastruktuurile, eraldades ĂŒhised osad eraldi pĂ”hikihidesse. Sel juhul on pĂ”hikihid (ja kĂ”ige mahukamad) kiiresti vahemĂ€llu salvestatud kogu infrastruktuuris ning erinevate rakenduste ja versioonide kohaletoimetamiseks on vajalik edastada ainult vĂ€ikesemahulisi kihte.
Lisaks pakub valmis register ja piltide mÀrgistamine Dockeris meile valmis primitiivid versioonide haldamiseks ja koodi toimetamiseks tootmisse.
Docker, nagu iga teine sarnane tehnoloogia, pakub meile teatud isolatsioonitaseme konteinerite jaoks. NĂ€iteks mĂ€lu isolatsioon â igale konteinerile mÀÀratakse masina mĂ€lu kasutuspiir, mida ta ei ĂŒleta. Samuti saab konteinerite CPU kasutust isoleerida. Ent meie jaoks oli standardne isolatsioon ebapiisav. Kuid sellest allpool.
Konteinerite vahetu kĂ€itamine serverites on vaid osa probleemidest. Teine osa on seotud konteinerite paigutamisega serveritesse. Tuleb aru saada, milline konteiner sobib millisele serverile. See ei ole nii lihtne ĂŒlesanne, kuna konteinerid tuleb paigutada serveritesse nii tihedalt kui vĂ”imalik, samas speedi aeglustamata. Selline paigutamine vĂ”ib olla keeruline ka tĂ”rkekindluse osas. Sageli soovime paigutada sama teenuse koopiaid erinevatesse riiulitesse vĂ”i isegi erinevatesse andmekeskuse saalidesse, et korralduste vĂ”i saali rikke korral ei kaotaks kohe kĂ”iki teenuse koopiaid.
Konteinerite kĂ€sitsi jaotamine ei ole variant, kui sul on 8000 serverit ja 8000â16000 konteinerit.
Lisaks soovisime anda arendajatele rohkem iseseisvust ressursside jaotamisel, et nad saaksid oma teenuseid tootmisse paigutada ilma administraatori abita. Samal ajal soovisime hoida kontrolli, et mÔni teisejÀrguline teenus ei kasutaks kÔiki meie andmekeskuste ressursse.
On selge, et on vaja halduskihti, mis tegeleks sellega automaatselt.
Siin me oleme lihtsa ja arusaadava pildi juures, mida kÔik arhitektid armastavad: kolm ruutu.

one-cloud meistrid â veakindel klaster, mis vastutab pilve orkestreerimise eest. Arendaja saadab meistrile manifesti, mis sisaldab kogu teenuse paigutamiseks vajalikku teavet. Meister annab selle pĂ”hjal kĂ€sklusi valitud minionidele (masinatele, mis on ette nĂ€htud konteinerite kĂ€itamiseks). Minionitel on meie agent, kes saab kĂ€skluse, edastab juba oma kĂ€sud Dockerile, ning Docker konfigureerib Linuxi tuuma vastava konteineri kĂ€ivitamiseks. Peale kĂ€skude tĂ€itmise teatab agent pidevalt meistrile muutustest nii minioni masina seisundis kui ka sellel kĂ€ivitatavatest konteineritest.
Resursside jaotamine
Ja nĂŒĂŒd vaatame keerulisemat ĂŒlesannet, mis on ressursside jaotamine mitmete minionide jaoks.
KĂŒsimus one-cloudi arvutusressursside kohta on:
- Protsessori arvutusvĂ”ime, mida konkreetne ĂŒlesanne tarbib.
- MĂ€lu maht, mis on ĂŒlesandele saadaval.
- Void: iga minionil on spetsiaalne vĂ”rguliides piiratud ribalaiusega, seetĂ”ttu ei saa ĂŒlesandeid jaotada, arvestamata nende kaudu edastatavaid andmehulki.
- Kettad. Peale ilmselgelt andmete hoidmiseks mĂ”eldud ruumi mÀÀrame ka ketta tĂŒĂŒbi: HDD vĂ”i SSD. Kettad saavad teenindada lĂ”petatud pĂ€ringute arvu sekundis â IOPS. Seega, ĂŒlesannete puhul, mis genereerivad rohkem IOPS, kui ĂŒks ketas suudab teenindada, mÀÀrame eraldi 'spindlid' â st kettaseadmed, mis peavad olema rangelt reserveeritud ĂŒlesande jaoks.
Nii et mÔne teenuse, nÀiteks user-cache'i, jaoks saame ressursid registreerida jÀrgmiselt: 400 protsessorituuma, 2,5 TB mÀlu, 50 Gbit/s liiklust mÔlemas suunas, 6 TB ruumi HDD-l, mis on paigutatud 100 spindlile. VÔi meie jaoks tuttavamas vormis nii:
alloc:
cpu: 400
mem: 2500
lan_in: 50g
lan_out: 50g
hdd:100x6TUser-cache'i teenuse ressursid kasutavad vaid osa kĂ”igist tootmistehnoloogiliste sĂŒsteemide kergelt kergelt kergelt kergelt kergelt kergelt kergelt kergelt kergelt kergelt kergelt, seetĂ”ttu tahame saavutada, et user-cache ei kasutaks ootamatult, olenemata operaatori veast vĂ”i mitte, rohkem ressursse, kui talle on mÀÀratud. See tĂ€hendab, et peame ressursse piiritama. Aga millega me saame kvooti siduda?
Naasime tagasi meie tugevalt lihtsustatud koostisosade koostööskeemi ja joonistame selle ĂŒmber suurema detailiga â nii.

Mida tÀhele panna:
- Veebi esikĂŒlg ja muusika kasutavad sama rakenduste serveri isoleeritud klastreid.
- VÔime tuvastada loogilised kihid, mis hÔlmavad neid klastreid: esifront, vahemÀlud, andmete salvestamise ja haldamise kiht.
- EsikĂŒlg ei ole homogeenne, need on erinevad funktsionaalsed alamsĂŒsteemid.
- VahemĂ€lud saab samuti jagada alamsĂŒsteemide vahel, mille andmeid nad vahemĂ€lusse salvestavad.
Korrake pildi joonistamist:

Vau! Me nĂ€eme hierarhiat! See tĂ€hendab, et ressursse on vĂ”imalik jaotada suuremates plokkides: mÀÀrata vastutav arendaja selle hierarchia sĂ”lme, mis vastab funktsionaalsele alamsĂŒsteemile (nagu âmuusikaâ pildil), ja siduda selle sama hierarhiatasemega kvota. Selline hierarhia vĂ”imaldab meil ka paindlikumalt korraldada teenuseid haldamise mugavuse huvides. NĂ€iteks kĂ”ik web, kuna see on vĂ€ga suur serverite rĂŒhm, jagame mitmeks vĂ€iksemaks grupiks, mida pildil on nĂ€idatud kui group1, group2.
Eemaldades liigsed jooned, saame iga meie pildi sÔlme jÀÀdvustada mitmekihilise kujul: group1.web.front, api.music.front, user-cache.cache.
Nii jĂ”uame mĂ”isteteni âhierarhiline jĂ€rjekordâ. Sellel on nimi, nagu âgroup1.web.frontâ. Talle mÀÀratakse ressursikvoot ja kasutajaĂ”igused. DevOps inimesel on Ă”igus saata teenuse jĂ€rjekorda ja selline töötaja vĂ”ib jĂ€rjekorras midagi kĂ€ivitada, seevastu OpsDevâile antakse administraatoriĂ”igused, mis annab talle vĂ”imaluse jĂ€rjekorda hallata, seal inimesi mÀÀrata, nendele Ă”igusi anda jne. Selle jĂ€rjekorras kĂ€ivitatavad teenused töötavad jĂ€rjekorra kvoodi piirides. Kui jĂ€rjekorra arvutite kvoot ei piisa kĂ”igi teenuste samaaegseks kĂ€ivitamiseks, kĂ€ivitatakse need jĂ€rjestikku, moodustades sellega tegeliku jĂ€rjekorra.
Vaadakem teenuseid lĂ€hemalt. Igal teenusel on tĂ€ielik nimi, mis alati sisaldab jĂ€rjekorra nime. Seega, web esifront teenusel on nimi ok-web.group1.web.front. Ja rakenduste serveriteenusel, millega ta ĂŒhendust vĂ”tab, saab olema nimeks ok-app.group1.web.front. Igal teenusel on manifest, kus on kirjas kogu vajalik teave paigutamiseks konkreetsetesse masinatesse: kui palju ressursse see ĂŒlesanne tarbib, milline konfiguratsioon on vajalik, kui palju koopiaid peab olema, teenuse tĂ”rke töötlemise omadused. Ja pĂ€rast teenuse paigutamist otse masinatesse tekivad selle eksemplarid. Need on samuti unikaalselt nimetatud â eksemplari numbri ja teenuse nimega: 1.ok-web.group1.web.front, 2.ok-web.group1.web.front, âŠ
See on vÀga mugav: vaadates ainult kÀivitatud konteineri nime, saame kohe palju teada.
Ja nĂŒĂŒd tutvume lĂ€hemalt, mida need eksemplarid tegelikult teevad: ĂŒlesannete tĂ€itmisega.
Ălesannete isolatsiooniklassid
KĂ”ik ĂŒlesanded OK-s (ja ilmselt igal pool mujal) saab jagada rĂŒhmadesse:
- LĂŒhikese latentsusega ĂŒlesanded â prod. Selliste ĂŒlesannete ja teenuste jaoks on vastuse latentsus (latency) vĂ€ga oluline, kui kiiresti iga pĂ€ring sĂŒsteemi poolt töödeldakse. NĂ€ited ĂŒlesannetest: veebifrontid, vahemĂ€lud, rakenduste serverid, OLTP ladustamisruumid jne.
- Arvutusalased ĂŒlesanded â batch. Siin pole iga konkreetse pĂ€ringu töötlemise kiirus oluline. Neile on oluline, kui palju arvutusi see ĂŒlesanne teatud (suure) ajavahemiku jooksul teeb (throughput). Sellisteks on igasugused MapReduce ĂŒlesanded, Hadoop, masinĂ”pe, statistika.
- Taustal töötavad ĂŒlesanded â idle. Selliste ĂŒlesannete jaoks ei ole latentsus ega lĂ€bi viidud töötlemise kiirus eriti olulised. Siia kuuluvad erinevad testid, migratsioonid, ĂŒmberarvutamised, andmete konverteerimised ĂŒhest formaadist teise. Ăhelt poolt sarnanevad nad arvutuslikele, teisalt â me ei pea vĂ€ga oluliseks, kui kiiresti need lĂ”pule jĂ”uavad.
Vaatame, kuidas sellised ĂŒlesanded tarbivad ressursse, nĂ€iteks keskprotsessorit.
LĂŒhikese latentsusega ĂŒlesanded. Sellise ĂŒlesande CPU tarbimise muster sarnaneb jĂ€rgmisele:

Kasutajalt saabub pĂ€ring, ĂŒlesanne hakkab kasutama kĂ”ik saadaval olevaid CPU tuumasid, töötleb, tagastab vastuse, ootab jĂ€rgmist pĂ€ringut ja seisab. JĂ€rgnev pĂ€ring saabus â uuesti valisime kĂ”ik, mis oli, arvutasime lĂ€bi, ootame jĂ€rgmist.
Tagamaks, et sellise ĂŒlesande latentsus oleks minimaalne, peame vĂ”tma maksimumi selle tarbimistest ja reserveerima vajalikud tuumad minjonile (masinale, mis peab ĂŒlesannet tĂ€itma). Seega on meie ĂŒlesande reserveerimise valem jĂ€rgmine:
alloc: cpu = 4 (max)Ja kui meil on 16 tuuma minion-masin, siis saame sellele paigutada tĂ€pselt neli sellist ĂŒlesannet. Eriti mĂ€rgime, et nende ĂŒlesannete keskmine protsessoritarve on sageli vĂ€ga madal â mis on ilmne, kuna suure osa ajast on ĂŒlesanne ooteolekus ja ei tee midagi.
ArvutamisĂŒlesanded. Neil on musternĂ€ide veidi erinev:

Selliste ĂŒlesannete keskmine protsessoritarve on piisavalt kĂ”rge. Sageli tahame, et arvutamisĂŒlesanne tĂ€idetaks teatud ajavahemikus, seega tuleb reserveerida minimaalne protsessorite arv, mis on vajalik, et kogu arvutus lĂ”petataks vastuvĂ”etava ajaga. Tema reserveerimise valem nĂ€eb vĂ€lja jĂ€rgmine:
alloc: cpu = [1,*)âPalun paigalda see minioni, kus on vĂ€hemalt ĂŒks vaba tuum, ja edasi, mis iganes on â kĂ”ik lĂ€heb.â
Siin on ressursi kasutamise efektiivsus juba oluliselt parem kui lĂŒhikese viivitusega ĂŒlesannete puhul. Kuid kasu oleks palju suurem, kui kombineerida mĂ”lemat tĂŒĂŒpi ĂŒlesandeid ĂŒhel minion-masinal ja jagada selle ressursse jooksvalt. Kui lĂŒhikese viivitusega ĂŒlesanne vajab protsessorit â saab ta selle kohe, ja kui ressursid ei ole enam vajalikud â edastatakse need arvutamisĂŒlesandele, st midagi sellist:

Aga kuidas seda teha?
KÀime esmalt lÀbi prod ja tema alloc: cpu = 4. Me peame reserveerima neli tuuma. Docker run'is saab seda teha kahes viisist:
- Kasutades valikut
--cpuset=1-4, st mÀÀrata ĂŒlesandele neli kindlat tuuma masinal. - Kasutage
--cpuquota=400_000 --cpuperiod=100_000, mÀÀrata kvota protsessoriaja, st nĂ€idata, et iga 100 ms reaalaega ĂŒlesanne tarbib mitte rohkem kui 400 ms protsessoriaega. Saame samad neli tuuma.
Aga milline neist viisidest sobib?
Cpuset nĂ€eb ĂŒsna atraktiivne vĂ€lja. Ălesandel on neli pĂŒhendatud tuuma, mis tĂ€hendab, et protsessori vahemĂ€lud töötavad maksimaalselt efektiivselt. Sellel on ka tagasilööke: me peame vĂ”tma ĂŒlesande jagada arvutusi masin mittekoormatud tuumade vahel OS-i asemel, mis on ĂŒsna mitmekesine ĂŒlesanne, eriti kui pĂŒĂŒame selles masinas kĂ€itada partiiĂŒlesandeid. Testid nĂ€itasid, et siin sobib paremini kvota variant: sel juhul on operatsioonisĂŒsteemil rohkem vabadust ĂŒlesande tĂ€itmiseks tuuma valimisel hetkel ja protsessori aeg jaotub efektiivsemalt.
Selgitame, kuidas Dockeris alustada minimaalset tuumade reservi. Kvota partiiĂŒlesannete jaoks ei ole enam rakendatav, sest maksimumi piiramine ei ole vajalik, piisab vaid miinimumi tagamisest. Ja siia sobib hĂ€sti valik docker run --cpushares.
Oleme kokku leppinud, et kui partii nĂ”uab garantii ĂŒhele tuumale, siis me mÀÀrame --cpushares=1024, ja kui minimaalselt kahel tuumal, siis mÀÀrame --cpushares=2048. Protsessori aktsiad ei sega protsessori aja jaotust, kuni aega piisab. Nii et kui prod ei kasuta hetkel kĂ”iki nelja tuuma â ei ole midagi, mis piiraks partiiĂŒlesandeid, ja need saavad kasutada tĂ€iendavat protsessori aega. Kuid protsessori puuduse korral, kui prod on tarbinud kĂ”ik neli tuuma ja jĂ”udnud kvotani â ĂŒlejÀÀnud protsessori aeg jagatakse proportsionaalselt cpushares, st kolme vaba tuuma korral saab ĂŒks ĂŒlesanne 1024 cpushares ja ĂŒlejÀÀnud kaks â 2048 cpushares.
Kuid kvota ja aktsiate kasutamine ei piisa. Peame tagama, et lĂŒhikese latentsuse ĂŒlesanne saaks prioriteedi partiiĂŒlesande ees protsessori aja jaotamisel. Ilma sellise prioriseerimiseta vĂ”tab partiiĂŒlesanne kogu protsessori aja hetkel, kui see on vajalik prod-ile. Docker runis ei ole mingit konteinerite prioriseerimise valikut, kuid CPU planeerija poliitikad Linuxis tulevad appi. Nendest saab lĂ€hemalt lugeda , kuid kĂ€esolevas artiklis kĂ€sitleme neid lĂŒhidalt:
- SCHED_OTHER
Saavad vaikimisi kÔik tavalised kasutaja protsessid Linuxi masinas. - SCHED_BATCH
MĂ”eldud ressursimahukate protsesside jaoks. Kui ĂŒlesanne protsessorisse suunatakse, kehtestatakse nn aktiveerimise trahv: selline ĂŒlesanne saab tĂ”enĂ€oliselt vĂ€hem protsessorit, kui seda kasutab ĂŒlesanne SCHED_OTHER. - SCHED_IDLE
Taustprotsess vĂ€ga madala prioriteediga, isegi madalam kui nice â19. Me kasutame oma avatud lĂ€htekoodiga raamatukogu. , et seadistada vajalik poliitika konteineri kĂ€ivitamisel kutsumisega
one.nio.os.Proc.sched_setscheduler( pid, Proc.SCHED_IDLE )Kuid isegi kui te ei programmeeri Java-s, saab sama teha kÀsuga chrt:
chrt -i 0 $pidKokkuvĂ”tlikult koondame kĂ”ik meie isolatsiooni tasemed ĂŒhte tabelisse, et oleks selgem:
Isolatsiooni klass
NĂ€ide alloc
Docker run valikud
sched_setscheduler chrt*
Prod
cpu = 4
--cpuquota=400000 --cpuperiod=100000
SCHED_OTHER
Batch
Cpu = [1, * )
--cpushares=1024
SCHED_BATCH
Idle
Cpu= [2, *)
--cpushares=2048
SCHED_IDLE
*Kui teete chrt konteineri seest, vÔib olla vajalik capability sys_nice, kuna Docker eemaldab selle capability konteineri kÀivitamisel vaikimisi.
Kuid ĂŒlesanded tarbivad mitte ainult protsessorit, vaid ka liiklust, mis mĂ”jutab vĂ”rguĂŒlesande viivitust rohkem kui vale protsessorite jaotamine. SeetĂ”ttu tahame loomulikult saada sarnase pildi ka liiklusest. See tĂ€hendab, et kui prod-ĂŒlesanne saadab mĂ”ningaid pakette vĂ”rku, kvoteerime maksimaalse kiirus (valem alloc: lan=[*,500mbps) ), millega prod seda teha saab. Ja batch jaoks garanteerime ainult minimaalset lĂ€bilaskvust, kuid ei piira maksimaalset (valem alloc: lan=[10Mbps,*) ) Sel juhul peab prod liiklus olema kĂ”rgema prioriteediga vĂ”rreldes batch-ĂŒlesannetega.
Siin pole Dockeril mingeid primitiive, mida me saaksime kasutada. Kuid meie abiks tuleb . Oleme vajalikku tulemust saavutanud disipliini abil . Selle abil eraldame kaks liikluse klassi: kÔrgema prioriteediga prod ja madalama prioriteediga batch/idle. LÔppkokkuvÔttes on saateliikluse konfiguratsioon jÀrgmine:
siin 1:0 â "juurne qdisc" distsipliin hsfc; 1:1 â alamhierarhia hsfc, millel on ĂŒldine ribalaiuse limiit 8 Gbit/s, kuhu kuuluvad kĂ”ik konteinerite alamhierarhiad; 1:2 â alamhierarhia hsfc, mis on ĂŒhine kĂ”igi batch ja idle ĂŒlesannete jaoks "dĂŒnaamilise" limiidiga, mille kohta rÀÀgime allpool. ĂlejÀÀnud alamhierarhiad hsfc on eraldatud klassid hetkel töötavatele prod-konteineritele limiitidega, mis vastavad nende manifestidele â 450 ja 400 Mbit/s. Iga klassile hsfc on mÀÀratud qdisc jĂ€rjekord fq vĂ”i fq_codel, sĂ”ltuvalt linuxi tuumaversioonist, et vĂ€ltida paketikaotust liikluspuhangute ajal.
Tavaliselt teenivad tc distsipliinid ainult vĂ€ljamineva liikluse prioriseerimist. Kuid me tahame prioriseerida ka sissetulevat liiklust â nimelt vĂ”ib mĂ”ni batch-ĂŒlesanne hĂ”ivata kogu sissetuleva kanali, saades nĂ€iteks suurt paketti sissetulevaid andmeid map&reduce jaoks. Selle jaoks kasutame moodulit , mis loob virtuaalse liidese ifbX iga vĂ”rku liidese jaoks ja suunab sissetuleva liikluse liideselt vĂ€ljaminevaks ifbX-le. Edasi töötavad kĂ”ik need samad distsipliinid vĂ€ljamineva liikluse juhtimiseks, mille jaoks hsfc konfiguratsioon on vĂ€ga sarnane:
Katsed on nĂ€idanud, et parimad tulemused hsfc saavutatakse siis, kui klass 1:2 prioriteedita batch/idle liiklust piiratakse masinatel-minionidel mitte rohkem kui teatud vabale ribalaiusele. Vastasel juhul mĂ”jutab prioriteedita liiklus liiga palju prod-ĂŒlesannete latentsust. Praeguse vabade ribalaiuste suuruse mÀÀrab miniond iga sekundi tagant, mÔÔtes masinatega seotud prod-ĂŒlesannete keskmist liikluskasutust
ja lahutades selle vÔrgu liidese ribalaiusest
vÀikese varuga, st.

Ribalaiused mÀÀratakse sĂ”ltumatult sissetulevale ja vĂ€ljaminevale liiklusele. Ja vastavalt uutele vÀÀrtustele miniond konfigureerib 1:2 prioriteedita klassi limiidi ĂŒmber.
Seega oleme saavutanud kĂ”ik kolm isolatsiooniklassi: prod, batch ja idle. Need klassid mĂ”jutavad tugevalt ĂŒlesannete tĂ€itmise omadusi. SeetĂ”ttu otsustasime, et see tunnus tuleb asetada hierarhia tippu, et vaadates hierarhilise jĂ€rjekorra nime oleks kohe selge, millega me tegeleme:

KĂ”ik meie tuttavad web ja music frontid asetatakse siis hierarhiatesse prod alla. NĂ€iteks asetame batch alla teenuse music catalog, mis perioodiliselt koostab lugude katalooge komplektist ĂŒleslaetud "Odnoklassniki" mp3-failidest. Ja nĂ€itena idle teenusest vĂ”ib tuua muusikamuundur, mis normaliseerib muusika helitaseme.
Eemaldades taaskord liigsed read, saame kirjutada oma teenuste nimed nutikamalt, lisades teenuse tĂ€isnime lĂ”ppu ĂŒlesande isolatsiooni klassi: web.front.prod, catalog.music.batch, transformer.music.idle.
Ja nĂŒĂŒd, vaadates teenuse nime, mĂ”istame mitte ainult seda, millist funktsiooni ta tĂ€idab, vaid ka tema isolatsiooni klassi, mis nĂ€itab tema kriitilisust jne.
KĂ”ik on suurepĂ€rane, kuid on ĂŒks kibedat tĂ”de. Ăkski ĂŒlesandeid, mis töötavad samas masinas, ei saa tĂ€ielikult isoleerida.
Mida me oleme suutnud saavutada: kui batch tarbib intensiivselt seda protsessori ressursse, siis Linuxi sisseehitatud protsessoriplaneerija tĂ€idab oma ĂŒlesande vĂ€ga hĂ€sti ja sellel pole praktiliselt mingit mĂ”ju prod-ĂŒlesandele. Kuid kui see batch-ĂŒlesanne hakkab aktiivselt töötama mĂ€luga, siis mĂ”ju on juba tajutav. See juhtub seetĂ”ttu, et prod-ĂŒlesande puhul "voolavad" protsessorikandjad mĂ€lust vĂ€lja â lĂ”pptulemusena kasvavad vahepead ja protsessor töötleb prod-ĂŒlesannet aeglasemalt. TĂŒĂŒpiline batch-ĂŒlesanne vĂ”ib suurendada meie tĂŒĂŒpilise prod-konteineri latentsust 10%.
Liiklust on veelgi raskem isoleerida, kuna tĂ€napĂ€evastes vĂ”rgukaartides on paigutatud pakettide sisemine jĂ€rjekord. Kui pakett onde batch-ĂŒlesandest on sinna sattunud esimesena, siis tema edastamine kaabli kaudu toimub ka esimesena, ja siin ei ole midagi teha.
Lisaks oleme seni suutnud lahendada ainult TCP-liikluse prioriseerimise ĂŒlesande: UDP puhul ei toimi lĂ€henemine hsfc. Ja isegi TCP-liikluse puhul, kui batch-ĂŒlesanne genereerib palju liiklust, annab see samuti umbes 10% suurenemise prod-ĂŒlesande latentsuses.
Talitluskatkestustunne
Ăks eesmĂ€rke one-cloud'i arendamisel oli parendada Odnoklassniki' s tĂ”rkele vastu pidavust. Seega soovin nĂŒĂŒd ĂŒksikasjalikumalt uurida vĂ”imalikke tĂ”rke- ja avariisĂŒsteeme. Alustame lihtsast stsenaariumist â konteineri tĂ”rkest.
Konteiner vĂ”ib ebaĂ”nnestuda mitmel viisil. See vĂ”ib olla mingi eksperiment, tĂ”rge vĂ”i vigane manifest, mille tĂ”ttu prod-ĂŒlesanne hakkab tarbima rohkem ressursse kui manifestis ette nĂ€htud. Meil oli juhtum: arendaja rakendas ĂŒhe keerulise algoritmi, tegi seda mitmel korral ĂŒmber, segas end nii Ă€ra, et lĂ”puks hakkas ĂŒlesanne ĂŒsna keeruliselt lĂ”ppema. Kuna prod-ĂŒlesanne on prioriteetsem kui kĂ”ik teised samadel minionitel, hakkas see tarbima kĂ”iki saadaval olevaid CPU ressursse. Sellises olukorras aitas isolatsioon, tĂ€psemalt CPU ajakvoot. Kui ĂŒlesandele on mÀÀratud kvoot, ei tarbita rohkem. SeetĂ”ttu ei mĂ€rganud batch- ja teised prod-ĂŒlesanded, mis töötasid samal masinal, midagi.
Teine vĂ”imalik probleem on konteineri kokkuvarisemine. Ja siin aitavad meid restart-poliitikad, mida kĂ”ik tunnevad, Docker ise hoolitseb selle eest kenasti. Peaaegu kĂ”ik prod-ĂŒlesanded omavad restart-poliitikat always. MĂ”nikord kasutame on_failure batch-ĂŒlesannete vĂ”i prod-konteinerite silumiseks.
Aga mida teha, kui terve minion on mittesaadav?
Ilmselt tuleb konteiner kÀivitada teisel masinal. KÔige huvitavam on see, mis juhtub konteinerile mÀÀratud IP-aadressidega.
Saame mÀÀrata konteineritele sama IP-aadressi nagu masinatel, millel need konteinerid töötavad. Seega, kui konteiner kĂ€ivitatakse teisel masinal, muutub selle IP-aadress ning kĂ”ik kliendid peavad mĂ”istma, et konteiner on kolinud, nĂŒĂŒd tuleb minna uuele aadressile, mis nĂ”uab eraldi teenust Service Discovery.
Service Discovery on mugav. Turul on palju lahendusi erineva tÔrkekindluse tasemega teenuste registri korraldamiseks. Sageli sisaldavad sellised lahendused koormuse tasakaalustusloogika ja tÀiendava konfiguratsiooni hoidmise KV-hoidlas jne.
Kuid sooviksime lĂ€bi saada ilma eraldi registri rakendamata, sest see tĂ€hendaks kriitilise sĂŒsteemi sisseseadmist, mida kasutavad kĂ”ik teenused tootmises. Seega on see potentsiaalne tĂ”rkepunkt ning tuleb valida vĂ”i vĂ€lja töötada vĂ€ga tĂ”rkekindel lahendus, mis on ilmselgelt vĂ€ga keeruline, aeganĂ”udev ja kallis.
Ja veel ĂŒks suur puudus: et meie vana infrastruktuur töötaks koos uuega, oleks pidanud ĂŒmber kirjutama kĂ”ik ĂŒlesanded millelegi, mis kasutab Service Discovery sĂŒsteemi. Töö on ĂĂRMUSLIKULT palju, ja kohati isegi vĂ”imatu, kui jutt on madala tasemega seadmetest, mis töötavad opsĂŒsteemi kerneli tasemel vĂ”i otse riistvara kĂŒljes. Selle funktsionaalsuse rakendamine tuntud lahenduste mustrite abil, nagu nĂ€iteks tĂ€hendaks kohati tĂ€iendavat koormust, kohati â kasutamise keerukuse suurenemist ja tĂ€iendavaid tĂ”rke stsenaariume. Meile ei meeldinud keerukuse suurendamine, seetĂ”ttu otsustasime muuta Service Discovery kasutamise valikuliseks.
one-cloudis jĂ€rgneb IP konteinerile, st. igal ĂŒlesande eksemplaril on oma IP-aadress. See aadress on "staatiline": see kinnitatakse iga eksemplari puhul teenuse esmakordsel pilve saatmisel. Kui teenuse elu jooksul on olnud erinev arv eksemplare, siis lĂ”puks kinnitatakse temaga nii palju IP-aadresse, kui eksemplare kunagi kokku on olnud.
Hiljem need aadressid ei muutu: need on antud ainult ĂŒks kord ja pĂŒsivad terve teenuse elu jooksul produktsioonis. IP-aadressid jĂ€rgivad konteinerite vĂ”rku. Kui konteiner liigub teise minioni, siis jĂ€rgneb aadress ka temale.
Seega muutub teenuse nime ja selle IP-aadresside loendi seos vĂ€ga harva. Kui vaadata veelkord teenuse eksemplaride nimesid, mida me artikli alguses mainisime (1.ok-web.group1.web.front.prod, 2.ok-web.group1.web.front.prod, âŠ), siis mĂ€rkame, et need meenutavad DNS-is kasutatavaid FQDN-e. See on tĂ”si, teenuste eksemplaride nimede kuvamiseks nende IP-aadressides kasutame DNS-protokolli. Veelgi enam, see DNS tagastab kĂ”ik broneeritud IP-aadressid kĂ”ikidele konteineritele â nii töötavatele kui ka peatatud (kui meil on nĂ€iteks kolm koopiat, kuid viis aadressi on broneeritud â kĂ”ik viis aadressi tagastatakse). Klient, kes on selle teabe saanud, proovib luua ĂŒhendust kĂ”igi viie koopiaga â ja mÀÀrab seega need, mis töötavad. See kĂ€ttesaadavuse mÀÀramise variant on oluliselt usaldusvÀÀrsem, kuna see ei hĂ”lma ei DNS-i ega teenuse avastamist, seega ei ole probleemi teabe ajakohasuse ja nende sĂŒsteemide tĂ”rketaluvusega. Veelgi enam, kriitiliste teenuste puhul, mis sĂ”ltuvad kogu portaali töökindlusest, ei pea me DNS-i kasutama, vaid saame lihtsalt konfigureerida IP-aadresid.
Sellise IP-aadresside ĂŒlekande rakendamine konteinerite vahel vĂ”ib olla keeruline â ja peatume selle toimimise juures jĂ€rgmise nĂ€ite abil:

Oletame, et one-cloudi meister annab kĂ€su minion M1-l kĂ€ivitada 1.ok-web.group1.web.front.prod aadressiga 1.1.1.1. Minionis töötab , mis kuulutab selle aadressi spetsiaalsetele serveritele . Viimastel on BGP-seanss vĂ”rguseadmest, kuhu transleeritakse marsruut aadressile 1.1.1.1 M1-l. M1 marsĂŒreerib paketid konteinerisse juba Linuxi vahenditega. Route reflector'e servereid on kolm, kuna see on one-cloudi infrastruktuuri vĂ€ga kriitiline osa â ilma nendeta ei tööta one-cloudis vĂ”rk. Paigutame need erinevatesse rack'idesse, vĂ”imaluse korral erinevatesse andmekeskuse saalidesse, et vĂ€hendada kĂ”igi kolme samaaegse rikke tĂ”enĂ€osust.
Kujutame nĂŒĂŒd ette, et side one-cloudi meistri ja minion M1 vahel on kadunud. One-cloudi meister tegutseb nĂŒĂŒd oletuse pĂ”hjal, et M1 on tĂ€ielikult ebaĂ”nnestunud. See tĂ€hendab, et ta annab kĂ€su minion M2-l kĂ€ivitada web.group1.web.front.prod sama aadress 1.1.1.1. NĂŒĂŒd on meil kaks konfliktset marsruuti vĂ”rgus aadressile 1.1.1.1: M1-l ja M2-l. Selliste konfliktide lahendamiseks kasutame Multi Exit Discriminatorit, mis mÀÀratakse BGP-teate kaudu. See number nĂ€itab kuulutatud marsruudi kaalu. Konfliktide korral valitakse marsruut vĂ€iksema MED-i vÀÀrtusega. One-cloudi domineerija toetab MED-i konteinerite IP-aadresside lahutamatu osana. Esmakordselt mÀÀratakse aadress piisavalt suure MED-iga = 1 000 000. Kui toimub selline hĂ€daolukorra konteineri ĂŒleviimine, vĂ€hendab domineerija MED-i, ning M2 saab kĂ€su kuulutada aadress 1.1.1.1 MED-iga = 999 999. Samal ajal jÀÀb M1-l töötav nĂ€idis side puudumise tĂ”ttu ilma, ja selle edasine saatus ei ole meile oluline, kuni side taastub domineerijaga, mil ta peatatakse kui vana dubleerimine.
HĂ€dad
KĂ”ik andmekeskuste haldussĂŒsteemid töötavad alati hĂ€sti vĂ€lja vĂ€ikseid rikkeid. Konteineri vĂ€ljalangevus on enamikus kohtades norm.
Vaatame, kuidas me töötleme hĂ€daolukorda, nĂ€iteks toitekatkestust ĂŒhes vĂ”i enamas andmekeskuse saalis.
Mida tĂ€hendab avaria andmekeskuse haldussĂŒsteemile? Esiteks on see massiline samal ajal toimuv mitme masina rike ning haldussĂŒsteem peab samal ajal migreerima vĂ€ga palju konteineri. Kuid kui avaria on vĂ€ga ulatuslik, vĂ”ib juhtuda nii, et kĂ”iki ĂŒlesandeid ei saa teistele minionidele ĂŒle viia, kuna andmekeskuse ressursi maht langeb alla 100% koormusele.
Sageli kaasnevad hÀdad haldamise kihi rikke ning. See vÔib juhtuda, kuna selle varustus ebaÔnnestub, kuid sagedamini seetÔttu, et hÀdasid ei testita ning juhtimiskihid kukuvad ise kokku suurenenud koormuse tÔttu.
Mida selle kÔigega teha?
Massiivsed migreerimised tĂ€hendavad, et infrastruktuuris tekib suur hulk toiminguid, migreerimisi ja paigutusi. Iga migreerimine vĂ”ib vĂ”tta aega, mis on vajalik konteinerite piltide kohaletoimetamiseks ja lahtipakkimiseks minionidel, konteinerite kĂ€ivitamiseks ja initsialiseerimiseks jne. SeetĂ”ttu on soovitatav, et olulised ĂŒlesanded kĂ€ivitatakse enne vĂ€hem olulisi.
Vaadakem uuesti tuttavat teenuste hierarhiat ja proovime otsustada, milliseid ĂŒlesandeid tahame esmalt kĂ€ivitada.

Loomulikult on need protsessid, mis osalevad otseselt kasutaja pĂ€ringute töötlemises, st prod. Me nĂ€itame seda paigutamise prioriteedi â numbreid, mis vĂ”ivad olla mÀÀratud jĂ€rjekorrale. Kui mĂ”nel jĂ€rjekorral on kĂ”rgem prioriteet, paigutatakse selle teenused esimesena.
Prodis mÀÀrame kĂ”rgemad prioriteedid, 0; batch-lĂ€henemisel veidi madalam, 100; idle puhul veel madalam, 200. Prioriteedid rakendatakse hierarhiliselt. KĂ”ikidel madalama taseme ĂŒlesannetel on vastav prioriteet. Kui soovime, et prodis kĂ€ivituksid vahemĂ€lud enne esipinda, mÀÀrame vahemĂ€lu prioriteedi = 0 ja esipinna alamjĂ€rjekorrale = 1. Kui aga soovime, et esipindade seas kĂ€ivituks esmalt pĂ”hivĂ€rav ja alles seejĂ€rel muusika front, siis vĂ”ime viimasel mÀÀrata madalama prioriteedi â 10.
JĂ€rgmine probleem on ressursside puudus. Nii et meil on suures koguses varustust vĂ€lja langenud, terveid andmekeskuse saale, ja oleme kĂ€ivitanud nii palju teenuseid, et nĂŒĂŒd ei piisa ressursse kĂ”igi jaoks. Peame otsustama, milliste ĂŒlesannetega ohverdada, et peamised kriitilised teenused töötaksid.

Erinevalt paigutamise prioriteedist ei saa me lihtsalt ohverdada kĂ”iki batch-ĂŒlesandeid, mĂ”ned neist on portaali töö jaoks olulised. SeetĂ”ttu oleme eraldi vĂ€lja toonud vĂ€ljaarvamise prioriteedi ĂŒlesanne. Paigutamisel vĂ”ib kĂ”rgema prioriteediga ĂŒlesanne vĂ€lja arvata, st peatada madalama prioriteediga ĂŒlesande, kui vabu minione enam ei ole. Samuti on madalama prioriteediga ĂŒlesanne tĂ”enĂ€oliselt ei paigutata, st sellele ei ole enam sobivat minionit piisava vabade ressurssidega.
Meie hierarchias on vĂ€ga lihtne mÀÀrata selline vĂ€ljaarvamise prioriteet, et prod- ja batch-ĂŒlesanded vĂ€ljaaravad vĂ”i peatavad idle-ĂŒlesandeid, kuid mitte ĂŒksteist, mÀÀrates idle jaoks prioriteedi, mis on vĂ”rdne 200. Nagu ka paigutamise prioriteedi puhul, saame kasutada meie hierarhiat, et kirjeldada keerukamaid reegleid. NĂ€iteks saame mÀÀrata, et muusikafunktsiooniga ohverdame, kui meil ei piisa ressursse peamise veebiportaaliga, mÀÀrates vastavatele sĂ”lmedele madalama prioriteedi: 10.
Andmekeskuse Ônnetused tÀielikult
Miks vĂ”ib kogu andmekeskus ebaĂ”nnestuda? LoodusĂ”nnetused. Oli hea postitus, kuidas . Elus vĂ”ib pidada kodutuks inimeseks, kes ĂŒhel pĂ€eval hĂ€vitas optika kanaliseerimisse, mistĂ”ttu kaotas andmekeskus tĂ€ielikult ĂŒhenduse teiste lokaliseerimistega. Rikkumise pĂ”hjuseks vĂ”ib olla ka inimfaktor: operaator annab sellise kĂ€su, et kogu andmekeskus kukub kokku. See vĂ”ib juhtuda suurte vigade tĂ”ttu. Ăldiselt, andmekeskuste tĂ”rkeid esineb â see ei ole haruldane. Meil toimub see paar korda kuus.
Ja see on see, mida me teeme, et keegi #okelama ei postita Twitters.
Esimene strateegia on isoleerimine. Iga instance one-cloud on tĂ€ielikult isoleeritud ja saab hallata masinate vaid ĂŒhes andmekeskuses. See tĂ€hendab, et pilve kaotus vigade vĂ”i vale kĂ€su tĂ”ttu operaatori poolt on kaotuseks vaid ĂŒhes andmekeskuses. Oleme sellele valmis: meil on varukoopiapoliitika, mille raames rakenduste ja andmete koopiad paigutatakse kĂ”igis andmekeskustes. Kasutame vigadekindlaid andmebaase ja testime aeg-ajalt tĂ”rkeid.
Kuna meil on tÀna neli andmekeskust, on ka neli eraldi, tÀielikult isoleeritud one-cloudi eksemplari.
Selline lĂ€henemine kaitseb mitte ainult fĂŒĂŒsiliste tĂ”rgete eest, vaid vĂ”ib kaitsta ka operaatori vigade eest.
Ja mida veel saab teha inimfaktoriga? Kui operaator annab pilvele mingi imeliku vĂ”i potentsiaalselt ohtliku kĂ€su, vĂ”ib ta ootamatult pidada lahendama vĂ€ikese ĂŒlesande, et kontrollida, kui hĂ€sti ta mĂ”tles. NĂ€iteks kui see on mingi massiline peatamine paljude koopiate puhul vĂ”i lihtsalt kummaline kĂ€sk â koopiate arvu vĂ€hendamine vĂ”i pildi nime muutmine, mitte ainult versiooni numbri muutmine uues manifestis.
Summary
One-cloudi eripÀra:
- Hierarhiline ja silmapaistev teenuste ja konteinerite nimetamise skeem, mis vĂ”imaldab vĂ€ga kiiresti teada saada, mis see ĂŒlesanne on, millega see seondub ja kuidas see töötab ja kes on selle eest vastutav.
- Kasutame oma tehnika ĂŒhildamise prod- ja batch-ĂŒlesannete peal minionidel, et suurendada masinate ĂŒhisarendamise tĂ”husust. Cpuseti asemel kasutame CPU kvoote, aktsiaid, CPU ajajuhtimise poliitikaid ja Linuxi QoS-i.
- Konteinereid, mis töötavad ĂŒhel masinal, ei suutnud tĂ€ielikult isoleerida, kuid nende omavaheline mĂ”ju jÀÀb 20% piiresse.
- Teenuste korraldamine hierarhias aitab automaatse avarii likvideerimise korral paigutamise ja kÔrvalduste prioriteetide abil.
KKK
Miks me ei valinud valmislahendust.
- Erinevad tĂ¶Ă¶ĂŒlesannete isoleerimise klassid nĂ”uavad erinevat loogikat minionide paigutamisel. Kui tootmisseotud ĂŒlesandeid saab paigutada lihtsalt ressursside reserveerimise kaudu, tuleb batch ja idle ĂŒlesandeid paigutada, jĂ€lgides minionide masinatel tegelikku ressursside kasutust.
- Tegemist on ĂŒlesannete tarbitavate ressursside arvestamise vajadusega, nagu:
- vÔrgu lÀbilaskevÔime;
- ketaste tĂŒĂŒbid ja âspindlidâ.
- Teenuste prioriteetide mÀÀramise vajadus hÀdaolukordade likvideerimise puhul, meeskondade Ôiguste ja kvotade mÀÀramine ressurssidele, mida lahendatakse one-cloudis hierarhiliste jÀrjekordade abil.
- Vajadus omada inimlikku nimetust konteineritele, et vÀhendada reageerimisaega hÀdaolukordadele ja intsidentidele.
- Ăheainsa ja ulatusliku Service Discovery rakendamise vĂ”imatus; vajadus koos eksisteerida pikalt raudvarale paigutatud ĂŒlesannetega - see lahendatakse konteinerite jĂ€litamise kaudu âstaatilisteâ IP-aadresside abil ja seelĂ€bi ainulaadne integreerimine suure vĂ”rguinfrastruktuuriga.
KĂ”ik need funktsioonid nĂ”uaksid olemasolevate lahenduste pĂ”hjalikku ĂŒmbertegemist ning hinnates töömahtu jĂ”udsime arusaamale, et saame vĂ€lja töötada oma lahenduse ligikaudu samade tööjĂ”uressurssidega. Kuid meie lahendus on oluliselt lihtsam kĂ€itada ja arendada - selles ei ole tarbetuid abstraktsioone, mis toetavad meile mittevajalikke funktsioone.
Neile, kes loevad viimaseid ridu - aitÀh kannatlikkuse ja tÀhelepanu eest!
Allikas: habr.com
