One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Aloha, inimesed! Minu nimi on Oleg Anastasyev, töötan Odnoklassnikis Platvormi meeskonnas. Lisaks mulle töötab Odnoklassnikis suur hulk seadmeid. Meil on neli andmekeskust, milles on umbes 500 riiulit ĂŒle 8000 serveri. Ühel hetkel mĂ”istsime, et uue juhtimissĂŒsteemi rakendamine vĂ”imaldab meil tehnika kasutust tĂ”husamalt koormata, juurdepÀÀsude haldamist lihtsustada, arvutusressursside (uuesti) jaotamist automatiseerida, uusi teenuseid kiiremini kĂ€ivitada ja suurte avariide korral reageerimisaega kiirendada.

Mida me selle tulemusena saavutasime?

Lisaks mulle ja suurtele seadmetele on veel inimesi, kes nendega töötavad: insenerid, kes asuvad andmekeskustes; vĂ”rguinsenerid, kes seadistavad vĂ”rgulahendusi; adminnid ehk SRE-d, kes tagavad infrastruktuuri töökindluse; ja arendustiimid, kellest igaĂŒhel on oma roll portaali funktsioonides. Nende loodud tarkvara töötab umbes nii:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Kasutajate pĂ€ringud saadetakse peamise portaali frontide kaudu www.ok.ru, ja ka teistele, nĂ€iteks muusika API frontendidele. Need töötlevad Ă€ri loogikat, kutsudes esile rakenduste serverit, mis vajadusel kutsub vĂ€lja vajalikud spetsialiseeritud mikroteenused — one-graph (sotsiaalsete suhete graafik), user-cache (kasutajaprofiilide vahemĂ€lu) jne.

IgaĂŒks neist teenustest on paigutatud paljudele masinatele ning igal neist on vastutavad arendajad, kes vastutavad moodulite toimimise, nende hoolduse ja tehnoloogilise arengu eest. KĂ”ik need teenused kĂ€ivitatakse raudserveritel, ja kuni hiljutise ajani kĂ€ivitasime tĂ€pselt ĂŒhe ĂŒlesande ĂŒhe serveri peal, st see oli spetsialiseeritud konkreetsele ĂŒlesandele.

Miks nii? Sellel lÀhenemisel oli mitu eelist:

  • Kergendab massilist haldust. Oletame, et ĂŒlesanne vajab teatud teeke, teatud seadeid. Ja siis kantakse server tĂ€pselt ĂŒhte kindlasse gruppi, kirjeldatakse selle grupi cfengine poliitikat (vĂ”i see on juba kirjeldatud), ja see konfiguratsioon rakendatakse keskendunult ja automaatselt kĂ”ikidele selle grupi serveritele.
  • Lihtsustab diagnostikat. Oletat, et vaatate suurenenud protsessori koormust ja mĂ”istate, et selle koormuse vĂ”is genereerida ainult see ĂŒlesanne, mis töötab sellel raual. SĂŒĂŒdlaste leidmine lĂ”ppema vĂ€ga kiiresti.
  • Lihtsustab jĂ€lgimist,. Kui serveriga on midagi valesti, teatab monitor sellest, ja te teate tĂ€pselt, kes on sĂŒĂŒdi.

Teenusele, mis koosneb mitmest koopiast, eraldatakse mitu serverit — igaĂŒhele ĂŒks. Nii et teenuse arvutusressursi jaotamine on vĂ€ga lihtne: nii palju servereid, kui teenusel on, nii palju ressursse ta maksimaalselt tarbida saab. „Lihtne” ei tĂ€henda siin, et seda on lihtne kasutada, vaid et ressursside jaotamine toimub kĂ€sitsi.

Selline lĂ€henemine on vĂ”imaldanud meil ka teha spetsialiseeritud riistvarakonfiguratsioone ĂŒlesande jaoks, mis toimib sellel serveril. Kui ĂŒlesanne talletab suuri andmemahtusid, siis kasutame 4U-serverit, mille ĆĄassii mahutab 38 ketast. Kui ĂŒlesanne on puhtalt arvutuslik, saame osta odavama 1U-serveri. See on arvutusressursside mĂ”ttes efektiivne. Selline lĂ€henemine vĂ”imaldab meil kasutada neli korda vĂ€hem seadmeid koormuse korral, mis on sarnane ĂŒhele meile sĂ”bralikule sotsiaalmeediale.

Selline arvutusressursside kasutamise efektiivsus peaks tagama ka majandusliku efektiivsuse, kui lĂ€htuda eeldusest, et kĂ”ige kallimad on serverid. Pikka aega olid kĂ”ige kallimad just riistvara, ja oleme pannud palju vaeva riistvara hinna vĂ€hendamiseks, vĂ€lja töötades talitluspidevuse tagamise algoritme, et vĂ€hendada seadmete usaldusvÀÀrsuse nĂ”udeid. Ja tĂ€na oleme jĂ”udnud staadiumisse, kus serveri hind enam ei mĂ€ngi mÀÀravat rolli. Kui mitte arvestada uusimat eksootikat, siis konkreetse serveri konfiguratsioon rackis ei oma tĂ€htsust. Praegu seisame silmitsi teise probleemiga — serveri asukoha hind andmekeskuses, st racki kohaga.

MÔistes, et see nii on, otsustasime arvutada, kui efektiivselt me riiuleid kasutame.
VĂ”tsime kĂ”ige vĂ”imsama serveri hinna, mis on majanduslikult pĂ”hjendatud, ja arvutasime vĂ€lja, kui palju selliseid servereid saame riiulitesse mahutada, kui palju ĂŒlesandeid me nende peale kĂ€ivitaksime vanast mudelist lĂ€htudes, kus "ĂŒks server = ĂŒks ĂŒlesanne", ja kui palju need ĂŒlesanded suudaksid varustust Ă€ra kasutada. Arvutasime — silmi niiskasid. Selgus, et meie riiulite kasutamise efektiivsus on umbes 11%. Tulemused on selged: andmekeskuste kasutamise efektiivsust tuleb tĂ”sta. Tundub, et lahendus on ilmne: peame ĂŒhel serveril korraga mitu ĂŒlesannet kĂ€ivitama. Kuid siin hakkavad probleemid.

Massiline konfiguratsioon muutub jĂ€rsult keerulisemaks — nĂŒĂŒd ei saa serverile mÀÀrata ĂŒhte kindlat rĂŒhma. KĂŒll aga vĂ”ivad ĂŒhel serveril nĂŒĂŒd olla kĂ€ivitatud mitmed erinevate meeskondade ĂŒlesanded. Lisaks vĂ”ib konfiguratsioon olla erinevate rakenduste jaoks konfliktne. Diagnostika muutub samuti keerulisemaks: kui nĂ€ete serveris suurenenud protsessorite vĂ”i ketaste kasutamist, ei tea te, milline ĂŒlesanne pĂ”hjustab probleeme.

