{"id":52389,"date":"2019-11-07T00:00:00","date_gmt":"2019-11-06T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions"},"modified":"2020-02-18T14:00:05","modified_gmt":"2020-02-18T11:00:05","slug":"kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions","title":{"rendered":"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/fe7af07f3ac5ca4e75009993b742293e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTere, Habr! Mina olen Artem Karamy\u0161ev, s\u00fcsteemiadministreerimise meeskonna juht <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.Ru Cloud Solutions (MCS)<\/a><\/noindex>. Viimase aasta jooksul oleme k\u00e4ivitanud palju uusi tooteid. Soovisime saavutada, et API-teenused oleksid kergesti skaleeritavad, taluvuskatkestuste suhtes vastupidavad ja kiiresti kasvava kasutajakoormuse jaoks valmis. Meie platvorm p\u00f5hineb OpenStackil ning tahan r\u00e4\u00e4kida, milliseid taluvuskatkestuste probleeme pidime lahendama, et saada t\u00f6\u00f6kindel s\u00fcsteem. Arvan, et see huvitab ka neid, kes arendavad tooteid OpenStackil.<\/p>\n<p>Platvormi kogutaluvuskatkestus tuleneb selle komponentide vastupidavusest. Nii et l\u00e4heme j\u00e4rk-j\u00e4rgult l\u00e4bi k\u00f5ik tasemed, kus me avastasime riske ja lahendasime neid.<\/p>\n<p>Selle loo videoversiooni, mille algallikaks on ettekande Uptime day 4 konverentsil, korraldas <noindex><a rel=\"nofollow\" href=\"http:\/\/www.itsumma.ru\">ITSumma<\/a><\/noindex>, saab vaadata <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=3b06MVou-vg&amp;list=PLmXjIrLllpkjwuIGkzBkLbI7oHtUadmvZ&amp;index=5\">Uptime Community YouTube kanalilt<\/a><\/noindex>. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>F\u00fc\u00fcsilise arhitektuuri taluvuskatkestus<\/h2>\n<p>\nMCSi avalikuks m\u00f5eldud pilv asub praegu kahes Tier III andmekeskuses, mille vahel on f\u00fc\u00fcsilisel tasandil erinevate marsruutide peal testitud tume kiud, mille l\u00e4bilaskev\u00f5ime on 200 Gbit\/s. Tier III tase tagab vajalikud f\u00fc\u00fcsilise infrastruktuuri t\u00f5rketaluvuse. <\/p>\n<p>Tume kiud on reserveeritud nii f\u00fc\u00fcsilisel kui ka loogilisel tasandil. Kanalite reserveerimise protsess oli iteratiivne, esines probleeme ja me t\u00e4iustame pidevalt andmekeskuste vahelist \u00fchendust. <\/p>\n<blockquote><p>N\u00e4iteks hiljuti, kui t\u00f6\u00f6tati kaevanduses, mis asub \u00fche andmekeskuse l\u00e4hedal, l\u00f5hkus ekskavaator toru, milles asusid nii p\u00f5hja- kui varuoptilised kaablid. Meie andmekeskuse vaheline t\u00f5rketaluv kanal osutus \u00fches punktis, kaevanduses, haavatavaks. Seega kaotasime osa infrastruktuurist. Tehaseime j\u00e4reldusi, tegime mitmeid meetmeid, sealhulgas paigaldasime t\u00e4iendava optika naaberkaevandusse.<\/p><\/blockquote>\n<p>\nAndme \u0446\u0435\u043d\u0442rites on sidepakkujate kohaloleku punkte, kellele me edastame oma eelistusi BGP kaudu. Iga v\u00f5rgu suunas valitakse parim m\u00f5\u00f5dik, mis v\u00f5imaldab tagada erinevatele klientidele parimat \u00fchenduse kvaliteeti. Kui \u00fchendus \u00fche pakkujaga katkeb, muutume me oma marsruutimist kergesti teiste pakkujate kaudu.<\/p>\n<p>Teenusepakkuja rikkega juhtudel l\u00fclitume automaatselt j\u00e4rgmiseks. Kui \u00fcks andme keskus eba\u00f5nnestub, on meil teises andme keskuses peegellik koopia meie teenustest, mis v\u00f5tab kogu koormuse enda kanda.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/295ca212f48dd074d834154666e5b0c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>F\u00fc\u00fcsilise infrastruktuuri t\u00f5rgeteta t\u00f6\u00f6<\/i><\/p>\n<h2>Mida me kasutame rakendustasandi t\u00f5rgeteta t\u00f6\u00f6 tagamiseks<\/h2>\n<p>\nMeie teenus p\u00f5hineb mitmetel avatud l\u00e4htekoodiga komponentidel. <\/p>\n<p><b>ExaBGP<\/b> \u2014 teenus, mis rakendab mitmeid funktsioone d\u00fcnaamilise marsruutimise protokolli abil BGP raames. Me kasutame seda aktiivselt, et kuulutada v\u00e4lja meie valge IP-aadresse, mille kaudu kasutajad p\u00e4\u00e4sevad juurde API-le.<\/p>\n<p><b>HAProxy<\/b> \u2014 k\u00f5rge koormusega laadimisjaotur, mis v\u00f5imaldab seadistada v\u00e4ga paindlikke liikluse jaotamise reegleid erinevatel OSI mudeli tasanditel. Me kasutame seda k\u00f5igi teenuste, nagu andmebaasid, s\u00f5numite vahetajad, API-teenused, veebi-teenused ning meie siseprojektid, tasakaalustamiseks \u2014 k\u00f5ik on HAProxy taga.<\/p>\n<p><b>API rakendus<\/b> \u2014 veebirakendus, mis on kirjutatud pythonis, mille abil kasutaja haldab oma infrastruktuuri ja teenuseid.<\/p>\n<p><b>T\u00f6\u00f6tleja rakendus <\/b>(edasi on lihtsalt t\u00f6\u00f6tleja) \u2014 OpenStack teenustes on see infrastruktuuri demon, mis v\u00f5imaldab edastada API k\u00e4ske infrastruktuurile. N\u00e4iteks luuakse ketas just t\u00f6\u00f6tlejas, samas kui luua soovitakse API rakenduses. <\/p>\n<h2>OpenStack rakenduse standardarhitektuur<\/h2>\n<p>\nEnamik teenuseid, mis on v\u00e4lja t\u00f6\u00f6tatud OpenStacki jaoks, p\u00fc\u00fcavad j\u00e4rgida \u00fchtset paradigmat. Teenus koosneb tavaliselt kahest osast: API ja t\u00f6\u00f6tlusprotsessidest (t\u00f6\u00f6tajad). \u00dcldiselt on API WSGI-rakendus Pythonis, mis t\u00f6\u00f6tab kas iseseisva protsessina (daemon) v\u00f5i juba olemasoleva veebiserveri, nagu Nginx v\u00f5i Apache, kaudu. API t\u00f6\u00f6tleb kasutaja p\u00e4ringut ja edastab edasised juhised t\u00f6\u00f6tlusrakendusele. Edastamine toimub s\u00f5numibrokeri kaudu, milleks on tavaliselt RabbitMQ, teised on halvasti toetatud. Kui s\u00f5numid satuvad brookerisse, t\u00f6\u00f6tlevad neid t\u00f6\u00f6tajad ja vajadusel tagastavad vastuse. <\/p>\n<p>See paradigma eeldab eraldatud \u00fchiseid rikkepunkte: RabbitMQ ja andmebaasi. Ent RabbitMQ on isoleeritud \u00fche teenuse piires ja idee j\u00e4rgi v\u00f5ib see olla iga teenuse jaoks individuaalne. Seet\u00f5ttu jagame MCSis need teenused maksimaalselt, iga eraldi projekti jaoks loome eraldi andmebaasi ja eraldi RabbitMQ. See l\u00e4henemine on hea, kuna h\u00e4daolukorras m\u00f5nes haavatavas punktis ei riku kogu teenust, vaid ainult selle osa.<\/p>\n<p>Worker application'i arvu pole piiratud, seega saab API h\u00f5lpsasti horisontaalselt r\u00f6\u00f6puda koormuse tasakaalustajate tagaj\u00e4rjel, et suurendada j\u00f5udlust ja h\u00e4davajalikkust.<\/p>\n<blockquote><p>M\u00f5nedes teenustes on teenuse sees vajalik koordineerimine \u2014 kui toimuvad keerulised j\u00e4rjestikused toimingud API-de ja t\u00f6\u00f6tlejate vahel. Sellisel juhul kasutatakse \u00fchte koordineerimiskeskust, klastris\u00fcsteemi nagu Redis, Memcache, etcd, mis v\u00f5imaldab \u00fchel t\u00f6\u00f6tlejatel teisele \u00f6elda, et see \u00fclesanne on tema vastutada (\"sa, palun, \u00e4ra tee seda\"). Me kasutame etcd-d. \u00dcldiselt suhtlevad t\u00f6\u00f6tlejad aktiivselt andmebaasiga, kirjutades ja lugedes sealt teavet. Andmebaasina kasutame mariadb-d, mis asub meil multimaster-klastris.\n<\/p><\/blockquote>\n<p>\nSelline klassikaline \u00fcksikteenus on korraldatud OpenStacki tavap\u00e4rasel viisil. Seda saab vaadelda kui isoleeritud s\u00fcsteemi, mille jaoks on piisavalt selged meetodid skaleerimise ja kriitilisuse tagamiseks. N\u00e4iteks kriitilisuse tagamiseks piisab API-de ette koormustasakaalustaja paigaldamisest. Worker'ite skaleerimine saavutatakse nende arvu suurendamise teel. <\/p>\n<p>Kogu s\u00fcsteemi n\u00f5rk koht on RabbitMQ ja MariaDB. Nende arhitektuur v\u00e4\u00e4rib eraldi artiklit. Selles artiklis tahan keskenduda API-le ja selle t\u00f5rkekindlusele.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/f39e5a8ae350864e311bf4db3b9c34b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>OpenStack rakenduse arhitektuur. Pilveplatvormi tasakaalustamine ja t\u00f5rkekindlus.<\/i><\/p>\n<h2>Teeme HAProxy tasakaalustajast t\u00f5rkekindla ExaBGP abil.<\/h2>\n<p>\nKuna meie API-d peavad olema skaleeritavad, kiire ja t\u00f5rkekindlad, paigaldasime nende ette tasakaalustaja. Valisime HAProxy. Minu arvates omab see k\u00f5iki vajalikke omadusi meie \u00fclesande jaoks: tasakaalustamine mitmetel OSI tasemetel, haldusliides, paindlikkus ja skaleeritavus, suur hulk tasakaalustamismeetodeid, sessioonitabelite toetus.<\/p>\n<p>Esimene probleem, mille lahendamine oli vajalik, oli tasakaalustaja enda t\u00f5rkekindlus. Lihtne tasakaalustaja paigaldamine loob samuti t\u00f5rkepunkte: kui tasakaalustaja rikki l\u00e4heb \u2013 teenus kukub v\u00e4lja. Selle v\u00e4ltimiseks kasutasime HAProxy koos ExaBGP-ga.<\/p>\n<p>ExaBGP v\u00f5imaldab teenuse oleku kontrollimise mehhanismi rakendamist. Kasutasime seda mehhanismi HAProxy t\u00f6\u00f6kindluse kontrollimiseks ja probleemide korral HAProxy teenuse BGP-st v\u00e4ljal\u00fclitamiseks. <\/p>\n<p><b>ExaBGP+HAProxy skeem<\/b><\/p>\n<ol>\n<li>Paigaldame kolmele serverile vajaliku tarkvara, ExaBGP ja HAProxy. <\/li>\n<li>Igal serveril loome loopback-liidese.<\/li>\n<li>K\u00f5ikidel kolmel serveril m\u00e4\u00e4rame sellele liidesele sama avaliku IP-aadressi.<\/li>\n<li>Avalikult IP-aadress anoneeritakse internetis l\u00e4bi ExaBGP. <\/li>\n<\/ol>\n<p>\nKlienditeenuste t\u00f6\u00f6kindlus saavutatakse, anoneerides sama IP-aadressi k\u00f5igilt kolmest serverist. V\u00f5rgupoolest on sama aadress k\u00e4ttesaadav kolmest erinevast j\u00e4rgmise h\u00fcppena. Router n\u00e4eb kolme sama marsruuti, valib oma m\u00f5\u00f5dikutest l\u00e4htuvalt k\u00f5ige prioriteetsema (mis on tavaliselt sama valik) ja liiklus suunatakse ainult \u00fchte serverisse. <\/p>\n<p>Probleemide korral HAProxy t\u00f6\u00f6ga v\u00f5i serveri rikke puhul l\u00f5petab ExaBGP marsruudi anoneerimise ja liiklus suunatakse sujuvalt teisele serverile. <\/p>\n<p>Nii oleme saavutanud tasakaalustaja t\u00f6\u00f6kindluse.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/9fba0718176dc1266f25a2c01ec87348.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy tasakaalustajate t\u00f6\u00f6kindlus<\/i><\/p>\n<p>Skeem ei osutunud ideaalseteks: me \u00f5ppisime HAProxy varundamisest, kuid mitte koormuse jaotamisest teenuste sees. Seet\u00f5ttu laiendasime skeemi veidi: l\u00e4ksime \u00fcle mitmete valgete IP-aadresside vahelisele tasakaalustamisele.<\/p>\n<h2>DNS ja BGP p\u00f5hine tasakaalustamine<\/h2>\n<p>\nKoormuse tasakaalu k\u00fcsimus meie HAProxy ees j\u00e4i lahendamata. Siiski on sellelahendamine suhteliselt lihtne, nagu me seda enda juures tegime.<\/p>\n<p>Kolme serveri tasakaalustamiseks on vajalik 3 valget IP-aadressi ja hea vana DNS. Iga\u00fcks neist aadressidest m\u00e4\u00e4ratakse igale HAProxy'le loopback-liideses ja kuulutatakse internetti. <\/p>\n<p>OpenStackis kasutatakse ressursse haldava teenuste katalooge, kus m\u00e4\u00e4ratakse iga teenuse API l\u00f5pp-punkt. Selles kataloogis m\u00e4\u00e4rame domeeninime \u2014 public.infra.mail.ru, mis lahendatakse DNSi kaudu kolme erineva IP-aadressiga. Tulemuseks on koormuse jaotus kolme aadressi vahel DNSi kaudu. <\/p>\n<p>Kuna me ei kontrolli serverite valimise prioriteete valgete IP-aadresside kuulutamisel, ei ole see tasakaalustus. \u00dcldiselt valitakse ainult \u00fcks server IP-aadressi vanuse j\u00e4rgi, samas kui kaks teist j\u00e4\u00e4vad ootama, kuna BGP-s ei ole mingeid m\u00f5\u00f5dikuid m\u00e4\u00e4ratud.<\/p>\n<p>Oleme hakanud edastama marsruute ExaBGP kaudu erinevate m\u00f5\u00f5dikatega. Iga tasakaalustaja kuulutab k\u00f5ik kolm valget IP-aadressi, kuid \u00fcks neist, mis on antud tasakaalustaja jaoks peamine, kuulutatakse minimaalse m\u00f5\u00f5dikaga. Nii kaua, kui k\u00f5ik kolm tasakaalustajat on t\u00f6\u00f6korras, j\u00f5uavad p\u00e4ringud esimesse IP-aadressi esimesse tasakaalustajasse, teisesse teise ja kolmandasse kolmandasse.<\/p>\n<p>Mis juhtub hetkel, kui \u00fcks tasakaalustaja kukub? Kui \u00fckski tasakaalustaja eba\u00f5nnestub, kuulutatakse tema p\u00f5hiadress ikka veel kahe teise kaudu, liiklus nende vahel jaotatakse \u00fcmber. Nii anname kasutajale DNS-i kaudu kohe mitu IP-aadressi. DNS-i tasakaalu ja erinevate m\u00f5\u00f5dikate kaudu saavutan tasakaalustatud koormuse jaotuse k\u00f5igi kolme tasakaalustaja vahel, samal ajal mitte kaotades rikke taluvust.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/1485367a934aea06b68c6d05c184d263.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy tasakaalustus DNS-i + BGP baasil<\/i><\/p>\n<h2>ExaBGP ja HAProxy vaheliseks suhtluseks<\/h2>\n<p>\nNii oleme rakendanud talitluse katkestamise v\u00e4ltimist, mis p\u00f5hineb marsruutide anname l\u00f5petamisel. Kuid HAProxy v\u00f5ib sulgeda ka muudel p\u00f5hjustel, kui serveri rike: haldust\u00f5rked, teenuse sisemised probleemid. Soovime eemaldada purunenud koormaja koormusest ka nendes olukordades, ja selleks on vajalik teine mehhanism. <\/p>\n<p>Seega, laiendades eelmist skeemi, rakendasime ExaBGP ja HAProxy vahelise heartbeat'i. See on tarkvaraline rakendus, mis v\u00f5imaldab ExaBGP-l kasutada kohandatud skripte rakenduste seisundi kontrollimiseks.<\/p>\n<p>Selleks tuleb ExaBGP konfiguratsioonis seadistada health checker, mis suudab kontrollida HAProxy staatust. Meie juhul seadistasime HAProxy-s tervise tagamise taustteenuse, ning ExaBGP-l kontrollime seda lihtsa GET p\u00e4ringu kaudu. Kui anname haru l\u00f5petab, siis on HAProxy t\u00f5en\u00e4oliselt mittetoimiv ning selle reklaamimine ei ole vajalik. <\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/d5cda30043fe02ab81355b28c0d83ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy tervisekontroll<\/i><\/p>\n<h2>HAProxy s\u00f5brad: sessioonide s\u00fcnkroniseerimine <\/h2>\n<p>\nJ\u00e4rgmine samm, mis tuli ette v\u00f5tta, oli sessioonide s\u00fcnkroniseerimine. Jaotatud tasakaalustajate kaudu t\u00f6\u00f6tades on keeruline korraldada kliendi sessiooniteabe salvestamist. Kuid HAProxy on \u00fcks v\u00e4heseid tasakaalustajaid, mis suudab seda teha Peers funktsiooni kaudu \u2014 v\u00f5imalus edastada HAProxy erinevate protsesside vahel sessioonitabeleid. <\/p>\n<p>On erinevaid tasakaalustamismeetodeid: lihtsad, nagu <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Round-robin_(%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)\">ring-levi<\/a><\/noindex>, ja t\u00e4iustatud, kus salvestatakse kliendi sessioon ja ta p\u00e4\u00e4seb igal korral samale serverile, kuhu ta enne j\u00f5udis. Soovisime teostada teist varianti.<\/p>\n<p>HAProxy-s kasutatakse kliendi sessioonide salvestamiseks selle mehhanismi stick-tables. Need salvestavad kliendi algse IP-aadressi, valitud sihtaadressi (tagasi) ja teatud teenuseteabe. \u00dcksikasjalikult kasutatakse stick-tabeleid paaride source-IP + destination-IP s\u00e4ilitamiseks, mis on eriti kasulik rakenduste jaoks, mis ei suuda edastada kasutaja sessiooni konteksti teisele tasakaalustajale l\u00fclitamisel, n\u00e4iteks \u2014 RoundRobin'i tasakaalustamisre\u017eiimis.<\/p>\n<p>Kui stick-tabelit \u00f5petada HAProxy erinevate protsesside vahel liikuma (mille vahel toimub tasakaalustamine), saavad meie tasakaalustajad t\u00f6\u00f6tada \u00fche stick-tabelite kogumiga. See v\u00f5imaldab sujuvat kliendi v\u00f5rgu vahetust, kui \u00fcks tasakaalustajatest viga l\u00e4heb, ning kliendi sessioonid j\u00e4tkuvad juba valitud backend-idel.<\/p>\n<p>\u00d5ige t\u00f6\u00f6 tagamiseks peab olema lahendatud tasakaalustaja source IP-aadress, millelt sessioon on loodud. Meie puhul on see d\u00fcnaamiline aadress loopback-liideses. <\/p>\n<p>Peers'i \u00f5ige t\u00f6\u00f6 saavutatakse vaid teatud tingimustes. See t\u00e4hendab, et TCP-taimerid peavad olema piisavalt suured v\u00f5i vahetus peab olema piisavalt kiire, et TCP-sessioon ei katkeks. Siiski v\u00f5imaldab see sujuvat vahetust. <\/p>\n<p>Meil on IaaS-is teenus, mis on loodud sama tehnoloogia alusel. See <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/app\/services\/infra\/balancers-list\/\">Load Balancer kui teenus OpenStackile<\/a><\/noindex>, mida nimetatakse Octaviaks. See p\u00f5hineb kahel HAProxy protsessil ja sellel on esialgselt toetatud peers. Selles teenuses on nad end t\u00f5estanud.<\/p>\n<p>Pildil on scheemaatiliselt kujutatud peers-tabelite liikumine kolme HAProxy eksemplari vahel, pakutud on konfiguratsioon, kuidas seda seadistada:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/d31fab761da627923345b7ace7f0b943.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy Peers (sessioonide s\u00fcnkroniseerimine)<\/i><\/p>\n<p>Kui kavatsete rakendada samasugust skeemi, tuleb selle toimimist hoolikalt testida. Pole kindel, et see t\u00f6\u00f6tab 100% juhtudest samamoodi. Kuid v\u00e4hemalt ei kaota te stick-tabeleid, kui on vajalik meeles pidada kliendi source IP-d.<\/p>\n<h2>Klassi\u00fclesannete limiit \u00fchelt jaolt kliendilt<\/h2>\n<p>\nK\u00f5ik teenused, mis on avalikult k\u00e4ttesaadavad, sealhulgas meie API-d, v\u00f5ivad olla vastuv\u00f5tlikud p\u00e4ringute laviinidele. Nende p\u00f5hjused v\u00f5ivad olla \u00e4\u00e4rmiselt erinevad, alates kasutajate vigadest kuni sihitud r\u00fcnnakuteni. Meid DDoS-itatakse perioodiliselt IP-aadresside kaudu. Klientidel on sageli oma skriptides vigu, tehes meile mini-DDoS-e.<\/p>\n<p>Igatahes on vajalik ette n\u00e4htud lisakaitse. Ilmselge lahendus on piirata API p\u00e4ringute arvu ja mitte kulutada protsessorite aega kahjulike p\u00e4ringute t\u00f6\u00f6tlemiseks.<\/p>\n<p>Sarnaste piirangute rakendamiseks kasutame rate limiite, mis on korraldatud HAProxy baasil, sama stick-tabelite abil. Limiite seadistatakse piisavalt lihtsalt ja need v\u00f5imaldavad piirata kasutajat API-p\u00e4ringute arvu j\u00e4rgi. Algoritm m\u00e4letab allika IP-aadressi, millelt p\u00e4ringud tulevad, ja piirab sama kasutaja samaaegsete p\u00e4ringute arvu. Loomulikult oleme arvutanud iga teenuse API keskmise koormusprofiili ning seadnud limiidiks \u2248 10 korda rohkem kui see v\u00e4\u00e4rtus. J\u00e4tkame siiani olukorra hoolikat j\u00e4lgimist, hoides k\u00e4e pulsil.<\/p>\n<p>Kuidas see praktikas v\u00e4lja n\u00e4eb? Meil on kliente, kes kasutavad pidevalt meie API-sid automaatseks skaleerimiseks. Nad loovad umbes kakssada-kolmsada virtuaalmasinat hommikul ja eemaldavad need \u00f5htul. OpenStacki jaoks virtuaalmasina loomine koos PaaS-teenustega t\u00e4hendab v\u00e4hemalt 1000 API-p\u00e4ringut, kuna teenuste vaheline suhtlus toimub samuti API kaudu. <\/p>\n<p>Selliste \u00fclesannete \u00fcmberjaotused tekitavad \u00fcsna suurt koormust. Me oleme selle koormuse hinnanud, kogunud p\u00e4evased tipud, suurendanud need k\u00fcmme korda ja see on saanud meie rate-limiidiks. Me j\u00e4lgime olukorda pidevalt. Sageli n\u00e4eme roboteid, skaneerijaid, kes p\u00fc\u00fcavad uurida, kas meil on m\u00f5ni CGA-skript, mida k\u00e4ivitada, ja me l\u00f5ikame need aktiivselt maha.<\/p>\n<h2>Kuidas uuendada koodibaasi kasutajatele m\u00e4rkamatult<\/h2>\n<p>\nKasutame ka koodide juurutamise tasemel rikekindlust. Juurutamisel v\u00f5ivad tekkida vead, kuid nende m\u00f5ju teenuste k\u00e4ttesaadavusele on v\u00f5imalik minimeerida.<\/p>\n<p>Uuendame pidevalt oma teenuseid ja peame tagama koodibaasi uuendamise protsessi kasutajatele m\u00e4rkamatult. Selle \u00fclesande lahendamine on v\u00f5imalik t\u00e4nu HAProxy juhtimise v\u00f5imalustele ja meie teenustes Graceful Shutdown rakendamisele.<\/p>\n<p>Selle probleemi lahendamiseks oli vajalik tagada koormuse jaoturi juhtimine ja teenuste '\u00f5ige' v\u00e4ljal\u00fclitamine:<\/p>\n<ul>\n<li>HAProxy puhul toimub juhtimine stats-faili kaudu, mis on tegelikult socket ja m\u00e4\u00e4ratakse HAProxy konfiguris. K\u00e4skude edastamine toimub stdio kaudu. Kuid meie peamine t\u00f6\u00f6riist konfiguratsioonide kontrollimiseks on ansible, seega on seal sisseehitatud moodul HAProxy haldamiseks, mida me aktiivselt kasutame. <\/li>\n<li>Enamik meie API ja Engine teenustest toetavad tehnoloogiaid graceful shutdown: v\u00e4lja l\u00fclitamisel ootavad nad praeguse \u00fclesande t\u00e4ieliku l\u00f5petamise, olgu selleks http-p\u00e4ring v\u00f5i m\u00f5ni teenindus\u00fclesanne. Sama juhtub t\u00f6\u00f6tlejaga. Ta teab k\u00f5iki \u00fclesandeid, mida ta teeb, ja l\u00f5petab, kui on k\u00f5ik edukalt l\u00f5pule viinud. <\/li>\n<\/ul>\n<p>\nNende kahe punkti t\u00f5ttu n\u00e4eb meie turvaline juurutusalgoritm v\u00e4lja j\u00e4rgmine.<\/p>\n<ol>\n<li>Arendaja koostab uue koodipaketi (meie puhul on see RPM), testib arenduskeskkonnas, testib ststage, ja j\u00e4tab ststage-repositooriumisse.<\/li>\n<li>Arendaja seab juurutamise \u00fclesande, esitades v\u00f5imalikult detailsed kirjeldused \"artefaktidest\": uue paketi versioon, uue funktsionaalsuse kirjeldus ja muud \u00fcksikasjad juurutamise kohta vajadusel.<\/li>\n<li>S\u00fcsteemiadministraator alustab v\u00e4rskendust. K\u00e4ivitab Ansible'i playbook'i, mis omakorda teeb j\u00e4rgmist: \n<ul>\n<li>V\u00f5tab paketi stage-repositoriumist ja v\u00e4rskendab paketi versiooni tootmisrepoos.<\/li>\n<li>Koostab loendi v\u00e4rskendatavast teenuse tagaplaanist.<\/li>\n<li>L\u00fclitab v\u00e4lja esimese v\u00e4rskendatava teenuse HAProxy's ja ootab, kuni selle protsessid on l\u00f5petatud. T\u00e4nu gracefull shutdown'ile oleme kindlad, et k\u00f5ik aktiivsed kliendikutsed l\u00f5petatakse edukalt.<\/li>\n<li>P\u00e4rast API, t\u00f6\u00f6tlejate ja HAProxy v\u00e4ljal\u00fclitamist toimub koodiuuendus.<\/li>\n<li>Ansible k\u00e4ivitab teenused.<\/li>\n<li>Iga teenuse jaoks t\u00f5mbab ta kindlad 'nupud', mis teevad unit-testimise eelnevalt m\u00e4\u00e4ratud v\u00f5tmetestide seeria j\u00e4rgi. Teostatakse uue koodi p\u00f5hikontroll.<\/li>\n<li>Kui eelmisel sammul vigu ei leitud, aktiveeritakse tagaplaan.<\/li>\n<li>Liigume j\u00e4rgmise tagaplaani juurde.<\/li>\n<\/ul>\n<\/li>\n<li>P\u00e4rast k\u00f5igi tagaplaanide v\u00e4rskendamist k\u00e4ivitatakse funktsionaaltestid. Kui neid on puudu, vaatab arendaja igat uut funktsiooni, mille ta tegi.<\/li>\n<\/ol>\n<p>\nSellega on juurutamine l\u00f5petatud.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas rakendatakse veakindlat veebiarhitektuuri Mail.ru Cloud Solutions platvormil.\" src=\"\/wp-content\/uploads\/2019\/11\/2d889fe1af33653e4bfebabe1cce6552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Teenuse v\u00e4rskendamise ts\u00fckkel<\/i><\/p>\n<p>See skeem ei oleks t\u00f6\u00f6v\u00f5imeline, kui meil ei oleks \u00fchte reeglit. Me hoiame korraga t\u00f6\u00f6s nii vana kui ka uut versiooni. Ettevalmistuse k\u00e4igus, tarkvara arendamise faasis, on sisse seatud, et isegi kui teenuse andmebaasis on muudatusi, ei riku need eelnevat koodi. Tulemusena toimub koodibaasi j\u00e4rkj\u00e4rguline uuendamine.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nJagades enda m\u00f5tteid veakindla WEB-arhitektuuri kohta, soovin veel kord r\u00f5hutada selle v\u00f5tmeaspekte:<\/p>\n<ul>\n<li>f\u00fc\u00fcsiline veakindlus;<\/li>\n<li>v\u00f5rgustiku veakindlus (koormuse tasakaalustajad, BGP);<\/li>\n<li>kasutatavate ja arendatavate rakenduste veakindlus.<\/li>\n<\/ul>\n<p>\nSoovin k\u00f5igile stabiilset uptime'i!<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/474180\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0410\u0440\u0442\u0435\u043c \u041a\u0430\u0440\u0430\u043c\u044b\u0448\u0435\u0432, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Mail.Ru Cloud Solutions (MCS). \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0433\u043e\u0434 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432. \u041c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b API-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0431\u044b\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c\u0438 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043a \u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u0440\u043e\u0441\u0442\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041d\u0430\u0448\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 OpenStack, \u0438 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u044c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52389","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430\u044f \u0432\u0435\u0431-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Mail.ru Cloud Solutions | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-06T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:05+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas rakendatakse t\u00f5rgeteta veebiarhitektuuri Mail.ru Cloud Solutions platvormil | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430\u044f \u0432\u0435\u0431-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Mail.ru Cloud Solutions | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-06T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:05+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52389","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:27:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:44:43","updated":"2026-01-24 03:27:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=52389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=52389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=52389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=52389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}