
Bonjou, Habr! Mwen se Artem Karamyshev, chèf ekip administrasyon sistèm lan . Nou te gen anpil lanse nouvo pwodwi pandan ane ki sot pase a. Nou te vle asire ke sèvis API yo te fasilman évolutive, toleran fay, ak pare pou kwasans rapid nan chaj itilizatè yo. Platfòm nou an aplike sou OpenStack, e mwen vle di w ki pwoblèm tolerans fay eleman nou te gen pou rezoud pou jwenn yon sistèm toleran fay. Mwen panse ke sa a pral enteresan pou moun ki devlope tou pwodwi sou OpenStack.
Tolerans fòt an jeneral nan yon platfòm konsiste de rezistans nan eleman li yo. Se konsa, nou pral piti piti ale nan tout nivo yo kote nou idantifye risk ak fèmen yo.
Vèsyon videyo istwa sa a, sous prensipal la se te yon rapò nan Uptime jou 4 konferans lan, ki te òganize pa , ou ka wè .
Rezilyans nan achitekti fizik la
Pati piblik nwaj MCS la baze kounye a nan de sant done Tier III, ant yo gen pwòp fib nwa li yo, rezève nan nivo fizik pa diferan wout, ak yon debi 200 Gbit/s. Nivo III bay nivo tolerans fay ki nesesè pou enfrastrikti fizik la.
Se fib nwa rezève nan tou de nivo fizik ak lojik. Pwosesis rezèvasyon chanèl la te iteratif, pwoblèm te parèt, epi nou toujou ap amelyore kominikasyon ant sant done yo.
Pou egzanp, pa gen lontan, pandan y ap travay nan yon pi tou pre youn nan sant done yo, yon ekskavatè te kraze yon tiyo, ak andedan tiyo sa a te gen tou de yon prensipal ak yon backup kab optik. Chanèl kominikasyon nou toleran fay ak sant done a te vin vilnerab nan yon pwen, nan pi a. An konsekans, nou te pèdi yon pati nan enfrastrikti a. Nou te tire konklizyon ak pran yon kantite aksyon, ki gen ladan enstale optik adisyonèl nan pi adjasan a.
Nan sant done yo gen pwen prezans founisè kominikasyon yo nou difize prefiks nou yo atravè BGP. Pou chak direksyon rezo, yo chwazi pi bon metrik, ki pèmèt diferan kliyan yo dwe bay pi bon kalite koneksyon. Si kominikasyon atravè yon founisè tonbe, nou rebati wout nou atravè founisè ki disponib yo.
Si yon founisè echwe, nou otomatikman chanje nan pwochen an. Nan ka yon echèk nan youn nan sant done yo, nou gen yon kopi glas nan sèvis nou yo nan dezyèm sant done a, ki pran sou chaj la tout antye.