Kuid kĂ”ige tĂ€htsam on see, et ĂŒhe masina peal kĂ€ivitatavate ĂŒlesannete vahel ei ole eraldatust. NĂ€iteks, siin on keskmise vastuseaja graafik serveriĂŒlesandele enne ja pĂ€rast seda, kui samal serveril kĂ€ivitasime veel ĂŒhe, esimesega mitte seotud arvutusrakenduse — peamise ĂŒlesande vastamisaeg on oluliselt suurenenud.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Ilmselgelt tuleb ĂŒlesandeid kĂ€ivitada kas konteinerites vĂ”i virtuaalmasinates. Kuna praktiliselt kĂ”ik ĂŒlesanded kĂ€ivitatakse meil ĂŒhe opsĂŒsteemi (Linuxi) all vĂ”i on selle jaoks kohandatud, ei ole meil vajalik ĂŒhegi erineva opsĂŒsteemi toetamine. Seega ei ole virtualiseerimine vajalik, kuna selle tĂ€iendavad kulud muudavad selle vĂ€hem tĂ”husaks kui konteineriseerimine.

Dockeri konteinereid, mis kĂ€ivitavad ĂŒlesandeid otse serverites, vĂ”ib pidada heaks kandidaadiks: failisĂŒsteemide pildid lahendavad konflikti tekkimise probleeme. Kuna pilte saab koostada mitmest kihist, suudame oluliselt vĂ€hendada andmete mahtu, mis on vajalik nende juurutamiseks infrastruktuuris, eraldades ĂŒhised osad eraldi baaskihiks. Nii et baaskihid (ja kĂ”ige mahukamad kihid) salvestatakse kogu infrastruktuuri piisavalt kiiresti ja erinevat tĂŒĂŒpi rakenduste ja versioonide edastamiseks tuleb edastada ainult vĂ€ikesed kihid.

Lisaks pakuvad valmis registreerimise ja pilte mÀrgistamise vÔimalused Dockeris meile valmis primitiive koodi versioonimiseks ja tootmisse toimetamiseks.

Docker, nagu iga teine sarnane tehnoloogia, pakub meile vaikimisi teatud taseme konteinerite isoleerimiseks. NĂ€iteks mĂ€lu isoleerimine — iga konteinerile mÀÀratakse masina mĂ€lu kasutamise limiit, millest kĂ”rgemat ta ei kasuta. Samuti on vĂ”imalik isoleerida konteinerite kasutust CPU puhul. Meie jaoks aga ei olnud standardne isoleerimine piisav. Kuid sellest rÀÀgime allpool.

Konteinerite otsene kĂ€ivitamine serverites on ainult osa probleemidest. Teine osa on seotud konteinerite paigutamisega serveritesse. Tuleb mĂ”ista, milliseid konteinerite saab kellele serverisse paigutada. See ei ole nii lihtne ĂŒlesanne, sest konteinerid tuleb paigutada serveritesse vĂ”imalikult tihedalt, samas kiirusest loobumata. Selline paigutamine vĂ”ib olla keeruline ja usaldusvÀÀrsuse seisukohalt. Tihti soovime paigutada sama teenuse koopiaid erinevatesse rackidesse vĂ”i isegi erinevatesse andmekeskuste saalidesse, et racki vĂ”i saali rikke korral ei kaotaks me kohe kĂ”ik teenuse koopiad.

Konteinerite kĂ€sitsi jaotamine ei ole valik, kui sul on 8000 serverit ja 8000–16000 konteinerit.

Samuti soovisime anda arendajatele rohkem iseseisvust ressursside jaotamisel, et nad saaksid oma teenuseid ise tootmisesse paigutada ilma administraatori abita. Samas soovisime sĂ€ilitada kontrolli, et mĂ”ni vĂ€hem oluline teenus ei kasutaks ĂŒles meie andmekeskuste ressursse.

Selgelt on vajalik juhtimistasand, mis tegeleb sellega automaatselt.

Ja siin oleme me lihtsa ja arusaadava pildi juures, mida kÔik arhitektid armastavad: kolm ruutu.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

one-cloud masters — talitlushĂ€ired vĂ€ltiv klaster, mis vastutab pilve orkestreerimise eest. Arendaja saadab meistrile manifesti, milles on kogu teenuse paigutamiseks vajalik teave. Meister annab selle alusel kĂ€ske valitud minioonidele (masinatele, mis on mĂ”eldud konteinerite kĂ€itamiseks). Minioonidel on meie agent, kes saab kĂ€su, edastab juba oma kĂ€sud Dockerile ja Docker konfigureerib Linuxi kerneli vastava konteineri kĂ€ivitamiseks. Lisaks kĂ€sude tĂ€itmisele edastab agent pidevalt meistrile muutusi nii minioonimasina seisundis kui ka kĂ€ivitatud konteinerites.

Ressursside jaotamine

NĂŒĂŒd vaatame keerulisemat ressursside jaotuse ĂŒlesannet mitme minioni jaoks.

Arvutusressurss one-cloudis on:

  • Protsessori arvutusvĂ”imsus, mida kasutatakse konkreetse ĂŒlesande jaoks.
  • MĂ€lu maht, mis on ĂŒlesandele saadaval.
  • VĂ”rguliiklus. Igal minionil on konkreetne vĂ”rguinterfeiss piiratud lĂ€bilaskevĂ”imega, seega ei saa ĂŒlesandeid jaotada, arvesse vĂ”tmata edastatavate andmete mahtu.
  • Kettad. Lisaks ilmselgelt ruumile ĂŒlesande andmete jaoks mÀÀrame ka ketta tĂŒĂŒbi: HDD vĂ”i SSD. Kettad suudavad teenindada piiratud arvu pĂ€ringuid sekundis — IOPS. Seega, kui ĂŒlesanded genereerivad rohkem IOPS'i, kui ĂŒks kettas suudab teenindada, mÀÀrame ka "spindlid" — st ketas-seadmed, mis tuleb eraldi ĂŒlesande jaoks reserveerida.

Seega saame nÀiteks teenuse, nagu user-cache, ressursinÔudluse kirjutada jÀrgmisel viisil: 400 protsessorituuma, 2,5 TB mÀlu, 50 Gbit/s liiklust mÔlemas suunas, 6 TB ruumi HDD-l, mis asub 100 spindlil. VÔi meie jaoks tuttavamal kujul nii:

alloc:
    cpu: 400
    mem: 2500
    lan_in: 50g
    lan_out: 50g
    hdd:100x6T

