
Tere kĂ”igile!Â
Mina olen Nikita, Ciani inseneride meeskonna juht. Ăks minu kohustustest ettevĂ”ttes on vĂ€hendada tootmises esinevate infrastruktuuriga seotud intsidentide arvu nullini.
Olukord, millest edaspidi juttu tuleb, on meile palju valu pĂ”hjustanud, ning selle artikli eesmĂ€rk on takistada teisi inimesi meie vigu kordamast vĂ”i vĂ€hemalt nende mĂ”ju minimeerimist.Â
EelÔigus
Kaugel minevikus, kui Cian koosnes monoliitidest ja mikroteenuste mĂ€rke ei olnud veel, mÔÔtsime ressursi kĂ€ttesaadavust 3â5 lehe kontrollimisega.Â
Kui need vastasid â kĂ”ik oli hĂ€sti, kui nad pikka aega ei vastanud â tuli alert. Kui kaua nad peavad olema mittetoimivad, et seda peeti intsidendiks, mÀÀrasid inimesed koosolekutel. Inseneride meeskond osales alati intsidendi uurimisel. Uurimise lĂ”petamisel kirjutati postmortem â omamoodi aruanne e-posti teel, vormingus: mis juhtus, kui kaua see kesti, mida me toona tegime, mida me tulevikus teeme.Â
Olulised veebilehe lehed vÔi kuidas me mÔistame, et oleme pÔhja jÔudnud
Â
Ette mĂ”ista vea prioriteeti, oleme vĂ€lja toonud kĂ”ige kriitilisemad teie Ă€ritegevusele olulised veebilehe lehed. Nende pĂ”hjal arvutame edukaid/ebaedu pĂ€ringute ja katkestuste arvu. Sel moel mÔÔdame uptime'i.Â
Oletame, et oleme tuvastanud mitmeid ĂŒliolulisi osa saidist, mis vastutavad peamise teenuse â kuulutuste otsimise ja esitamise â eest. Kui vigadega lĂ”ppevate pĂ€ringute arv ĂŒletab 1%, on see kriitiline juhtum. Kui tippajad 15 minuti jooksul on vea protsent ĂŒle 0,1%, loetakse see samuti kriitiliseks juhtumiks. Need kriteeriumid katab enamik juhtumeid, teised jÀÀvad artikli raamesse.