Rezilyans nan enfrastrikti fizik
Ki sa nou itilize pou tolerans fay nan nivo aplikasyon an
Sèvis nou an bati sou yon kantite konpozan opensource.
ExaBGP se yon sèvis ki aplike yon kantite fonksyon lè l sèvi avèk pwotokòl routage dinamik ki baze sou BGP. Nou itilize li aktivman pou fè piblisite pou adrès IP ki nan lis blan nou yo kote itilizatè yo jwenn aksè nan API a.
HAProxy se yon balanse gwo chaj ki pèmèt ou konfigirasyon règ balanse trafik trè fleksib nan diferan nivo nan modèl la OSI. Nou itilize li pou balanse devan tout sèvis: baz done, koutye mesaj, sèvis API, sèvis entènèt, pwojè entèn nou yo - tout bagay se dèyè HAProxy.
Aplikasyon API — yon aplikasyon entènèt ki ekri an python, ak ki itilizatè a jere enfrastrikti li ak sèvis li.
Aplikasyon travayè (apwe sa tou senpleman travayè) - nan sèvis OpenStack, sa a se yon demon enfrastrikti ki pèmèt ou difize kòmandman API nan enfrastrikti a. Pou egzanp, kreyasyon disk fèt nan travayè a, ak demann kreyasyon an rive nan API aplikasyon an.
Achitekti Aplikasyon Creole OpenStack
Pifò sèvis ki devlope pou OpenStack eseye swiv yon sèl paradigm. Yon sèvis anjeneral konsiste de 2 pati: API ak travayè (ekzekitè backend). Kòm yon règ, yon API se yon aplikasyon WSGI nan python, ki se lanse swa kòm yon pwosesis endepandan (demon), oswa lè l sèvi avèk yon pare-fè Nginx oswa Apache sèvè entènèt. API a trete demann itilizatè a epi li pase plis enstriksyon nan aplikasyon travayè a pou egzekisyon an. Transfè a fèt lè l sèvi avèk yon koutye mesaj, anjeneral RabbitMQ, lòt moun yo mal sipòte. Lè mesaj rive nan koutye a, travayè yo trete yo epi, si sa nesesè, retounen yon repons.
Paradig sa a enplike pwen komen izole nan echèk: RabbitMQ ak baz done a. Men, RabbitMQ izole nan yon sèl sèvis epi, an teyori, li ka endividyèl pou chak sèvis. Se konsa, nan MCS nou separe sèvis sa yo otank posib pou chak pwojè endividyèl nou kreye yon baz done separe, yon RabbitMQ separe. Apwòch sa a bon paske nan ka yon aksidan nan kèk pwen vilnerab, se pa tout sèvis la kraze, men se sèlman yon pati nan li.
Kantite aplikasyon pou travayè yo san limit, kidonk API a ka fasilman echèl orizontal dèyè balanse yo nan lòd yo ogmante pèfòmans ak tolerans fay.
Gen kèk sèvis ki mande kowòdinasyon nan sèvis la lè operasyon sekans konplèks yo fèt ant API yo ak travayè yo. Nan ka sa a, yo itilize yon sèl sant kowòdinasyon, yon sistèm gwoup tankou Redis, Memcache, etcd, ki pèmèt yon travayè di yon lòt ke travay sa a asiyen nan li ("tanpri pa pran li"). Nou itilize etcd. Kòm yon règ, travayè yo aktivman kominike ak baz done a, ekri ak li enfòmasyon ki soti nan la. Nou itilize mariadb kòm yon baz done, ki sitiye nan yon gwoup multimaster.
Se yon sèl sèvis klasik sa a òganize nan yon fason jeneralman aksepte pou OpenStack. Li ka konsidere kòm yon sistèm fèmen, pou ki metòd yo nan dekale ak tolerans fòt yo byen evidan. Pou egzanp, pou tolerans fay API, li ase yo mete yon balanse devan yo. Echèl travayè yo reyalize lè yo ogmante kantite yo.
Pwen fèb nan tout konplo a se RabbitMQ ak MariaDB. Achitekti yo merite yon atik separe Nan atik sa a mwen vle konsantre sou tolerans fay API.

Achitekti aplikasyon Openstack. Balanse ak tolerans fay nan platfòm nwaj la
Fè balansin HAProxy toleran fay lè l sèvi avèk ExaBGP
Pou rann API nou yo évolutive, rapid ak toleran pou fay, nou mete yon balans chaj devan yo. Nou te chwazi HAProxy. Nan opinyon mwen, li gen tout karakteristik ki nesesè pou travay nou an: balanse nan plizyè nivo OSI, yon koòdone jesyon, fleksibilite ak évolutivité, yon gwo kantite metòd balanse, sipò pou tab sesyon yo.
Premye pwoblèm ki te bezwen rezoud se te tolerans fay balanse nan tèt li. Senpleman enstale yon balanse tou kreye yon pwen nan echèk: balans lan kraze ak sèvis la aksidan. Pou anpeche sa rive, nou itilize HAProxy ansanm ak ExaBGP.
ExaBGP pèmèt ou aplike yon mekanis pou tcheke eta a nan yon sèvis. Nou itilize mekanis sa a pou tcheke fonksyonalite HAProxy epi, nan ka ta gen pwoblèm, enfim sèvis HAProxy nan BGP.
Konplo ExaBGP+HAProxy
- Nou enstale lojisyèl ki nesesè yo, ExaBGP ak HAProxy, sou twa serveurs.
- Nou kreye yon koòdone loopback sou chak sèvè.
- Sou tout twa serveurs nou bay menm adrès IP blan nan koòdone sa a.
- Yo pibliye yon adrès IP blan sou Entènèt atravè ExaBGP.
Se tolerans fay reyalize pa piblisite menm adrès IP soti nan tout twa serveurs. Soti nan yon pwen de vi rezo, menm adrès la aksesib nan twa diferan pwochen hop. Routeur la wè twa wout ki idantik, chwazi pi gwo priyorite nan yo ki baze sou pwòp metrik li yo (sa a se nòmalman menm opsyon an), ak trafik la ale sèlman nan youn nan sèvè yo.
Nan ka pwoblèm ak operasyon HAProxy oswa yon echèk sèvè, ExaBGP sispann anonse wout la, epi trafik la san pwoblèm chanje nan yon lòt sèvè.
Kidonk, nou reyalize tolerans fay balanse a.