User-cache'i teenused kasutavad ainult osa kÔigist saadaval olevatest ressurssidest tootmisinfrastruktuuris. SeetÔttu soovime tagada, et user-cache ei tarbiks ootamatult rohkem ressursse, kui talle on eraldatud, olgu see siis inimese vea tÔttu vÔi mitte. Peame ressursside kasutust piirama. Kuid mille pÔhjal saaksime kvooti mÀÀrata?

Naaseme meie tugevalt lihtsustatud komponentide suhtlemise skeemi juurde ja joonistame selle suuremate detailidega — nii:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Mida silma torkab:

  • Veebifront ja muusika kasutavad sama rakenduste serveri isoleeritud klastreid.
  • Saame mÀÀratleda loogilised kihid, mis kuuluvad nende klastrite alla: front'id, vahemĂ€lud, andmete salvestamise ja haldamise kiht.
  • Frontend ei ole ĂŒhtlane, need on erinevad funktsionaalsed alamsĂŒsteemid.
  • VahemĂ€lusid saab samuti jaotada alamsĂŒsteemi jĂ€rgi, mille andmeid nad vahemĂ€lustavad.

Joonistame pildi veel kord ĂŒmber:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Vau! Me nĂ€eme hierarhiat! See tĂ€hendab, et saame ressursse jagada suuremates tĂŒkkides: mÀÀrata vastutav arendaja selle hierarhia sĂ”lmele, mis vastab funktsionaalsetele alam-sĂŒsteemidele (nagu „music“ pildil), ning siduda sellele tasemele hierarhias ka kvota. Selline hierarhia vĂ”imaldab meil ka paindlikumalt korraldada teenuseid, et need oleksid haldamise seisukohalt mugavamad. NĂ€iteks jagame kĂ”ik veebiserverid, kuna see on vĂ€ga suur serverite rĂŒhm, mitmeks vĂ€iksemaks grupiks, nagu pildil on nĂ€idatud group1, group2.

Eemaldades liigsed jooned, saame iga sÔlme meie pildist kirja panna lamedamas vormis: group1.web.front, api.music.front, user-cache.cache.

Nii me jĂ”uame mĂ”isteteni "hierarhiline jĂ€rjekord". Sel on nimi, nĂ€iteks "group1.web.front". Sellele mÀÀratakse ressursside kvoodid ja kasutajate Ă”igused. DevOps töötajale anname Ă”iguse teenuse jĂ€rjekorda saatmiseks, ja selline töötaja vĂ”ib jĂ€rjekorras midagi kĂ€ivitada, ning OpsDev töötajale adminniĂ”igused, mis tĂ€hendab, et nĂŒĂŒd saab ta jĂ€rjekorda hallata, sinna inimesi mÀÀrata, anda neile Ă”igusi jne. JĂ€rjekorras kĂ€ivitatavad teenused töötatakse vĂ€lja jĂ€rjekorra kvoodi piires. Kui jĂ€rjekorra arvutuslik kvoot ei ole piisav kĂ”igi teenuste samaaegseks tĂ€itmiseks, siis nad tĂ€idetakse jĂ€rjestikku, moodustades seelĂ€bi ise jĂ€rjekorra.

Vaatame teenuseid lĂ€hemalt. Teenusel on tĂ€ielik nimi, mis sisaldab alati jĂ€rjekorra nime. Seega veebifront teenus saab nimeks ok-web.group1.web.front. Ja rakendusserveri teenus, millega see suhtleb, nimetatakse ok-app.group1.web.front. Iga teenusel on manifest, kus on kirjas kogu vajalik teave, et paigaldada see konkreetsetele masinatele: kui palju ressursse see ĂŒlesanne tarbib, milline konfiguratsioon on vajalik, kui palju koopiaid peaks olema, teenuse tĂ”rkeotsingu omadused. Ja pĂ€rast teenuse paigaldamist masinatel ilmuvad selle eksemplarid. Need on samuti unikaalselt nimetatud — kui eksemplari number ja teenuse nimi: 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 selgeks teha.

Ja nĂŒĂŒd tutvume lĂ€hemalt, mida need eksemplarid tegelikult teevad: ĂŒlesanded.

Ülesannete isoleerimise klassid

KĂ”ik ĂŒlesanded OKes (ja tĂ”enĂ€oliselt ka igal pool mujal) saab jagada rĂŒhmadesse:

  • LĂŒhikese viivitusega ĂŒlesanded — prod. Selliste ĂŒlesannete ja teenuste puhul on vĂ€ga oluline vastuse viivitus (latency), kui kiiresti sĂŒsteem iga pĂ€ringut töödelda suudab. Ülesannete nĂ€ited: veebi esipinnad, sisedoosid, rakenduste serverid, OLTP salvestused jne.
  • ArvutusĂŒlesanded — batch. Siin on igasuguste pĂ€ringute töötlemise kiirus ebaoluline. Olulisem on, kui palju arvutusi antud (suur) ajavahemiku jooksul see ĂŒlesanne teostab (throughput). Selle alla kĂ€ivad kĂ”ik MapReduce, Hadoop, masinĂ”ppe, statistika ĂŒlesanded.
  • TaustĂŒlesanded — idle. Selliste ĂŒlesannete puhul ei ole ei latency ega throughput nii olulised. Siia kuuluvad erinevad testid, migratsioonid, ĂŒmberarvutused, andmete konverteerimine ĂŒhest formaadist teise. Ühelt poolt sarnanevad need aritmeetilistele ĂŒlesannetele, kuid teisalt pole meil vĂ€ga oluline, kui kiiresti need lĂ”pule viiakse.

Vaadakem, kuidas sellised ĂŒlesanded ressursse, nĂ€iteks keskprotsessorit, tarbivad.

LĂŒhikese latentsusega ĂŒlesanded. Sellise ĂŒlesande proportsioon protsessori kasutuses nĂ€eb vĂ€lja selline:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Kasutajalt tuleb pĂ€ring, ĂŒlesanne hakkab kasutama kĂ”iki saadaval olevaid protsessori tuumasid, töötleb, tagastab vastuse, ootab jĂ€rgmist pĂ€ringut ja seisab. JĂ€rgmisel pĂ€ringul — taas kasutatakse kĂ”ike, mis oli, arvutatakse, ootame jĂ€rgmist.

Minimaalse viivituse tagamiseks selle ĂŒlesande puhul peame me vĂ”tma maksimaalselt tarvitatavad ressursid ning reserveerima vajalikud tuumad minjoni (masina, mis tĂ€idab ĂŒlesannet) jaoks. Siis on meie ĂŒlesande reserveerimise valem jĂ€rgmine:

alloc: cpu = 4 (max)