Cian parimate juhtumite tipplist
Nii et me oleme kindlasti Ă”ppinud mÀÀrama, et juhtum on aset leidnud.Â
NĂŒĂŒd on iga juhtum meil ĂŒksikasjalikult vĂ€lja toodud ning peegeldatud Jira epikus. MĂ€rkusena: selle jaoks oleme loonud eraldi projekti, nimetasime selle FAIL-iks â seal saab luua ainult epikuid.Â
Kui koguda kĂ”ik ebaĂ”nnestumised viimase paariaasta jooksul, siis juhivad:Â
- juhtumid, mis on seotud mssql-iga;
- juhtumid, mis on pÔhjustatud vÀlistest teguritest;
- administraatori vead.
Vaatame lÀhemalt administraatorite vigu ning mÔned teised huvitavad ebaÔnnestumised.
Viiendat kohta hĂ”ivame âDNS-i korrastamisegaâ
See oli sombune teisipĂ€ev. Otsustasime korrastada DNS-kliendiga.Â
Soovisime migreerida sisemised DNS-serverid bindilt powerdns-ile, eraldades selleks tĂ€iesti eraldi serverid, kus muud teenused puudusid.Â
Paigaldasime igasse meie andmekeskuse asukohta ĂŒhe DNS-serveri ning jĂ€rgnes domeenide ĂŒleviimise hetk bindilt powerdns-ile ja infrastruktuuri suunamine uutele serveritele.Â
Ăleviimise kĂ”ige aktiivsemal hetkel serverite, mis oli mĂ€rgitud kohalike vahemĂ€llu salvestavate bind-ide seas kĂ”igil serveritel, jĂ€i alles ainult ĂŒks, mis asus andmekeskuses Peterburis. See andmekeskus oli algselt deklareeritud meile mitte-kriitilisena, kuid muutus Ă€kitselt kriitiliseks punktiks.
Just ĂŒleviimise ajal kukkus ĂŒhendus Moskva ja Peterburi vahel. Oleme praktiliselt DNS-ist ilma jÀÀnud viis minutit ja taastunud siis, kui hoster vead olid kĂ”rvaldatud.Â
JĂ€reldused:
Varem eemaldasime vĂ€listest teguritest tööde ettevalmistamisel, kuid nĂŒĂŒd on need ka valmistumise loendis. NĂŒĂŒd pĂŒĂŒdleme selle poole, et kĂ”ik komponendid oleksid reserveeritud n-2, ning tööde ajaks saame seda taset langetada n-1-ni.
- Tegevusplaani koostamise ajal mĂ€rkige ĂŒles punktid, kus teenus vĂ”ib kokku kukkuda, ja mĂ”elge lĂ€bi stsenaarium, kus kĂ”ik lĂ€heb "halvemast hullemaks".
- Jaotage sisemised DNS-serverid erinevatesse geolokatsioonidesse / andmekeskustesse / riiulitesse / lĂŒlititesse / sisenditesse.
- Igal serveril olge kohalik vahemĂ€llu salvestav DNS-server, mis suunab pĂ€ringud peamistele DNS-serveritele ning juhul, kui see pole saadaval, vastab vahemĂ€lust.Â
Neljas koht â "Korrastame Nginxi"
Ăhel pĂ€eval otsustas meie meeskond, et "on piisavalt talutud" ja kĂ€ivitus nginx konfiguratsioonide refaktoreerimise protsess. Peamine eesmĂ€rk on tuua konfiguratsioonid intuitiivsesse struktuuri. Varem oli kĂ”ik "ajalooliselt kujunenud" ja ei kandnud endas mingit loogikat. NĂŒĂŒd on iga server_name vĂ€lja toodud oma nime saanud faili ning kĂ”ik konfiguratsioonid jaotatud kaustadesse. Ătlematagi selge, et konfiguratsioon sisaldab 253949 rida vĂ”i 7836520 tĂ€hte ja hĂ”ivab peaaegu 7 megabaiti. Ălemine struktuur:Â
Nginx struktuur
âââ access
â Â âââ allow.list
...
â Â âââ whitelist.conf
âââ geobase
â Â âââ exclude.conf
...
â Â âââ geo_ip_to_region_id.conf
âââ geodb
â Â âââ GeoIP.dat
â Â âââ GeoIP2-Country.mmdb
â Â âââ GeoLiteCity.dat
âââ inc
â Â âââ error.inc
...
â Â âââ proxy.inc
âââ lists.d
â Â âââ bot.conf
...
â Â âââ dynamic
â Â âââ geo.conf
âââ lua
â Â âââ cookie.lua
â Â âââ log
â Â â Â âââ log.lua
â Â âââ logics
â Â â Â âââ include.lua
â Â â Â âââ ...
â Â â Â âââ utils.lua
â Â âââ prom
â Â Â Â âââ stats.lua
â Â Â Â âââ stats_prometheus.lua
âââ map.d
â Â âââ access.conf
â Â âââ ..Â
â Â âââ zones.conf
âââ nginx.conf
âââ robots.txt
âââ server.d
â Â âââ cian.ru
â Â â Â âââ cian.ru.conf
â Â â Â âââ ...
â Â â Â âââ my.cian.ru.conf
âââ service.d
â Â âââ ...
â Â âââ status.conf
âââ upstream.d
    âââ cian-mcs.conf
    âââ ...
    âââ wafserver.confAs a result of renaming and redistributing the configs, some of them had incorrect extensions and were not included in the include *.conf directive. Consequently, some hosts became unavailable and returned a 301 redirect to the main page. Because the response code was neither 5xx nor 4xx, this issue was not noticed immediately and was caught only by morning. After this, we started writing tests to verify infrastructure components.
JĂ€reldused:Â
- Struktureeri konfiguratsioonid Ôigesti (mitte ainult nginx) ja mÔtle struktuuri juba projekti varases etapis. Nii muudate need meeskonnale arusaadavamaks, mis omakorda vÀhendab TTM-i.
- MĂ”nede infrastruktuuri komponentide jaoks kirjutage teste. NĂ€iteks: kontrollige, et kĂ”ik vĂ”tme server_nameâid annavad Ă”iged staatuse ja vastuse sisu. Piisab, kui teil on mĂ”ned skriptid, mis kontrollivad pĂ”hifunktsioone, et mitte keset ööd paanikas mĂ”elda, mida veel kontrollida.Â
Kolmas koht â âCassandra's lĂ”ppes ĂŒhtĂ€kki ruumâ
Andmed kasvasid jĂ€rk-jĂ€rgult ja kĂ”ik oli hĂ€sti, kuni hetkeni, mil Cassandra klastris hakkasid suured kayspace'de repair'id kukkuma, kuna compaction ei suutnud nendega töötada.Â
Ăhel tormisel pĂ€eval muutus klaster peaaegu kĂ”rvitsaks, nimelt:
- klastri kokku jÀÀb umbes 20% ruumi;
- nodeâe ei saa korralikult lisada, kuna pĂ€rast nodeâi lisamist ei toimu cleanupâi ruumipuuduse tĂ”ttu jaotustes;
- tĂ”husus langeb jĂ€rk-jĂ€rgult, kuna kompaktimine ei toimi;Â
- klaster töötab hÀdaolukorras.