Tolerans fay balanse HAProxy
Konplo a te tounen enpafè: nou te aprann kijan pou rezève HAProxy, men nou pa t aprann kijan pou distribye chaj la nan sèvis yo. Se poutèt sa, nou te elaji konplo sa a yon ti kras: nou te deplase sou balanse ant plizyè adrès IP blan.
Balanse ki baze sou DNS plis BGP
Pwoblèm balans chaj pou HAProxy nou an rete poko rezoud. Sepandan, li ka rezoud byen tou senpleman, jan nou te fè isit la.
Pou balans twa serveurs w ap bezwen 3 adrès IP blan ak bon DNS fin vye granmoun. Yo detèmine chak nan adrès sa yo sou koòdone loopback chak HAProxy epi yo fè piblisite sou Entènèt la.
Nan OpenStack, pou jere resous yo, yo itilize yon anyè sèvis, ki presize API pwen final yon sèvis patikilye. Nan anyè sa a nou anrejistre yon non domèn - public.infra.mail.ru, ki rezoud atravè dns pa twa adrès IP diferan. Kòm yon rezilta, nou jwenn distribisyon chaj ant twa adrès atravè DNS.
Men, depi lè yo anonse adrès IP blan nou pa kontwole priyorite seleksyon sèvè yo, sa a pa balanse ankò. Tipikman, yo pral chwazi yon sèl sèvè ki baze sou ansyènte adrès IP, ak de lòt yo pral san fè anyen konsa paske pa gen okenn mezi espesifye nan BGP.
Nou te kòmanse voye wout atravè ExaBGP ak mezi diferan. Chak balanse fè piblisite pou tout twa adrès IP blan yo, men youn nan yo, youn nan prensipal pou balanse sa a, pibliye ak mezi minimòm lan. Se konsa, pandan tout twa balans yo nan operasyon, apèl nan premye adrès IP ale nan premye balans lan, apèl nan dezyèm nan dezyèm nan, ak apèl nan twazyèm nan twazyèm lan.
Kisa k ap pase lè youn nan balans yo tonbe? Si nenpòt balanse echwe, adrès prensipal li yo toujou pibliye nan de lòt yo, epi yo redistribiye trafik ant yo. Kidonk, nou bay itilizatè a plizyè adrès IP nan yon fwa atravè DNS. Lè nou balanse pa DNS ak diferan mezi, nou jwenn yon distribisyon egal nan chaj la atravè tout twa balanse yo. E an menm tan nou pa pèdi tolerans fòt.

Balanse HAProxy ki baze sou DNS + BGP
Entèraksyon ant ExaBGP ak HAProxy
Se konsa, nou aplike tolerans fay nan ka sèvè a kite, ki baze sou kanpe anons la nan wout. Men, HAProxy ka fèmen pou lòt rezon pase echèk sèvè: erè administrasyon, echèk nan sèvis la. Nou vle retire balans lan kase anba chay la nan ka sa yo tou, epi nou bezwen yon mekanis diferan.
Se poutèt sa, elaji konplo anvan an, nou aplike batman kè ant ExaBGP ak HAProxy. Sa a se yon aplikasyon lojisyèl nan entèraksyon ki genyen ant ExaBGP ak HAProxy, lè ExaBGP itilize scripts koutim yo tcheke estati aplikasyon yo.
Pou fè sa, ou bezwen konfigirasyon yon chèk sante nan konfigirasyon ExaBGP, ki ka tcheke estati HAProxy. Nan ka nou an, nou konfigirasyon backend sante a nan HAProxy, epi soti nan bò ExaBGP nou tcheke avèk yon demann GET senp. Si anons la sispann rive, Lè sa a, HAProxy gen plis chans pa travay epi pa gen okenn bezwen fè piblisite pou li.