ja kui meil on 16 tuumaga minjoni masin, siis saame sellele tĂ€pselt neli sellist ĂŒlesannet paigutada. Eriti oluline on mĂ€rkida, et nende ĂŒlesannete keskmine protsessori kasutus on sageli vĂ€ga madal — mis on ilmselge, kuna suure osa ajast ootab ĂŒlesanne pĂ€ringut ja ei tee midagi.

ArvutusĂŒlesanded. Nende muster on pisut erinev:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Nende ĂŒlesannete keskmine ressursi kasutus protsessoris on piisavalt kĂ”rge. Sageli tahame, et arvutusĂŒlesanne teostataks kindla ajavahemiku jooksul, seega tuleb reserveerida minimaalne protsessorite arv, mis on vajalik, et kogu arvutus lĂ”ppeks vastuvĂ”etava aja jooksul. Selle reserveerimise valem nĂ€eb vĂ€lja jĂ€rgmine:

alloc: cpu = [1,* )

„Palun paiguta minjoni, kus on vĂ€hemalt ĂŒks vaba tuum, ja ĂŒlejÀÀnud vĂ”tavad kĂ”ik, mis saadaval on.”

Siin on ressursikasutuse efektiivsus tunduvalt parem kui lĂŒhikese latentsusega ĂŒlesannete puhul. Kuid kasu on palju suurem, kui kombineerida mĂ”lemat tĂŒĂŒpi ĂŒlesandeid ĂŒhel masin-minionil ja jaotada selle ressursse jooksvalt. Kui lĂŒhikese latentsusega ĂŒlesanne nĂ”uab protsessorit, saab ta selle kohe, ja kui ressursse enam ei vajata, antakse need edasi arvutusĂŒlesandele, st umbes nii:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Aga kuidas seda teha?

Alustame prod ja selle alloc’i mĂ”istmisest: cpu = 4. Me peame reserveerima neli sĂŒdamikku. Docker run'is saab seda teha kahes erinevas viisis:

  • Kasutades valikut --cpuset=1-4, st mÀÀrata ĂŒlesandele neli kindlat sĂŒdant masinas.
  • Kasutage --cpuquota=400_000 --cpuperiod=100_000, mÀÀrata protsessori aja kvoot, st nĂ€idata, et iga 100 ms reaalajas tarbib ĂŒlesanne mitte rohkem kui 400 ms protsessori aega. Selgub, et need on samad neli sĂŒdamikku.

Aga milline neist viisidest sobib?

Cpuset nĂ€eb ĂŒsna atraktiivne vĂ€lja. Ülesandel on neli pĂŒhendatud tuuma, mis tĂ€hendab, et protsessori vahemĂ€lu töötab maksimaalselt efektiivselt. Kuid sellega kaasneb ka tagasilöök: me peaksime ise hakkama ĂŒlesandeid jaotama masiivi vĂ€hem koormatud tuumade vahel, mitte operatsioonisĂŒsteemi, ja see on ĂŒsna keeruline ĂŒlesanne, eriti kui proovime viia sellisele masinale batch-ĂŒlesandeid. Testid nĂ€itasid, et siinkohal sobib paremini kvota variant: nii on operatsioonisĂŒsteemil rohkem vabadust valida tuum, kus praegu ĂŒlesannet tĂ€ita, ja protsessori aeg jaguneb efektiivsemalt.

Selgitame, kuidas Dockeris minimaalsete tuuma arvude tagamiseks töötada. Batch-ĂŒlesannete jaoks pole kvota enam rakendatav, kuna ei ole vajalik maksimaalselt piirata, piisab ainult minimaalse garanteerimisest. Siin sobib hĂ€sti valik docker run --cpushares.

Me lepime kokku, et kui batch nĂ”uab minimaalset garantiid ĂŒhe tuuma jaoks, siis mĂ€rkime --cpushares=1024, ja kui minimaalne on kahe tuuma jaoks, siis mĂ€rkime --cpushares=2048. CPU jagatud ei sekku protsessorite aja jaotamisse seni, kuni seda jĂ€tkub. Seega, kui prod ei kasuta hetkel kĂ”iki oma nelja tuuma - ei piira miski batch-ĂŒlesandeid ning need vĂ”ivad kasutada lisaprotsessori aega. Kuid protsessori nappuse olukorras, kui prod on kasutanud kĂ”ik oma neli tuuma ja koperdab piirini - jagatakse ĂŒlejÀÀnud protsessori aeg proportsionaalselt cpushares'i jĂ€rgi. St kolme vabaga tuuma puhul saab ĂŒhe ĂŒlesanne, millel on 1024 cpushares, ja teised kaks - ĂŒlesanne, millel on 2048 cpushares.

Kuid kvota ja jagude kasutamine ei ole piisav. Me peame tagama, et madala viivitusega ĂŒlesanne saab prioriteedi batch-ĂŒlesande ees protsessori aja jaotamisel. Ilma sellise prioriteedita vĂ”taks batch-ĂŒlesanne kogu protsessori aja Ă€ra, kui seda on vaja prod jaoks. Docker runis ei ole konteinerite prioriseerimiseks mingeid valikuid, kuid CPU ajakava poliitikad Linuxis tulevad appi. Nende kohta saab lugeda siin, ja selles artiklis kĂ€sitleme neid lĂŒhidalt:

  • SCHED_OTHER
    Vaikimisi saavad kÔik tavalised kasutaja protsessid Linuxi masinal.
  • SCHED_BATCH
    MĂ”eldud ressursimahukatele protsessidele. Kui ĂŒlesanne paigutatakse protsessorisse, kehtestatakse nn aktiveerimisrakendus: sellisel juhul on tĂ”enĂ€olisem, et ĂŒlesanne ei saa protsessori ressursse, kui neid kasutab SCHED_OTHER ĂŒlesanne.
  • SCHED_IDLE
    Taustaprotsess, mille prioriteet on vĂ€ga madal, isegi madalam kui nice –19. Kasutame oma avatud lĂ€htekoodiga teeki one-nio, et mÀÀrata vajalik poliitika konteineri kĂ€ivitamisel kutsumisega

one.nio.os.Proc.sched_setscheduler( pid, Proc.SCHED_IDLE )

Kuid isegi kui te ei programmeeri Java keeles, saab sama teha kÀsuga chrt:

chrt -i 0 $pid

Kogume kĂ”ik meie isolatsioonitasemed ĂŒhte tabelisse selguse huvides:

Isolatsiooniklass
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 vaikimisi eemaldab Docker selle capability konteineri kÀivitamisel.