VĂ€lja minek â lisasime veel 5 sĂ”lme ilma puhastuseta, pĂ€rast mida hakkasime jĂ€rk-jĂ€rgult klastrist vĂ€lja viima ja uuesti sisestama nagu tĂŒhjad sĂ”lmed, millel polnud enam ruumi. Aega on kulunud palju rohkem, kui oleks soovinud. Olius osaline vĂ”i tĂ€ielik juurdepÀÀsu katkemise oht.Â
JĂ€reldused:
- KĂ”igil cassandra serveritel peaks olema iga jaotuse peal maksimaalselt 60% ruumist kasutusel.Â
- Need peaksid olema koormatud mitte rohkem kui 50% CPU-st.
- Ărge jĂ€tke tĂ€helepanuta kapatsiteedi planeerimist ja peate seda arvestama iga komponendiga, lĂ€htudes selle spetsifikast.
- Mida rohkem sĂ”lmi klastris on, seda parem. Serverid, millel on vĂ€ike andmete hulk, saavad kiiremini uuesti kĂ€ivitada, ja sellist klastrit on lihtsam elustada.Â
Teine koht â âAndmed kadusid consul key-value salvestusestâ
Teenuse avastamiseks kasutame nagu paljud teisedki konsulti. Kuid meil kasutatakse seda key-value sĂŒsteemi ka monoliidi sinine-roheline juurutamiseks. Seal salvestatakse teave aktiivsete ja mitteaktiivsete upstreamide kohta, mis vahetavad kohti juurutamise ajal. Selle jaoks kirjutati juurutamisteenus, mis suhtles KV-ga. Mingil hetkel andmed KV-st kadusid. Taastasime need mĂ€lu abil, kuid mĂ”ne vea tĂ”ttu. TagajĂ€rjeks oli see, et juurutamisel jaotus koormus upstreamide vahel ebaĂŒhtlaselt ja saime palju 502 vigu, kuna backendide CPU oli ĂŒle koormatud. LĂ”puks kolisime consul KV-st postgres'i, kust andmete kustutamine pole enam nii lihtne. Â
JĂ€reldused:
- Teenused, millel pole mingit autentimist, ei tohiks sisaldada veebisaidi töö jaoks kriitilisi andmeid. NÀiteks, kui teil pole autentimist ES-is, oleks parem piirata pÀÀsu vÔrgu tasandil kÔikjalt, kus see pole vajalik, jÀtta alles ainult vajalikud ning seadistada action.destructive_requires_name: true.
- Töötage varundamise ja taastamise mehhanism eelnevalt vÀlja. NÀiteks looge eelnevalt skript (nÀiteks pythonis), mis suudab varundada ja taastada.
Esimene koht â âKapten mitte-ilmsusâÂ
Teatud hetkel mĂ€rkisime, et koormuse jaotumine nginx'i ĂŒlemistele serveritele on ebaĂŒhtlane, kui taustal oli 10+ serverit. Kuna round-robin suunas pĂ€ringud alates esimesest kuni viimase ĂŒlemise serverini jĂ€rjestikku ja iga nginx'i taaskĂ€ivitamine algas otsast, jĂ”udis esimestesse ĂŒlemistesse serveritesse alati rohkem pĂ€ringuid kui teistesse. Tulemuseks töötasid need aeglasemalt ja kogu sait kannatas. See muutus jĂ€rjest mĂ€rgatavamaks liikluse suurenemisega. Lihtsalt nginx'i uuendamine random'i aktiveerimiseks ei aidanud â pidime ĂŒmber kirjutama hulga lua koodi, mis ei töötanud versioonis 1.15 (sel ajal). LĂ”puks pidime meie nginx 1.14.2 patĆĄeerima, lisades toe random'ile. See lahendas probleemi. See bugi vĂ”idab auhinna âkapten ebaĂŒheduse eestâ.
JĂ€reldused:
See oli vĂ€ga huvitav ja pĂ”nev uurida seda bussi).Â
- Seadke jĂ€lgimine ĂŒles nii, et see aitaks kiiresti leida sarnaseid fluktuatsioone. NĂ€iteks vĂ”ite kasutada ELK-d, et jĂ€lgida rps-i iga taustal oleva ĂŒlemise serveri jaoks, jĂ€lgides nende vastamisaja muutusi nginx'i vaatenurgast. Sel juhul aitas see meil probleemi tuvastada.Â
Paljude vigade vĂ€ltimine nĂ”uab hoolikamat lĂ€henemist oma tööle. Alati tuleb meeles pidada Murphy seadust: Mis iganes vĂ”ib valesti minna, lĂ€hebki valesti, ning komponendid tuleb ĂŒles ehitada selle seaduse kohaselt.Â
Allikas: habr.com
