{"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\/sv\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions","title":{"rendered":"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/fe7af07f3ac5ca4e75009993b742293e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHej, Habr! Jag heter Artyom Karamyshev och \u00e4r chef f\u00f6r systemadministrationsteamet <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.Ru Cloud Solutions (MCS)<\/a><\/noindex>. Under det senaste \u00e5ret har vi haft m\u00e5nga lanseringar av nya produkter. Vi vill att API-tj\u00e4nsterna ska vara l\u00e4tta att skala, vara motst\u00e5ndskraftiga och redo f\u00f6r snabb \u00f6kning av anv\u00e4ndarbelastningen. V\u00e5r plattform \u00e4r baserad p\u00e5 OpenStack, och jag vill ber\u00e4tta om vilka problem med komponenternas motst\u00e5ndskraft vi beh\u00f6vde l\u00f6sa f\u00f6r att f\u00e5 en robust system. Jag tror att detta kommer att vara intressant f\u00f6r dem som ocks\u00e5 utvecklar produkter p\u00e5 OpenStack.<\/p>\n<p>Den totala motst\u00e5ndskraften hos plattformen best\u00e5r av motst\u00e5ndskraften hos dess komponenter. S\u00e5 vi kommer gradvis att g\u00e5 igenom alla niv\u00e5er d\u00e4r vi har uppt\u00e4ckt risker och \u00e5tg\u00e4rdat dem.<\/p>\n<p>Videoversionen av denna historia, som har sitt ursprung i en presentation p\u00e5 konferensen Uptime Day 4, organiserad av <noindex><a rel=\"nofollow\" href=\"http:\/\/www.itsumma.ru\">ITSumma<\/a><\/noindex>, kan ses <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=3b06MVou-vg&amp;list=PLmXjIrLllpkjwuIGkzBkLbI7oHtUadmvZ&amp;index=5\">p\u00e5 YouTube-kanalen Uptime Community<\/a><\/noindex>. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Motst\u00e5ndskraft hos den fysiska arkitekturen<\/h2>\n<p>\nDen offentliga delen av MCS-molnet \u00e4r f\u00f6r n\u00e4rvarande baserad i tv\u00e5 Tier III-datacenter, mellan dem finns egen m\u00f6rk fiber som \u00e4r reserverad p\u00e5 fysisk niv\u00e5 med olika sp\u00e5r, med en kapacitet p\u00e5 200 Gbit\/s. Tier III-niv\u00e5n ger den n\u00f6dv\u00e4ndiga motst\u00e5ndskraften f\u00f6r den fysiska infrastrukturen. <\/p>\n<p>Den m\u00f6rka fibern \u00e4r reserverad b\u00e5de p\u00e5 fysisk och logisk niv\u00e5. Processen f\u00f6r reservkanaler var iterativ, vi st\u00f6tte p\u00e5 problem och vi f\u00f6rb\u00e4ttrar st\u00e4ndigt kommunikationen mellan datacentren. <\/p>\n<blockquote><p>Till exempel, f\u00f6r inte s\u00e5 l\u00e4nge sedan, under arbete i en brunn n\u00e4ra ett av datacentren, tr\u00e4ffade en gr\u00e4vmaskin r\u00f6ret, och b\u00e5de huvud- och reserv optisk fiberkabel hamnade i denna r\u00f6rledning. V\u00e5r motst\u00e5ndskraftiga kommunikationskanal med datacenter var s\u00e5rbar vid en punkt, i brunnen. D\u00e4rf\u00f6r f\u00f6rlorade vi en del av infrastrukturen. Vi drog slutsatser, vidtog en rad \u00e5tg\u00e4rder, inklusive att vi lade en extra optisk fiber genom den n\u00e4rliggande brunnen.<\/p><\/blockquote>\n<p>\nI datacentren finns det punkter d\u00e4r leverant\u00f6rer av kommunikation har n\u00e4rvaro, till vilka vi s\u00e4nder v\u00e5ra prefix via BGP. F\u00f6r varje n\u00e4tverksriktning v\u00e4ljs den b\u00e4sta metrik, vilket g\u00f6r att vi kan erbjuda olika kunder den b\u00e4sta kvalit\u00e9n p\u00e5 anslutningen. Om en f\u00f6rbindelse via en leverant\u00f6r bryts, omkonfigurerar vi v\u00e5r routing via tillg\u00e4ngliga leverant\u00f6rer.<\/p>\n<p>Vid ett leverant\u00f6rsfel v\u00e4xlar vi automatiskt till n\u00e4sta. Om ett av datacentren slutar fungera har vi en spegelkopi av v\u00e5ra tj\u00e4nster i det andra datacentret, som tar hela belastningen.<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/295ca212f48dd074d834154666e5b0c3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Felutst\u00e4llning av fysisk infrastruktur<\/i><\/p>\n<h2>Vad vi anv\u00e4nder f\u00f6r felutst\u00e4llning p\u00e5 applikationsniv\u00e5<\/h2>\n<p>\nV\u00e5r tj\u00e4nst \u00e4r byggd p\u00e5 en rad \u00f6ppna komponenter. <\/p>\n<p><b>ExaBGP<\/b> \u2014 en tj\u00e4nst som implementerar en rad funktioner med hj\u00e4lp av protokollet f\u00f6r dynamisk routing baserat p\u00e5 BGP. Vi anv\u00e4nder den aktivt f\u00f6r att annonsera v\u00e5ra vita IP-adresser, genom vilka anv\u00e4ndare f\u00e5r tillg\u00e5ng till API:t.<\/p>\n<p><b>HAProxy<\/b> \u2014 en h\u00f6gbelastad balans- re \u00e4r, som m\u00f6jligg\u00f6r mycket flexibla regler f\u00f6r trafikbalansering p\u00e5 olika niv\u00e5er av OSI-modellen. Vi anv\u00e4nder den f\u00f6r att balansera framf\u00f6r alla tj\u00e4nster: databaser, meddelandehanterare, API-tj\u00e4nster, webb-tj\u00e4nster, v\u00e5ra interna projekt \u2014 allt st\u00e5r bakom HAProxy.<\/p>\n<p><b>API-applikation<\/b> \u2014 en webbapplikation skriven i Python, med vilken anv\u00e4ndaren hanterar sin infrastruktur och sina tj\u00e4nster.<\/p>\n<p><b>Arbetarapplikation <\/b>(h\u00e4refter bara worker) \u2014 i OpenStack-tj\u00e4nster \u00e4r det en infrastrukturdemon som g\u00f6r det m\u00f6jligt att \u00f6verf\u00f6ra API-kommandon till infrastrukturen. Till exempel sker skapandet av disk just i worker, medan beg\u00e4ran om skapande g\u00f6rs i API-applikationen. <\/p>\n<h2>Standardarkitektur f\u00f6r OpenStack-applikationer<\/h2>\n<p>\nDe flesta tj\u00e4nster som utvecklas f\u00f6r OpenStack f\u00f6rs\u00f6ker f\u00f6lja en enhetlig paradigm. Tj\u00e4nsten best\u00e5r vanligtvis av tv\u00e5 delar: API och arbetare (backend-executors). I allm\u00e4nhet \u00e4r API:et en WSGI-applikation i Python som antingen k\u00f6rs som en frist\u00e5ende process (demon) eller via en redan etablerad webbserver som Nginx eller Apache. API:et behandlar anv\u00e4ndarens f\u00f6rfr\u00e5gan och vidarebefordrar instruktionerna till arbetarapplikationen f\u00f6r utf\u00f6rande. \u00d6verf\u00f6ringen sker med hj\u00e4lp av en meddelandebroker, vanligtvis RabbitMQ, medan andra st\u00f6ds d\u00e5ligt. N\u00e4r meddelandena n\u00e5r brokern behandlas de av arbetarna och, om det beh\u00f6vs, returnerar de ett svar. <\/p>\n<p>Denna paradiigm inneb\u00e4r isolerade gemensamma felpunkter: RabbitMQ och databasen. Men RabbitMQ \u00e4r isolerat inom ramen f\u00f6r en tj\u00e4nst och kan i teorin vara individuellt f\u00f6r varje tj\u00e4nst. S\u00e5 vi p\u00e5 MCS separerar dessa tj\u00e4nster s\u00e5 mycket som m\u00f6jligt, f\u00f6r varje separat projekt skapar vi en separat databas och en separat RabbitMQ. Denna metod har den f\u00f6rdelen att om det uppst\u00e5r en n\u00f6dsituation p\u00e5 n\u00e5got s\u00e5rbart st\u00e4lle, s\u00e5 bryts inte hela tj\u00e4nsten utan bara en del av den.<\/p>\n<p>Antalet arbetarapplikationer \u00e4r o\u00e4ndligt, s\u00e5 API:et kan enkelt skalas horisontellt bakom belastningsbalanserare f\u00f6r att \u00f6ka prestandan och redundansen.<\/p>\n<blockquote><p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 API \u0438 worker&#8217;\u0430\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u0430 Redis, Memcache, etcd, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 worker&#8217;\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430 \u0437\u0430 \u043d\u0438\u043c (\u00ab\u0442\u044b, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0435\u0435 \u043d\u0435 \u0431\u0435\u0440\u0438\u00bb). \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c etcd. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0438\u0448\u0435\u0442 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c mariadb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443 \u043d\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0430\u0441\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.\n<\/p><\/blockquote>\n<p>\nS\u00e5dan en klassisk ensam tj\u00e4nst \u00e4r organiserad p\u00e5 ett allm\u00e4nt accepterat s\u00e4tt f\u00f6r OpenStack. Den kan betraktas som ett slutet system, f\u00f6r vilket skalnings- och redundantl\u00f6sningarna \u00e4r ganska uppenbara. Till exempel, f\u00f6r redundans \u00e4r det tillr\u00e4ckligt att s\u00e4tta en belastningsbalanserare framf\u00f6r API:et. Skalningen av arbetarna uppn\u00e5s genom att \u00f6ka deras antal. <\/p>\n<p>En svaghet i hela systemet \u00e4r RabbitMQ och MariaDB. Deras arkitektur f\u00f6rtj\u00e4nar en egen artikel. I den h\u00e4r artikeln vill jag fokusera p\u00e5 API:ns felbest\u00e4ndighet.<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/f39e5a8ae350864e311bf4db3b9c34b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Arkitektur f\u00f6r OpenStack-applikationen. Belastningsbalansering och felbest\u00e4ndighet f\u00f6r molnplattformen.<\/i><\/p>\n<h2>Vi g\u00f6r HAProxy-belastningsbalanseraren felbest\u00e4ndig med hj\u00e4lp av ExaBGP.<\/h2>\n<p>\nF\u00f6r att v\u00e5ra API:er ska vara skalbara, snabba och felbest\u00e4ndiga installerade vi en belastningsbalanserare. Vi valde HAProxy. Enligt min \u00e5sikt har den alla n\u00f6dv\u00e4ndiga egenskaper f\u00f6r v\u00e5r uppgift: belastningsbalansering p\u00e5 flera OSI-niv\u00e5er, hanteringsgr\u00e4nssnitt, flexibilitet och skalbarhet, m\u00e5nga belastningsbalanseringsmetoder och st\u00f6d f\u00f6r sessions-tabeller.<\/p>\n<p>Det f\u00f6rsta problemet som m\u00e5ste l\u00f6sas \u00e4r felbest\u00e4ndigheten hos sj\u00e4lva belastningsbalanseraren. Att bara installera en belastningsbalanserare skapar ocks\u00e5 en punktsvaghet: om belastningsbalanseraren g\u00e5r s\u00f6nder, faller tj\u00e4nsten. F\u00f6r att undvika detta anv\u00e4nde vi HAProxy tillsammans med ExaBGP.<\/p>\n<p>ExaBGP m\u00f6jligg\u00f6r implementering av en tj\u00e4nsteh\u00e4lsokontroll. Vi anv\u00e4nde denna mekanism f\u00f6r att kontrollera HAProxy:s funktionalitet och st\u00e4nga av HAProxy-tj\u00e4nsten fr\u00e5n BGP vid problem. <\/p>\n<p><b>Diagram \u00f6ver ExaBGP+HAProxy<\/b><\/p>\n<ol>\n<li>Vi installerar den n\u00f6dv\u00e4ndiga programvaran, ExaBGP och HAProxy, p\u00e5 tre servrar. <\/li>\n<li>P\u00e5 varje server skapar vi en loopback-gr\u00e4nssnitt.<\/li>\n<li>Vi konfigurerar samma offentliga IP-adress p\u00e5 detta gr\u00e4nssnitt p\u00e5 alla tre servrar.<\/li>\n<li>Den offentliga IP-adressen annonseras p\u00e5 internet via ExaBGP. <\/li>\n<\/ol>\n<p>\nFelbest\u00e4ndighet uppn\u00e5s genom att annonsera samma IP-adress fr\u00e5n alla tre servrar. Fr\u00e5n n\u00e4tverkets synvinkel \u00e4r samma adress tillg\u00e4nglig fr\u00e5n tre olika n\u00e4sta hopp. Routern ser tre identiska rutter, v\u00e4ljer den mest prioriterade baserat p\u00e5 sin egen metric (detta \u00e4r oftast samma alternativ), och trafiken g\u00e5r endast till en av servrarna. <\/p>\n<p>Vid problem med HAProxy eller en server som g\u00e5r ner slutar ExaBGP annonsera rutten, och trafiken v\u00e4xlar smidigt till en annan server. <\/p>\n<p>P\u00e5 s\u00e5 s\u00e4tt har vi uppn\u00e5tt felbest\u00e4ndighet f\u00f6r belastningsbalanseraren.<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/9fba0718176dc1266f25a2c01ec87348.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Felbest\u00e4ndighet f\u00f6r HAProxy-belastningsbalanserare.<\/i><\/p>\n<p>Schemat \u00e4r inte perfekt: vi har l\u00e4rt oss att reservera HAProxy, men vi har inte l\u00e4rt oss att f\u00f6rdela belastningen inom tj\u00e4nsterna. D\u00e4rf\u00f6r har vi ut\u00f6kat denna plan: vi har \u00f6verg\u00e5tt till belastningsbalansering mellan flera offentliga IP-adresser.<\/p>\n<h2>DNS-baserad balansering plus BGP<\/h2>\n<p>\nFr\u00e5gan om lastbalansering med v\u00e5ra HAProxy \u00e4r fortfarande ol\u00f6st. \u00c4nd\u00e5 kan det l\u00f6sas ganska enkelt, precis som vi har gjort med oss sj\u00e4lva.<\/p>\n<p>F\u00f6r att balansera tre servrar beh\u00f6vs 3 offentliga IP-adresser och den gamla hederliga DNS. Varje av dessa adresser definieras p\u00e5 loopback-gr\u00e4nssnittet f\u00f6r varje HAProxy och annonseras p\u00e5 internet. <\/p>\n<p>I OpenStack anv\u00e4nds en tj\u00e4nstkatalog f\u00f6r att hantera resurser, d\u00e4r API-endpointen f\u00f6r olika tj\u00e4nster anges. I denna katalog skriver vi in dom\u00e4nnamnet \u2013 public.infra.mail.ru, som resolveras via DNS till tre olika IP-adresser. Resultatet blir att vi f\u00e5r lastbalansering mellan tre adresser via DNS. <\/p>\n<p>Men eftersom vi vid annonseringen av offentliga IP-adresser inte hanterar prioriteter f\u00f6r serverval, \u00e4r detta fortfarande inte lastbalansering. Vanligtvis v\u00e4ljs endast en server baserat p\u00e5 IP-adressens rang, medan de tv\u00e5 andra blir inaktiva, eftersom inga metrikv\u00e4rden anges i BGP.<\/p>\n<p>Vi b\u00f6rjade annonsera rutter via ExaBGP med olika metrikv\u00e4rden. Varje lastbalanserare annonserar alla tre offentliga IP-adresser, men en av dem, den prim\u00e4ra f\u00f6r den aktuella lastbalanseraren, annonseras med l\u00e4gsta metrik. S\u00e5 l\u00e4nge alla tre lastbalanserare \u00e4r aktiva, g\u00e5r beg\u00e4rningar till den f\u00f6rsta IP-adressen till den f\u00f6rsta lastbalanseraren, beg\u00e4rningar till den andra till den andra, och till den tredje till den tredje.<\/p>\n<p>Vad h\u00e4nder i det \u00f6gonblicket n\u00e4r en av lastbalanserarna faller? Vid fel p\u00e5 n\u00e5gon lastbalanserare annonseras dess grundl\u00e4ggande adress fortfarande av de tv\u00e5 andra, och trafiken omf\u00f6rdelas mellan dem. S\u00e5ledes ger vi anv\u00e4ndaren flera IP-adresser via DNS. Genom DNS-balansering och olika metrikv\u00e4rden f\u00e5r vi en j\u00e4mn f\u00f6rdelning av belastningen p\u00e5 alla tre lastbalanserarna. Och vi f\u00f6rlorar inte heller redundansen.<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/1485367a934aea06b68c6d05c184d263.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy-lastbalansering baserad p\u00e5 DNS + BGP<\/i><\/p>\n<h2>Interaktion mellan ExaBGP och HAProxy<\/h2>\n<p>\nS\u00e5, vi har implementerat redundans f\u00f6r serveravbrott baserat p\u00e5 att annonseringen av rutter upph\u00f6r. Men HAProxy kan ocks\u00e5 st\u00e4ngas av av andra sk\u00e4l \u00e4n serverns fel: administrationsfel, inre tj\u00e4nstfel. Vi vill undanr\u00f6ja en trasig lastbalanserare fr\u00e5n belastningen \u00e4ven i dessa fall, och d\u00e4rf\u00f6r beh\u00f6vs en annan mekanism. <\/p>\n<p>D\u00e4rf\u00f6r implementerade vi heartbeat mellan ExaBGP och HAProxy genom att bygga p\u00e5 den tidigare schemat. Det h\u00e4r \u00e4r en mjukvaruimplementation av interaktionen mellan ExaBGP och HAProxy, d\u00e4r ExaBGP anv\u00e4nder skr\u00e4ddarsydda skript f\u00f6r att kontrollera applikationernas status.<\/p>\n<p>F\u00f6r detta beh\u00f6ver man konfigurera en h\u00e4lsokontrollare i ExaBGP som kan kontrollera HAProxy:s status. I v\u00e5rt fall konfigurerade vi en health backend i HAProxy, och fr\u00e5n ExaBGP g\u00f6r vi en enkel GET-f\u00f6rfr\u00e5gan. Om annonseringen slutar ske, \u00e4r det troligt att HAProxy inte fungerar, och vi beh\u00f6ver inte annonsera det. <\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/d5cda30043fe02ab81355b28c0d83ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy H\u00e4lsokontroll<\/i><\/p>\n<h2>HAProxy Peers: session synkronisering <\/h2>\n<p>\nN\u00e4sta steg var att synkronisera sessionerna. Vid arbete genom distribuerade lastbalanserare \u00e4r det sv\u00e5rt att bevara information om kundsessioner. Men HAProxy \u00e4r en av de f\u00e5 lastbalanserarna som kan g\u00f6ra detta tack vare funktionaliteten Peers - m\u00f6jligheten att \u00f6verf\u00f6ra sessionstabeller mellan olika HAProxy-processer. <\/p>\n<p>Det finns olika metoder f\u00f6r lastbalansering: enkla, som <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)\">round-robin<\/a><\/noindex>, och avancerade, d\u00e4r kundens session sparas, och han alltid hamnar p\u00e5 samma server som tidigare. Vi ville implementera det andra alternativet.<\/p>\n<p>I HAProxy anv\u00e4nds stick-tables f\u00f6r att spara kundsessioner. De lagrar den ursprungliga IP-adressen f\u00f6r kunden, den valda m\u00e5ladressen (backend) och viss metadata. Vanligtvis anv\u00e4nds stick-tabeller f\u00f6r att spara paret source-IP + destination-IP, vilket \u00e4r s\u00e4rskilt anv\u00e4ndbart f\u00f6r applikationer som inte kan \u00f6verf\u00f6ra anv\u00e4ndarsessionens kontext n\u00e4r de v\u00e4xlar till en annan lastbalanserare, till exempel i RoundRobin-l\u00e4get.<\/p>\n<p>Om stick-tabellen l\u00e4r sig att flytta mellan olika HAProxy-processer (mellan vilka lastbalansering sker) kan v\u00e5ra lastbalanserare arbeta med en gemensam upps\u00e4ttning stick-tabeller. Detta kommer att m\u00f6jligg\u00f6ra s\u00f6ml\u00f6s n\u00e4tverksv\u00e4xling f\u00f6r kunden vid nedg\u00e5ng av en av lastbalanserarna, och arbetet med kundsessionerna kan forts\u00e4tta p\u00e5 de samma backends som valdes tidigare.<\/p>\n<p>F\u00f6r att det ska fungera korrekt m\u00e5ste problemet med source IP-adressen f\u00f6r lastbalanseraren, fr\u00e5n vilken sessionen skapades, l\u00f6sas. I v\u00e5rt fall \u00e4r detta en dynamisk adress p\u00e5 loopback-gr\u00e4nssnittet. <\/p>\n<p>Korrekt arbete med peers uppn\u00e5s endast under vissa f\u00f6ruts\u00e4ttningar. Det vill s\u00e4ga att TCP-tidsgr\u00e4nserna m\u00e5ste vara tillr\u00e4ckligt stora eller att omkopplingen m\u00e5ste ske tillr\u00e4ckligt snabbt f\u00f6r att TCP-sessionen inte ska avbrytas. \u00c4nd\u00e5 m\u00f6jligg\u00f6r detta s\u00f6ml\u00f6s omkoppling. <\/p>\n<p>Vi har en tj\u00e4nst inom IaaS som \u00e4r byggd med samma teknologi. Det \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/app\/services\/infra\/balancers-list\/\">Load Balancer som tj\u00e4nst f\u00f6r OpenStack<\/a><\/noindex>, som heter Octavia. Den \u00e4r baserad p\u00e5 tv\u00e5 processer av HAProxy, och st\u00f6d f\u00f6r peers inbyggs fr\u00e5n b\u00f6rjan. I den h\u00e4r tj\u00e4nsten har de visat sig fungera mycket bra.<\/p>\n<p>P\u00e5 bilden visas schematiskt hur peers-tabeller flyttas mellan tre instanser av HAProxy, med en konfiguration som visar hur detta kan st\u00e4llas in:<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/d31fab761da627923345b7ace7f0b943.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>HAProxy Peers (session synkronisering)<\/i><\/p>\n<p>Om du ska implementera en liknande l\u00f6sning, b\u00f6r dess funktion testas noggrant. Det \u00e4r inte s\u00e4kert att det fungerar p\u00e5 samma s\u00e4tt i 100 % av fallen. Men \u00e5tminstone kommer du inte att f\u00f6rlora stick-tabeller n\u00e4r du beh\u00f6ver komma ih\u00e5g k\u00e4ll-IP f\u00f6r klienten.<\/p>\n<h2>Begr\u00e4nsning av antalet samtidiga f\u00f6rfr\u00e5gningar fr\u00e5n samma klient<\/h2>\n<p>\nAlla tj\u00e4nster som \u00e4r offentligt tillg\u00e4ngliga, inklusive v\u00e5ra API:er, kan uts\u00e4ttas f\u00f6r stormar av f\u00f6rfr\u00e5gningar. Orsakerna till detta kan vara helt olika, fr\u00e5n anv\u00e4ndarfel till avsiktliga attacker. Vi blir periodvis DDoSat via IP-adresser. Kunder g\u00f6r ofta misstag i sina skript och orsakar mini-DDoS attacker.<\/p>\n<p>P\u00e5 ett eller annat s\u00e4tt \u00e4r det n\u00f6dv\u00e4ndigt att f\u00f6rutse ytterligare skydd. En uppenbar l\u00f6sning \u00e4r att begr\u00e4nsa antalet f\u00f6rfr\u00e5gningar till API:et och inte sl\u00f6sa processortid p\u00e5 att hantera skadliga f\u00f6rfr\u00e5gningar.<\/p>\n<p>F\u00f6r att implementera s\u00e5dana begr\u00e4nsningar anv\u00e4nder vi rate limits, organiserade p\u00e5 basen av HAProxy, med hj\u00e4lp av samma stick-tabeller. Gr\u00e4nserna st\u00e4lls in ganska enkelt och g\u00f6r det m\u00f6jligt att begr\u00e4nsa anv\u00e4ndaren vad g\u00e4ller antalet f\u00f6rfr\u00e5gningar till API:et. Algoritmen kommer ih\u00e5g k\u00e4ll-IP:n som g\u00f6r f\u00f6rfr\u00e5gningarna och begr\u00e4nsar antalet samtidiga f\u00f6rfr\u00e5gningar fr\u00e5n en anv\u00e4ndare. Naturligtvis har vi ber\u00e4knat det genomsnittliga belastningsprofilen f\u00f6r API:et hos varje tj\u00e4nst och satt gr\u00e4nsen till cirka 10 g\u00e5nger detta v\u00e4rde. Vi forts\u00e4tter att noggrant \u00f6vervaka situationen och h\u00e5ller ett \u00f6ga p\u00e5 l\u00e4get.<\/p>\n<p>Hur ser det ut i praktiken? Vi har kunder som st\u00e4ndigt anv\u00e4nder v\u00e5ra API:er f\u00f6r automatisk skalning. De skapar ungef\u00e4r tv\u00e5 till tre hundra virtuella maskiner p\u00e5 morgonen och tar bort dem p\u00e5 kv\u00e4llen. F\u00f6r att skapa en virtuell maskin i OpenStack, \u00e4ven med PaaS-tj\u00e4nster, kr\u00e4vs minst 1000 API-anrop, eftersom interaktionen mellan tj\u00e4nsterna ocks\u00e5 sker via API. <\/p>\n<p>Dessa \u00f6verflyttningar av uppgifter medf\u00f6r en ganska stor belastning. Vi har uppskattat denna belastning, samlat in dagliga toppar, \u00f6kat dem tio g\u00e5nger, och det blev v\u00e5r rate-limit. Vi h\u00e5ller ett \u00f6ga p\u00e5 situationen. Vi ser ofta botar och skannrar som f\u00f6rs\u00f6ker ta reda p\u00e5 om vi har n\u00e5gra CGA-skript som kan k\u00f6ras, och vi tar aktivt bort dem.<\/p>\n<h2>Hur man uppdaterar kodbasen utan att anv\u00e4ndarna m\u00e4rker n\u00e5got<\/h2>\n<p>\nVi implementerar ocks\u00e5 redundans p\u00e5 niv\u00e5n f\u00f6r kodutplaceringens processer. Vid utplaceringar sker det ibland fel, men deras p\u00e5verkan p\u00e5 tj\u00e4nsternas tillg\u00e4nglighet kan minimeras.<\/p>\n<p>Vi uppdaterar st\u00e4ndigt v\u00e5ra tj\u00e4nster och m\u00e5ste s\u00e4kerst\u00e4lla att processen f\u00f6r att uppdatera kodbasen sker utan att p\u00e5verka anv\u00e4ndarna. Vi lyckades l\u00f6sa denna uppgift genom att anv\u00e4nda m\u00f6jligheterna f\u00f6r HAProxy-hantering och implementering av Graceful Shutdown i v\u00e5ra tj\u00e4nster.<\/p>\n<p>F\u00f6r att l\u00f6sa denna uppgift beh\u00f6vs det att s\u00e4kerst\u00e4lla hantering av belastningsbalanseraren och \"korrekt\" avst\u00e4ngning av tj\u00e4nster:<\/p>\n<ul>\n<li>I fallet med HAProxy sker hanteringen genom en statsfil, som i huvudsak \u00e4r en socket och definieras i HAProxy-konfigurationen. Kommandon kan skickas till den via stdio. Men v\u00e5rt huvudsakliga verktyg f\u00f6r konfigurationskontroll \u00e4r Ansible, s\u00e5 det finns en inbyggd modul f\u00f6r att hantera HAProxy, som vi anv\u00e4nder aktivt. <\/li>\n<li>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 API \u0438 Engine \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 graceful shutdown: \u043f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043e\u043d\u0438 \u0434\u043e\u0436\u0438\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0431\u0443\u0434\u044c \u044d\u0442\u043e http-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 worker&#8217;\u043e\u043c. \u041e\u043d \u0437\u043d\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442, \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0434\u0435\u043b\u0430\u043b. <\/li>\n<\/ul>\n<p>\nTack vare dessa tv\u00e5 punkter ser v\u00e5r s\u00e4kra algoritm f\u00f6r utplacering ut som f\u00f6ljer.<\/p>\n<ol>\n<li>Utvecklaren samlar ihop ett nytt kodpaket (f\u00f6r oss \u00e4r det RPM), testar det i dev-milj\u00f6n, testar i stage och l\u00e4mnar det i stage-repositoriet.<\/li>\n<li>Utvecklaren s\u00e4tter en uppgift f\u00f6r distribution med en s\u00e5 detaljerad beskrivning av \"artefakterna\" som m\u00f6jligt: version av det nya paketet, beskrivning av den nya funktionaliteten och andra detaljer om distributionen vid behov.<\/li>\n<li>Systemadministrat\u00f6ren p\u00e5b\u00f6rjar uppdateringen. Hen startar Ansible-spelboken som i sin tur g\u00f6r f\u00f6ljande: \n<ul>\n<li>H\u00e4mtar paketet fr\u00e5n stage-arkivet och uppdaterar paketversionen i produktarkivet.<\/li>\n<li>Kommer att sammanst\u00e4lla en lista \u00f6ver backend-tj\u00e4nster som ska uppdateras.<\/li>\n<li>St\u00e4nger av den f\u00f6rsta uppdaterade tj\u00e4nsten i HAProxy och v\u00e4ntar p\u00e5 att dess processer ska avslutas. Tack vare en smidig avst\u00e4ngning \u00e4r vi s\u00e4kra p\u00e5 att alla p\u00e5g\u00e5ende kundf\u00f6rfr\u00e5gningar slutf\u00f6rs framg\u00e5ngsrikt.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 API, worker&#8217;\u043e\u0432, \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f HAProxy, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430.<\/li>\n<li>Ansible startar tj\u00e4nsterna.<\/li>\n<li>F\u00f6r varje tj\u00e4nst aktiverar den specifika \"knappar\" som utf\u00f6r enhetstestning baserat p\u00e5 ett antal f\u00f6rutbest\u00e4mda nyckeltester. En grundl\u00e4ggande kontroll av den nya koden utf\u00f6rs.<\/li>\n<li>Om inga fel uppt\u00e4cktes i det f\u00f6reg\u00e5ende steget aktiveras backend-tj\u00e4nsten.<\/li>\n<li>G\u00e5r vidare till n\u00e4sta backend.<\/li>\n<\/ul>\n<\/li>\n<li>Efter att alla backend-tj\u00e4nster har uppdaterats startas funktionella tester. Om dessa inte r\u00e4cker, granskar utvecklaren all ny funktionalitet som hen har implementerat.<\/li>\n<\/ol>\n<p>\nD\u00e4rmed avslutas distributionen.<\/p>\n<p><img decoding=\"async\" alt=\"Hur \u00e5terfinns en robust webbarkitektur p\u00e5 plattformen Mail.ru Cloud Solutions.\" src=\"\/wp-content\/uploads\/2019\/11\/2d889fe1af33653e4bfebabe1cce6552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Cykeln f\u00f6r uppdatering av tj\u00e4nsten<\/i><\/p>\n<p>Detta schema skulle inte fungera om vi inte hade en regler. Vi st\u00f6djer samtidigt den gamla och den nya versionen i produktion. Redan i mjukvaruutvecklingsfasen planeras det att \u00e4ven om det sker f\u00f6r\u00e4ndringar i databasstrukturen f\u00f6r tj\u00e4nsten, s\u00e5 ska de inte bryta den tidigare koden. Resultatet blir en gradvis uppdatering av kodbasen.<\/p>\n<h2>Slutsats<\/h2>\n<p>\nN\u00e4r jag delar mina egna tankar om h\u00f6g tillg\u00e4nglighet i webbarkitektur vill jag \u00e4nnu en g\u00e5ng betona dess nyckelpunkter:<\/p>\n<ul>\n<li>fysisk redundans;<\/li>\n<li>n\u00e4tverksredundans (lastbalanserare, BGP);<\/li>\n<li>redundans hos den anv\u00e4nda och utvecklade mjukvaran.<\/li>\n<\/ul>\n<p>\n\u00d6nskar alla stabil driftstid!<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/kak-realizuetsya-otkazoustojchivaya-veb-arhitektura-v-platforme-mail-ru-cloud-solutions\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Hur implementeras en h\u00f6g tillg\u00e4nglig webbarkitektur p\u00e5 Mail.ru Cloud Solutions | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/52389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=52389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/52389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=52389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=52389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=52389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}