Kuid ĂŒlesanded tarbivad mitte ainult protsessorit, vaid ka liiklust, mis mĂ”jutab vĂ”rguĂŒlesande viivitust isegi rohkem kui protsessori ressursi vale jaotamine. SeetĂ”ttu soovime loomulikult saada tĂ€pselt sama pilti ka liikluse osas. See tĂ€hendab, et kui tootmisĂŒlesanne saadab vĂ”rku teatud pakette, siis me mÀÀratleme maksimaalse kiirus(piirangud) alloc: lan=[*,500mbps) ), mille kiirusel tootmine seda teha saab. Ja batch'i puhul garanteerime ainult minimaalse lĂ€bilaskevĂ”ime, kuid mitte maksimaalse (piirangud alloc: lan=[10Mbps,*) ) Samuti peab tootmise liiklus olema eelisseisundis batch-ĂŒlesannete ees.
Siin ei ole Dockeril mingeid primitiive, mida saaksime kasutada. Kuid meid aitab Linux Traffic Control. Me oleme saavutanud soovitud tulemuse distsipliini abil Hierarchical Fair Service Curve. Selle abil eraldame kaks liikluse klassi: kÔrge prioriteet tootmine ja madala prioriteediga batch/idle. LÔpuks on vÀljamineva liikluse konfiguratsioon jÀrgmine:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

siin 1:0 — «juure qdisc» hsfc distsipliinis; 1:1 — alamklass hsfc, millel on 8 Gbit/s ĂŒhine ribalaiuse piirang, kuhu kuuluvad kĂ”igi konteinerite alamklassid; 1:2 — hsfc alamklass, mis on ĂŒhine kĂ”igile batch ja idle ĂŒlesannetele, millel on „dĂŒnaamiline” piirang, millest allpool. ÜlejÀÀnud hsfc alamklassid on pĂŒhendatud klassid hetkel töötavatele prod-konteineritele ja nende piirangud vastavad nende manifestidele, - 450 ja 400 Mbit/s. Iga hsfc klassi jaoks on mÀÀratud qdisc jĂ€rjekord fq vĂ”i fq_codel, sĂ”ltuvalt linuxi tuuma versioonist, et vĂ€ltida pakettide kadumist liiklustipude ajal.

Tavaliselt teenivad tc distsipliinid ainult vĂ€ljamineva liikluse prioriseerimist. Kuid me tahame prioriseerida ka sissetulevat liiklust — kuna mĂ”ni batch-ĂŒlesanne vĂ”ib kergesti Ă€ra vĂ”tta kogu sissetuleva kanali, nĂ€iteks suurt andmepaketti map&reduce'i jaoks. Selleks kasutame moodulit ifb, mis loob iga vĂ”rgu liidese jaoks virtuaalse liidese ifbX ja suunab sissetuleva liikluse liideselt ifbX-i vĂ€ljaminevaks. Edasi toimivad kĂ”ik samad distsipliinid vĂ€ljamineva liikluse kontrollimiseks, mille jaoks hsfc konfiguratsioon on vĂ€ga sarnane:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Eksperimentide kĂ€igus selgus, et parimad tulemused hsfc saavutab siis, kui klassi 1:2 madalama prioriteediga batch/idle liiklus on masinatel-minionidel piiratud mitte rohkem kui mingisuguse vaba ribalaiusega. Vastasel juhul mĂ”jutab madalama prioriteediga liiklus liiga tugevalt prod-ĂŒlesannete viivitust. Praegust vaba ribalaiuse suurust mÀÀrab miniond iga sekundi jooksul, mÔÔtes kĂ”igi kĂ€imasolevate prod-ĂŒlesannete keskmist liiklusnĂ”udlust selle minioni lĂ”ikes One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes ja lahutades selle vĂ”rgu liidese lĂ€bilaskevĂ”imest One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes mĂ”ningase varuga, st.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Ribalaiused mÀÀratakse sissetuleva ja vĂ€ljamineva liikluse jaoks sĂ”ltumatult. Ja vastavalt uutele vÀÀrtustele miniond konfigureerib ĂŒmber madalama prioriteediga klassi 1:2 limiidi.

Nii oleme rakendanud kĂ”iki kolme isolatsiooniklassi: prod, batch ja idle. Need klassid mĂ”jutavad oluliselt ĂŒlesannete tĂ€itmise omadusi. SeetĂ”ttu otsustasime selle tunnuse hierarhiasse ĂŒles tĂ”sta, et hierarhilise jĂ€rjekorra nime vaadates oleks kohe selge, millega me tegeleme:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

KĂ”ik meie tuttavad web ja music frondid paigutatakse siis hierarhiatesse prod alla. NĂ€iteks paigutame teenuse music catalog, mis perioodiliselt koostab muusikateoste katalooge, mis on ĂŒles laaditud "Odnoklassniki" mp3-failidest. NĂ€iteks idle teenuse nĂ€iteks vĂ”ib olla music transformer, mis normaliseerib muusika helitugevuse taseme.

Korrates, kui eemaldame tarbetud read, saame meie teenuste nimed kirjutada lamedamalt, lisades ĂŒlesande isolatsiooniklassi teenuse tĂ€ieliku nime lĂ”ppu: web.front.prod, catalog.music.batch, transformer.music.idle.

Ja nĂŒĂŒd, vaadates teenuse nime, mĂ”istame mitte ainult seda, millist funktsiooni see tĂ€idab, vaid ka tema isolatsiooniklassi, seega tema kriitilisust jne.

KĂ”ik on suurepĂ€rane, kuid on ĂŒks kibedat tĂ”de. Ülesannete, mis töötavad ĂŒhel masinal, tĂ€ielik isolatsioon on vĂ”imatu.

Mida oleme saavutanud: kui batch tarbib intensiivselt ainult CPU ressursside osas, integreeritud Linuxi CPU ajakava tĂ€idab oma ĂŒlesande vĂ€ga hĂ€sti, mĂ”jutades tootmisĂŒlesannet peaaegu mitte midagi. Kuid kui see baatch-ĂŒlesanne hakkab aktiivselt mĂ€luga töötama, siis ilmneb juba vastastikune mĂ”ju. See juhtub seetĂ”ttu, et tootmisĂŒlesande puhul "kannavad" mĂ€lust protsessori vahemĂ€llud — tulemusena kasvavad vahemĂ€lu tabamuste arv ja protsessor töötleb tootmisĂŒlesannet aeglasemalt. Selline baatch-ĂŒlesanne vĂ”ib tĂ”sta meie tĂŒĂŒpilise tootmisnĂ”ude latentsust kuni 10% vĂ”rra.

Liiklust isoleerida on veelgi keerulisem, kuna kaasaegsetel vĂ”rgukaartidel on olemas sisemine pakettide jĂ€rjekord. Kui baatch-ĂŒlesande pakett jĂ”uab sinna esimesena, siis saadetakse see ka esimesena ĂŒle kaabli, ja siin ei saa midagi teha.