HAProxy Health Check
HAProxy Peers: senkronizasyon sesyon
Pwochen bagay yo te fè se te senkronize sesyon yo. Lè w ap travay nan balanse distribiye, li difisil pou òganize depo enfòmasyon sou sesyon kliyan yo. Men, HAProxy se youn nan balans yo kèk ki ka fè sa akòz fonctionnalités Peers - kapasite nan transfere tab sesyon ant diferan pwosesis HAProxy.
Gen diferan metòd balanse: senp tankou , ak pwolonje, lè sesyon kliyan an sonje, epi chak fwa li fini sou sèvè a menm jan anvan. Nou te vle aplike dezyèm opsyon an.
HAProxy sèvi ak tab bwa pou sove sesyon kliyan nan mekanis sa a. Yo sove adrès IP orijinal kliyan an, adrès sib yo chwazi (backend) ak kèk enfòmasyon sèvis. Tipikman, tab bwa yo itilize pou estoke yon pè sous-IP + destinasyon-IP, ki itil espesyalman pou aplikasyon ki pa ka transfere kontèks sesyon itilizatè lè yo chanje nan yon lòt balanse, pou egzanp, nan mòd balanse RoundRobin.
Si yo anseye yon tab bwa pou deplase ant diferan pwosesis HAProxy (ant ki balanse fèt), balanse nou yo pral kapab travay avèk yon sèl pisin tab bwa. Sa a pral fè li posib chanje rezo kliyan an san pwoblèm si youn nan balans yo echwe travay ak sesyon kliyan yo ap kontinye sou backend yo menm ki te chwazi pi bonè.
Pou yon bon operasyon, pwoblèm nan nan adrès IP sous la nan balans lan soti nan ki te etabli sesyon an dwe rezoud. Nan ka nou an, sa a se yon adrès dinamik sou koòdone loopback la.
Travay kòrèk kanmarad yo reyalize sèlman nan sèten kondisyon. Sa vle di, TCP timeouts yo dwe gwo ase oswa chanje dwe rapid ase pou ke sesyon TCP a pa gen tan fini. Sepandan, li pèmèt pou chanje san pwoblèm.
Nan IaaS nou gen yon sèvis ki bati ak menm teknoloji a. Sa a , ki rele Octavia. Li baze sou de pwosesis HAProxy e okòmansman gen ladan sipò pou kanmarad yo. Yo te pwouve tèt yo ekselan nan sèvis sa a.
Foto a montre yon fason chematik mouvman tab kanmarad ant twa sikonstans HAProxy, yo pwopoze yon konfigirasyon sou fason sa a ka konfigirasyon:

HAProxy Peers (senkronizasyon sesyon)
Si ou aplike menm konplo a, operasyon li yo dwe ak anpil atansyon teste. Li pa yon reyalite ke li pral travay nan menm fason an 100% nan tan an. Men, omwen ou pa pral pèdi tab bwa lè ou bezwen sonje IP sous kliyan an.
Limite kantite demann similtane ki soti nan menm kliyan an
Nenpòt sèvis ki disponib piblikman, enkli API nou yo, kapab sijè a lavalas demann. Rezon ki fè yo pou yo ka konplètman diferan, soti nan erè itilizatè yo atak vize. Nou detanzantan DDoSed pa adrès IP. Kliyan yo souvan fè erè nan scripts yo epi yo ban nou mini-DDoS.
Yon fason oswa yon lòt, pwoteksyon adisyonèl dwe bay. Solisyon an evidan se limite kantite demann API epi yo pa gaspiye tan CPU pwosesis demann move.
Pou aplike restriksyon sa yo, nou itilize limit pousantaj, òganize sou baz HAProxy, lè l sèvi avèk menm tab bwa yo. Mete kanpe limit se byen senp epi li pèmèt ou limite itilizatè a pa kantite demann nan API a. Algorithm la sonje IP sous ki soti nan ki demann yo fè ak limite kantite demann similtane soti nan yon sèl itilizatè. Natirèlman, nou kalkile pwofil chaj mwayèn API pou chak sèvis epi mete yon limit ≈ 10 fwa valè sa a. Nou kontinye kontwole sitiyasyon an ak anpil atansyon epi kenbe dwèt nou sou batman kè a.
Ki sa sa sanble nan pratik? Nou gen kliyan ki sèvi ak API autoscaling nou yo tout tan. Yo kreye apeprè de a twasan machin vityèl nan maten an epi efase yo nan aswè. Pou OpenStack, kreye yon machin vityèl, tou ak sèvis PaaS, mande pou omwen 1000 demann API, paske entèraksyon ant sèvis yo rive tou atravè API a.
Sa yo transfè nan travay lakòz yon chaj jistis gwo. Nou evalye chay sa a, kolekte pik chak jou, ogmante yo diz fwa, e sa te vin limit to nou an. Nou kenbe dwèt nou sou batman kè a. Nou souvan wè bots ak eskanè ki ap eseye gade nou pou wè si nou gen nenpòt scripts CGA ki ka kouri, nou aktivman koupe yo.
Ki jan yo mete ajou kodbaz ou san itilizatè yo remake
Nou tou aplike tolerans fay nan nivo pwosesis deplwaman kòd. Ka gen pwoblèm pandan deplwaye, men enpak yo sou disponiblite sèvis yo ka minimize.
Nou toujou mete ajou sèvis nou yo epi nou dwe asire ke baz kod la mete ajou san yo pa afekte itilizatè yo. Nou te jere rezoud pwoblèm sa a lè l sèvi avèk kapasite jesyon HAProxy ak aplikasyon Graceful Shutdown nan sèvis nou yo.
Pou rezoud pwoblèm sa a, li te nesesè asire kontwòl nan balans lan ak "kòrèk" fèmen sèvis yo:
- Nan ka HAProxy, kontwòl fèt atravè yon fichye estatistik, ki se esansyèlman yon priz epi li defini nan konfigirasyon HAProxy. Ou ka voye kòmandman pou li atravè stdio. Men, zouti prensipal kontwòl konfigirasyon nou an se ansib, kidonk li gen yon modil entegre pou jere HAProxy. Ki nou aktivman itilize.
- Pifò nan sèvis API ak motè nou yo sipòte teknoloji fèmen grasyeuz: lè yo fèmen, yo tann pou travay aktyèl la fini, kit se yon demann http oswa kèk travay sèvis. Menm bagay la rive ak travayè a. Li konnen tout travay li ap fè epi li fini lè li fin konplete tout bagay avèk siksè.
Mèsi a de pwen sa yo, algorithm an sekirite pou deplwaman nou an sanble sa a.
- Pwomotè a rasanble yon nouvo pake kòd (pou nou sa a se RPM), teste li nan anviwònman dev la, teste li nan etap la, epi kite li nan depo etap la.
- Pwomotè a fikse travay la pou deplwaman ak deskripsyon ki pi detaye sou "afèkti" yo: vèsyon nouvo pake a, yon deskripsyon nouvo fonksyonalite a ak lòt detay sou deplwaman an si sa nesesè.
- Administratè sistèm lan kòmanse aktyalizasyon a. Lanse liv jwèt Ansible, ki an vire fè bagay sa yo:
- Pran yon pake ki soti nan depo etap la epi sèvi ak li pou mete ajou vèsyon an nan pake a nan depo pwodwi a.
- Konpile yon lis backends nan sèvis la mete ajou.
- Fèmen premye sèvis yo mete ajou nan HAProxy epi tann pou pwosesis li yo fini. Mèsi a fèmen grasyeuz, nou gen konfyans ke tout demann kliyan aktyèl yo pral konplete avèk siksè.
- Apre API a ak travayè yo konplètman sispann, epi HAProxy yo etenn, kòd la mete ajou.
- Ansible kouri sèvis yo.
- Pou chak sèvis, sèten "manch" yo rale, ki fè tès inite sou yon kantite tès kle pre-defini. Yon chèk debaz nan nouvo kòd la pran plas.
- Si yo pa jwenn okenn erè nan etap anvan an, backend la aktive.
- Ann ale nan pwochen backend la.
- Apre tout backend yo mete ajou, tès fonksyonèl yo te lanse. Si yo manke, Lè sa a, pwomotè a gade nenpòt nouvo fonksyonalite ke li te kreye.
Sa a konplete deplwaman an.

Sik aktyalizasyon sèvis yo
Konplo sa a pa t ap travay si nou pa t gen yon sèl règ. Nou sipòte tou de ansyen ak nouvo vèsyon yo nan batay. Davans, nan etap nan devlopman lojisyèl, li mete desann ke menm si gen chanjman nan baz done sèvis la, yo pa pral kraze kòd anvan an. Kòm yon rezilta, baz kòd la piti piti mete ajou.
Konklizyon
Pataje pwòp panse mwen sou yon achitekti WEB ki toleran defo, mwen ta renmen remake yon lòt fwa ankò pwen kle li yo:
- tolerans fòt fizik;
- tolerans fay rezo (balanse, BGP);
- tolerans fòt nan lojisyèl an itilize ak devlope.
Aktivite ki estab tout moun!
Sous: www.habr.com
