Tsian parimad ebaÔnnestumised

Tsian parimad ebaÔnnestumised

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.

Tsian parimad ebaÔnnestumised

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.conf

As 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.

Tsian parimad ebaÔnnestumised

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

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