Lisaks oleme suutnud lahendada ainult TCP-liikluse prioriseerimise probleemi: UDP puhul ei tööta hsfc lĂ€henemine. Ja isegi TCP-liiklusel, kui baatch-ĂŒlesanne genereerib palju liiklust, pĂ”hjustab see samuti umbes 10% tootmisĂŒlesande latentsuse suurenemist.

Katastroofitaluvus

Üheks eesmĂ€rgiks one-cloud arendamisel oli parandada Odnoklassniki tĂ”rkevastupidavust. Seega sooviksin pĂ”hjalikumalt kĂ€sitleda vĂ”imalikke tĂ”rke- ja hĂ€daolukordi. Alustame lihtsast stsenaariumist — konteineri tĂ”rkest.

Konteiner vĂ”ib ise mitmeti ebaĂ”nnestuda. See vĂ”ib olla mingi eksperiment, bug vĂ”i viga manifestis, mis sunnib prod-ĂŒlesannet tarbima rohkem ressursse kui manifestis mÀÀratud. Meil oli olukord: arendaja rakendas keerulist algoritmi, tegi seda korduvalt, muutis selle liiga keeruliseks ja segadusse sattudes, pĂ”hjustas, et ĂŒlesanne jĂ€i tĂ”eliselt keeruliselt lĂ”ksu. Kuna prod-ĂŒlesanne on prioriteetsed kĂ”ikidest teistest samadel mini-ressurssidel, hakkas see tarbima kĂ”iki saadaval olevaid protsessorite ressursse. Sellises olukorras pÀÀstis isolatsioon, tĂ€psemalt protsessori aja kvoot. Kui ĂŒlesandele on mÀÀratud kvoot, ei tarbi ĂŒlesanne rohkem. Seega batch- ja muud prod-ĂŒlesanded, mis töötasid samal masinal, ei mĂ€rganud midagi.

Teine vĂ”imalik probleem on konteineri kokkuvarisemine. Ja siinkohal aitavad meid taaskĂ€ivitamise poliitikad, millest kĂ”ik teavad; Docker suudab sellega suurepĂ€raselt toime tulla. Peaaegu kĂ”ik prod-ĂŒlesanded omavad taaskĂ€ivitamise poliitikat always. MĂ”nikord kasutame on_failure batch-ĂŒlesannete vĂ”i prod-konteinerite silumise jaoks.

Mida saab teha, kui terve minion on kÀttesaamatuks muutunud?

Ilmselt tuleb konteiner kÀivitada teisel masinal. KÔige huvitavam on see, mis juhtub konteinerile mÀÀratud IP-aadressiga (aedressidega).

Saame konteineritele mÀÀrata samu IP-aadresse nagu masinatel, mille minionid neid konteinerite kĂ€ivitamiseks kasutavad. Siis kui konteiner kĂ€ivitatakse teisel masinal, muutub tema IP-aadress, ja kĂ”ik kliendid peavad mĂ”istma, et konteiner on kolinud; nĂŒĂŒd tuleb minna teise aadressi juurde, mis nĂ”uab eraldi teenuse Service Discovery.

Service Discovery on mugav. Turul on palju lahendusi erineva rikke taluvuse tasemega teenuste registri korraldamiseks. Tihti sellistes lahendustes rakendatakse koormuse tasakaalustamise loogikat, lisakonfiguratsiooni salvestamist KV-poodide kujul jne.
Kuid me sooviksime vĂ€ltida vajadust eraldi registri integreerimise jĂ€rele, kuna see tĂ€hendaks kriitilise sĂŒsteemi loomist, mida kasutavad kĂ”ik teenused tootmises. See tĂ€hendab potentsiaalset rikke punkti, mistĂ”ttu tuleb valida vĂ”i arendada vĂ€ga tĂ”rke-kindel lahendus, mis on ilmselgelt vĂ€ga keeruline, aeganĂ”udev ja kallis.

Veel ĂŒks suur puudus: meie vana infrastruktuuri töötamiseks uuega oleks pidanud kĂ”ik ĂŒlesanded ĂŒmber kirjutama mĂ”ne teenust avastava sĂŒsteemi kasutamise jaoks. Töö on ÄÄRMISELT palju ja mĂ”nes kohas lausa vĂ”imatu, kui tegemist on madala taseme seadmetega, mis töötavad operatsioonisĂŒsteemi tasandil vĂ”i otse riistvaraga. Selle funktsionaalsuse rakendamine tuttavate lahendusmustritega, nagu nĂ€iteks side-car tĂ€hendaks mĂ”nes kohas lisakoormust, mĂ”nes — haldamise keerukust ja tĂ€iendavaid rikke stsenaariume. Me ei soovinud keerukust, seega otsustasime teha teenust avastamise valikuliseks.

One-cloud IP jĂ€rgneb konteinerile, st iga ĂŒlesande eksemplaril on oma IP-aadress. See aadress on 'staatiline': see mÀÀratakse igale eksemplarile hetkest, mil teenus esmakordselt pilve saadetakse. Kui teenuse eluea jooksul oli erinev arv eksemplare, siis lĂ”puks on sellega seotud nii palju IP-aadresse, kui oli eksemplare maksimaalselt.

Hiljem neid aadresse ei muudeta: need mÀÀratakse kord ja pĂŒsivad teenuse elu jooksul tootmises. IP-aadressid jĂ€rgivad konteinerite vĂ”rku. Kui konteiner kantakse teisele miniaturisatsioonile, siis lĂ€heb ka aadress tema kaasa.

Nii et teenuse nime ja tema IP-aadresside nimekirja sobitamine muutub vĂ€ga harva. Kui veel kord vaadata teenuse eksemplaride nimesid, mida mainisime artikli alguses (1.ok-web.group1.web.front.prod, 2.ok-web.group1.web.front.prod, 
), siis mĂ€rkame, et need sarnanevad DNS-is kasutatavatele FQDN-idele. Just selleks kasutame teenuste eksemplaride nimede sidumiseks nende IP-aadressidega DNS-protokolli. See DNS tagastab kĂ”ik reserveeritud IP-aadressid kĂ”igile konteineritele — nii töötavatele kui ka peatatud (kui meil on nĂ€iteks kolm replikat ja seal on viis reserveeritud aadressi — tagastatakse kĂ”ik viis). Klientidele, kes saavad selle teabe, proovivad nad ĂŒhendust luua kĂ”igi viie replikaga — ja tuvastavad seelĂ€bi need, mis töötavad. See kĂ€ttesaadavuse mÀÀramise variant on oluliselt usaldusvÀÀrsem, kuna see ei hĂ”lma DNS-i ega teenuse avastamist, mistĂ”ttu ei teki ka keerulisi probleeme teabe ajakohasuse ja nende sĂŒsteemide talitluskatkestuse tagamisega. Veelgi enam, kriitilistes teenustes, mille töö sĂ”ltub kogu portaali toimimisest, vĂ”ime DNS-i ĂŒldse mitte kasutada ja lihtsalt sisestada konfiguratsiooni IP-aadressid.

Sellise IP edastamise rakendamine konteinerite taga vĂ”ib olla mitte triviaalne — ja peatume selle toimimisel jĂ€rgmise nĂ€ite kaudu:

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Kujutame ette, et one-cloud meister annab kĂ€su minionile M1 kĂ€ivitada 1.ok-web.group1.web.front.prod aadressiga 1.1.1.1. Minione töötab BIRD, mis kuulutab seda aadressi spetsiaalsetele serveritele route reflector. Viimastel on BGP-seanss vĂ”rgu seadmega, millele marsruut 1.1.1.1 edastatakse M1 kaudu. M1 suunab paketid konteinerisse juba Linuxi vahenditega. Route reflectorite arv on kolm, kuna see on one-cloudi infrastruktuuri vĂ€ga kriitiline osa — ilma nendeta ei toimiks vĂ”rk one-cloudis. Me paigutame need erinevatesse rackidesse, vĂ”imalusel eri andmekeskuste saalidesse, et vĂ€hendada kĂ”igi kolme samaaegse rikke tĂ”enĂ€osust.

Oletame nĂŒĂŒd, et side one-cloudi meistri ja minioni M1 vahel on katkenud. One-cloudi meister kĂ€itub nĂŒĂŒd eeldusel, et M1 on tĂ€ielikult ebaĂ”nnestunud. See tĂ€hendab, et ta annab kĂ€su minionile M2 kĂ€ivituda web.group1.web.front.prod sama aadressiga 1.1.1.1. NĂŒĂŒd on meil kaks konfliktset marsruuti vĂ”rgus aadressile 1.1.1.1: M1 ja M2. Selliste konfliktide lahendamiseks kasutame Multi Exit Discriminator'it, mis on mĂ€rgitud BGP-teates. See number nĂ€itab reklaamitud marsruudi kaalu. Konfliktsetest valitakse marsruut, millel on vĂ€iksem MED-vÀÀrtus. One-cloudi meister toetab MED'i kui IP-aadresside konteinerite lahutamatut osa. Esmakordselt vĂ€ljastatakse aadress piisavalt suure MED = 1 000 000. Kui selline konteineri hĂ€daolukord esineb, vĂ€hendab meister MED'i ja M2 saab juba kĂ€su reklaamida aadressi 1.1.1.1 MED = 999 999. Samas M1-l töötav eksemplar jÀÀb teie ĂŒhenduse puudumise tĂ”ttu ning selle edasine saatus meid ei huvitagi kuni ĂŒhenduse taastamiseni meistriga, mil ta ka lĂ”petatakse kui vana koopia.

Ohtlikud olukorrad

KĂ”ik andmekeskuste haldamise sĂŒsteemid töötavad alati hĂ€sti vĂ€lja vĂ€iksemaid tĂ”rkeid. Koneetigear oli praktiliselt igal pool norm.

Vaatame, kuidas me hĂ€daolukorraga toime tuleme, nĂ€iteks toitekatkestus ĂŒhes vĂ”i mitmes andmekeskuse saalis.

Mida tĂ€hendab avarii andmekeskuse juhtimissĂŒsteemile? Esiteks on see massiivne korraga juhtunud mitme seadme rike, mille korral peab juhtimissĂŒsteem kohe migreerima vĂ€ga palju konteynereid. Kuid kui avarii on vĂ€ga ulatuslik, vĂ”ib tekkida olukord, kus kĂ”iki ĂŒlesandeid ei saa mujale jaotada, kuna andmekeskuse ressursside maht langeb alla 100% koormuse.

Sageli kaasnevad avariidega ka juhtimistasandi riketeid. See vÔib juhtuda tema seadmete rikke tÔttu, kuid sagedamini seetÔttu, et avariisid ei ole testeeritud, ja juhtimistasand ise kukub suure koormuse tÔttu kokku.

Mida kÔigega selle kohta teha saab?

Massilised migreerimised tĂ€hendavad, et infrastruktuuris tekib suur hulk tegevusi, migreerimisi ja paigutusi. Iga migreerimine vĂ”ib vĂ”tta aega, mis on vajalik konteinerimoodulite piltide toimetamiseks ja lahtipakkimiseks minionides, konteinerite kĂ€ivitamiseks ja initsialiseerimiseks jne. SeetĂ”ttu on soovitav, et olulisemad ĂŒlesanded kĂ€ivituksid enne vĂ€hemolulisi.

Uurime taas tuttavat teenuste hierarhiat ja proovime otsustada, millised ĂŒlesanded me esmajĂ€rjekorras kĂ€ima lĂŒkkame.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Loomulikult on need protsessid, mis otse osalevad kasutaja pĂ€ringute töötlemises, st prod. Me mĂ€rkime selle ĂŒles prioriteedi mÀÀramisega — numbriga, mis vĂ”ib olla mÀÀratud jĂ€rjekorrale. Kui mingi jĂ€rjekorra prioriteet on kĂ”rgem, paigutatakse selle teenused esmajĂ€rjekorras.

Prodile mÀÀrame kĂ”rgemad prioriteedid, 0; batchile veidi madalamad, 100; idle-le veel madalamad, 200. Prioriteedid kehtivad hierarhiliselt. KĂ”ikidel madalama hierarhiaga ĂŒlesannetel on vastav prioriteet. Kui tahame, et prod-i sees kĂ€ivituksid vahemĂ€lud enne frontend-e, siis mÀÀrame prioriteedid cache = 0 ja frontend-i alamjĂ€rjekorrale = 1. Kui aga soovime, et frontidest kĂ€ivituks esmalt pĂ”hiportaal, ja muusika front siis hiljem, vĂ”ime viimasele mÀÀrata madalama prioriteedi — 10.

JĂ€rgmine probleem on ressursside puudus. Meil on suured varustuse rikkeid, terveid andmekeskuste saale, ja oleme kĂ€ivitanud nii palju teenuseid, et nĂŒĂŒd ei jĂ€tku ressursse kĂ”igile. Tuleb otsustada, millistest ĂŒlesannetest vĂ”ib loobuda, et pÀÀsta kriitilised teenused.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

Erinevalt paigutuse prioriteedist ei saa me kĂ”iki batch-ĂŒlesandeid lihtsalt kĂ”rvale jĂ€tta, mĂ”ned neist on portaali toimimise jaoks olulised. SeetĂ”ttu oleme eraldanud prioriteedi vĂ€lja tĂ”rjumine ĂŒlesande. Paigutamise ajal vĂ”ib kĂ”rgema prioriteediga ĂŒlesanne kĂ”rvale tĂ”rjuda, st lĂ”petada madalama prioriteediga ĂŒlesande, kui ei ole enam vabu minione. Sel juhul jÀÀb madalama prioriteediga ĂŒlesanne tĂ”enĂ€oliselt paigutamata, st ei leita talle enam sobivat minionit, kellel on piisavalt vabade ressursside.

Meie hierarhias on vĂ€ga lihtne mÀÀrata selline prioriteet, et prod- ja batch-ĂŒlesanded tĂ”ukavad vĂ”i peatavad idle-ĂŒlesanded, kuid mitte ĂŒksteist, mÀÀrates idle jaoks prioriteedi, mis on 200. Nii nagu paigutuse prioriteedi puhul, saame kasutada meie hierarhias, et kirjeldada keerukamaid reegleid. NĂ€iteks mÀÀrame, et muusika funktsioon on midagi, millega me loobume, kui meie pĂ”hivebilehe ressursid ei piisa, seades vastavatele sĂ”lmedele madalama prioriteedi: 10.

DC avariid tÀielikult

Miks vĂ”ib kogu andmekeskus ebaĂ”nnestuda? LoodusjĂ”ud. Oli hea postitus, kuidas orkaan mĂ”jutas andmekeskuse tööd. LoodusjĂ”ududeks vĂ”ib pidada ka kodutuid, kes kunagi suutsid optikat kollektoris pĂ”letada, ja andmekeskus kaotas tĂ€ielikult ĂŒhenduse teiste paikadega. Rikkumise pĂ”hjuseks vĂ”ib olla ka inimfaktor: operaator annab kĂ€su, mille tulemusena kukub kogu andmekeskus. See vĂ”ib juhtuda suure vea tĂ”ttu. Üldiselt kukuvad andmekeskused — see pole haruldane. Meil toimub see ĂŒks kord paarikuu jooksul.

Ja siin on, mida me teeme, et keegi #okĆŸivii ei postitaks Twitteris.

Esimene strateegia on isoleerimine. Iga one-cloud instants on isoleeritud ja suudab hallata vaid ĂŒhe andmekeskuse masinaid. Seega tĂ€hendab pilve kaotamine vigade vĂ”i operaatori vale kĂ€su tĂ”ttu vaid ĂŒhe andmekeskuse kaotamist. Oleme selleks valmis: meil on varukoopia poliitika, mille kohaselt rakenduse ja andmete koopiad on paigutatud kĂ”ikidesse andmekeskustesse. Kasutame tĂ”rgeteta andmebaase ja testime perioodiliselt tĂ”rkeid.
Kuna meil on tÀna neli andmekeskust, on ka neli eraldi, tÀielikult isoleeritud one-cloud instantsi.

Selline lĂ€henemine mitte ainult ei kaitse fĂŒĂŒsiliste rikete eest, vaid vĂ”ib kaitsta ka operaatori vigu.

Mis veel saab inimfaktoriga teha? Kui operaator annab pilvele mingi kummalise vĂ”i potentsiaalselt ohtliku kĂ€su, vĂ”ib temalt ootamatult nĂ”uda vĂ€ikese ĂŒlesande tĂ€itmist, et kontrollida, kui hĂ€sti ta on mĂ”elnud. 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.

One-cloud — andmekeskuse taseme opsĂŒsteem Odnoklassnikutes

KokkuvÔte

one-cloudi eristuvad jooned:

  • Hierarhiline ja selge teenuste ja konteinerite nimetamise skeem, mis vĂ”imaldab vĂ€ga kiiresti teada saada, milline ĂŒlesanne see on, millele see viitab, kuidas see töötab ja kes selle eest vastutab.
  • Kasutame oma prod- ja batch-ĂŒlesannete ĂŒhinemise tehnikat minikonteinerites, et suurendada masinate ĂŒhiskasutuse efektiivsust. Cpuset'i asemel kasutame CPU kvoote, aktsiaid, CPU ajakava poliitikat ja Linuxi QoS-i.
  • TĂ€ielikult isoleerida sama masinaga töötavad konteinerid ei Ă”nnestunud, kuid nende vastastikune mĂ”ju jÀÀb 20% piiresse.
  • Teenuste korraldamine hierarhias aitab automaatsete avariide likvideerimise puhul paigutus- ja tĂ”rjumisprioriteetide.

KKK

Miks me ei valinud valmis lahendust.

  • Erinevad ĂŒlesannete isolatsiooniklassid vajavad erinevat loogikat minikonteinerites paigutamisel. Kui prod-ĂŒlesandeid saab paigutada lihtsalt ressursside reserveerimise kaudu, siis batch ja idle tuleb paigutada, jĂ€lgides masinate minikonteinerite reaalseid ressursikasutusi.
  • On oluline arvesse vĂ”tta selliseid ĂŒlesannete tarbimisressursse nagu:
    • vĂ”rgulaius;
    • ketaste tĂŒĂŒbid ja "spindlid."
  • Teenuste prioriteetide mÀÀramine hĂ€daolukordade likvideerimise kĂ€igus, meeskondade Ă”igused ja piirangud ressurssidele, mida lahendatakse hierarhiliste jĂ€rjekordade abil one-cloudis.
  • Inimlikult mĂ”istetavate konteinerite nimetuste loomise vajadus, et vĂ€hendada reageerimisaega hĂ€dadele ja intsidentidele.
  • Teenuse avastamise kohustusliku ja samal ajal laialdase rakendamise vĂ”imatus; vajadus kaua koos eksisteerida ĂŒlesannetega, mis on paigutatud fĂŒĂŒsilisele riistvarale — seda lahendatakse «staatiliste» IP-aadressidega, mis jĂ€rgnevad konteineritele, ja seetĂ”ttu on vajalik ainulaadne integratsioon suure vĂ”rguinfrastruktuuriga.

KĂ”ik need funktsioonid nĂ”uavad olemasolevate lahenduste olulisi ĂŒmberehitusi, ja arvestades töömahtu, mĂ”istsime, et saame arendada oma lahenduse umbes sama tööjĂ”u pingutusega. Kuid meie lahendust on oluliselt lihtsam kasutada ja edasi arendada — selles puuduvad ebavajalikud abstraktsioonid, mis toetavad meile mitteolulist funktsionaalsust.

Neile, kes loevad viimaseid ridu, — aitĂ€h kannatlikkuse ja tĂ€helepanu eest!

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster