Topsite fopaad Cianis

Topsite fopaad Cianis

Tere kÔigile! 

Minu nimi on Nikita, olen ĐŠĐžĐ°Đœ'i insenerimeeskonna tiimijuht. Üks minu ĂŒlesannetest firmas on vĂ€hendada produtseerimise infrastruktuuriga seotud intsidente nullini.
KÀesolevas artiklis kÀsitletav teema on meile palju valu toonud, ja eesmÀrk on vÀltida, et teised inimesed kordaks meie vigu vÔi vÀhemalt minimeeriks nende mÔju. 

Eesliide

Kauges minevikus, kui ĐŠĐžĐ°Đœ koosnes monoliitidest ja mikroteenustest polnud veel jĂ€lgegi, mÔÔtsime ressursi kĂ€ttesaadavust kontrollides 3–5 lehte. 

Kui nad vastavad — on kĂ”ik hĂ€sti, kui nad ei vasta pikka aega — on hĂ€ire. Kui kaua nad peavad mitte töötama, et seda loetaks intsidendiks, mÀÀrati koosolekutel. Insenerimeeskond osales alati intsidendi uurimises. Kui uurimine oli lĂ”petatud, kirjutati post mortem — omamoodi aruanne e-posti formaadis: mis juhtus, kui kaua see kestis, mida tehti hetkel, mida teeme tulevikus. 

Peamised veebisaidi lehed vÔi kuidas me mÔistame, et oleme pÔhja tabanud

 
Kuna me pĂŒĂŒame mĂ”ista vea prioriteeti, oleme vĂ€lja toonud kĂ”ige kriitilisemad veebisaidi lehed Ă€ritegevuse funktsionaalsuse jaoks. Nende pĂ”hjal loeme edukaid/ebaĂ”nnestunud pĂ€ringute ja ajakulu arvu. Nii mÔÔdame uptime'i. 

Oletame, et oleme tuvastanud, et on olemas rida superolulisi veebisaidi sektsioone, mis vastutavad pĂ”hiteenuse — otsingu ja kuulutuste esitamise — eest. Kui veaga lĂ”ppenud pĂ€ringute arv ĂŒletab 1%, on see kriitiline intsident. Kui tipptunnil 15 minuti jooksul veaprotsent ĂŒletab 0,1%, loetakse seda samuti kriitiliseks intsidendiks. Need kriteeriumid katab suurema osa intsidendidest, teised jÀÀvad artikli raamesse.

Topsite fopaad Cianis

ĐŠĐžĐ°Đœ'i parimate intsidentide edetabel

Nii et me oleme kindlasti Ôppinud tuvastama, et intsident on juhtunud. 

NĂŒĂŒd on iga intsident detailselt kirjeldatud ja kajastatud Jira epic'is. Muide: selleks kĂ€ivitasime eraldi projekti, mille nimeks sai FAIL — seal saab luua ainult epikuid. 

Kui koguda kokku kÔik ebaÔnnestumised viimase paari aasta jooksul, siis valitsevad: 

  • intsidendid, mis on seotud mssql-iga;
  • intsidendid, mis on tingitud vĂ€listest teguritest;
  • admini vead.

Haarame pÔhjalikumalt kinni adminide vigadest ja mÔnest muust huvitavast ebaÔnnestumisest.

Viies koht — 'Teeme korda DNS'i'

See oli sombune teisipÀev. Otsustasime DNS-klastri korrastada. 

Soovisime ĂŒmber seadistada sise dns-serverid bindilt powerdns-ile, eraldades selleks tĂ€ielikult eraldi serverid, kus peale dns-i midagi ei ole. 

Paigutasime igasse meie andmekeskuse asukohta ĂŒhe dns-serveri ja saabus hetk, mil tegime tsoonide ĂŒleviimise bindilt powerdns-ile ning lĂŒlitasime infrastruktuuri uutele serveritele. 

Üleviimise kĂ”ige tihedamal perioodil jĂ€i meil alles vaid ĂŒks dns-server, serverid, mis oli kohalikes vahemĂ€lu bind-ides kĂ”igil serveritel, oli Peterburi andmekeskuses. See andmekeskus oli algselt deklareeritud meie jaoks mitte kriitiliseks, kuid muutus Ă€kitselt ĂŒhekordseks rikke kohaks.
Just selle ĂŒlemineku ajal kukkus kanal Moskva ja Peterburi vahel. Me olime tegelikult viie minuti jooksul DNS-ita ja saime uuesti tööle, kui hostija vead likvideeriti. 

KokkuvÔtted:

Kui varem olime me vĂ€listest teguritest tööde ettevalmistamisel mööda vaadanud, siis nĂŒĂŒd oleme need ka ettevalmistuse nimekirja lisanud. Ja nĂŒĂŒd pĂŒĂŒame tagada, et kĂ”ik komponendid on reserveeritud n-2, ja tööde ajaks saame selle taseme langetada n-1.

  • Tegevusplaani koostamisel mĂ€rkige ĂŒles punktid, kus teenus vĂ”ib kokku kukkuda, ja mĂ”elge lĂ€bi stsenaarium, kus kĂ”ik lĂ€heb halvasti, ette.
  • Jaotage sise dns-serverid erinevatesse geolokatsioonidesse/andmekeskustesse/rakendustesse/lĂŒlititesse/sisenditesse.
  • Iga serveri jaoks seadke ĂŒles lokaalset vahemĂ€lu dns-serverit, mis suunab pĂ€ringud peamistele dns-serveritele ning juhul, kui see ei ole saadaval, vastab vahemĂ€lust. 

Neljas koht - "Korrastame Nginx'i"

Ühel kenal pĂ€eval otsustas meie meeskond, et „piisab sellest talumisest“, ja algas nginx-i konfiguratsioonide refaktoreerimise protsess. Peamine eesmĂ€rk on tuua konfiguratsioonid intuitiivselt arusaadavasse struktuuri. Varem oli kĂ”ik olnud „ajaloo tĂ”ttu” ja loogikat ei olnud. NĂŒĂŒd on iga server_name viidatud sama nimega faili ja kĂ”ik konfiguratsioonid on jaotatud kaustadesse. Muide - konfiguratsioon sisaldab 253949 rida vĂ”i 7836520 mĂ€rki ja on peaaegu 7 megabaiti suur. Ülemise taseme 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

On parem, kuid konfigureerimise ĂŒmbernimetamise ja jagamise kĂ€igus oli mitmel neist vale laiend ja nad ei sattunud direktiivi include *.conf. Selle tulemusena olid mĂ”ned hostid kĂ€ttesaamatud ja suunati 301 pĂ”hilehe poole. Kuna vastuskood ei olnud 5xx/4xx, mĂ€rkasime seda alles hommikul. PĂ€rast seda hakkasime kirjutama teste infrastruktuuri komponentide kontrollimiseks.

KokkuvÔtted: 

  • Struktureerige konfigureerimine Ă”igesti (mitte ainult nginx) ja mĂ”elge struktuuri varajases projekti etapis. Nii teete need meeskonnale arusaadavamaks, mis omakorda vĂ€hendab TTM-i.
  • Kirjutage mĂ”ne infrastruktuuri komponendi jaoks teste. NĂ€iteks: kontrollige, et kĂ”ik olulised server_name tagastavad Ă”ige staatuse ja vastuse keha. Piisab, kui teil on lihtsalt paar skripti, mis kontrollivad komponendi pĂ”hifunktsioone, et mitte 3 öösel pĂ”hjalikult mĂ”elda, mida veel kontrollida. 

Kolmas koht — "ÜhtĂ€kki lĂ”ppes koht Cassandra's"

Andmed kasvasid jÀrk-jÀrgult ja kÔik oli hÀsti, kuni Cassandra klastris hakkasid kukkuma repair suurtel keyspace'idel, kuna compaction ei saanud töötada. 

Ühel sombusel pĂ€eval muutus klaster peaaegu kĂ”rvitsaks, nimelt:

  • koha jĂ€i klastrisse umbes 20%;
  • tĂ€ielikult node'e lisada ei saa, kuna node'i lisamise jĂ€rel ei toimu cleanup-i ruumi puudumise tĂ”ttu partitsioonides;
  • tootlikkus langeb tasapisi, kuna compaction ei toimi; 
  • klaster töötab avariireĆŸiimis.

Topsite fopaad Cianis

VĂ€ljund — lisasime veel 5 sĂ”lme ilma puhastuseta, pĂ€rast mida hakkasime jĂ€rk-jĂ€rgult klastrist eemaldama ja uuesti lisama, nagu tĂŒhjad sĂ”lmed, millel ruum lĂ”ppes. Aega on kulutatud oluliselt rohkem, kui oleks soovinud. Oli oht osalise vĂ”i tĂ€ieliku klastrite kĂ€ttesaamatuse osas. 

KokkuvÔtted:

  • KĂ”ikidel cassandra serveritel ei tohi iga jaotuse peal olla rohkem kui 60% ruumi kasutuses. 
  • Need ei tohi olla laaditud rohkem kui 50% CPU-st.
  • Ärge unustage mahtude planeerimist ja seda tuleks mĂ”elda iga kompoondi suhtes, lĂ€htudes tema spetsiifikast.
  • Mida rohkem sĂ”lmi klastris, seda parem. Serverid, mis sisaldavad vĂ€ikest andmemahu, laaditakse kiiremini ja sellist klastrit on lihtsam taastada. 

Teine koht — „Andmed kadusid consul key-value salvestusest“

Teenuste avastamiseks kasutame nagu paljud teisedki consul. Kuid meil kasutatakse tema key-value veel ka monoliidi blue-green vĂ€lja laskmiseks. Seal hoitakse teavet aktiivsete ja mitteaktiivsete upstreamide kohta, mis vahetavad kohti juurutamise ajal. Selleks kirjutati juurutamise teenus, mis suhtles KV-ga. Ühel hetkel kadusid andmed KV-st. Taastasime mĂ€lust, kuid mitmete vigadega. TagajĂ€rjena jaotati koormus upstreamidele ebaĂŒhtlaselt ja saime palju 502 vigu, kuna backendide CPU oli ĂŒle koormatud. LĂ”ppkokkuvĂ”ttes kolisime consul KV-lt postgres'i, kust nende eemaldamine ei ole enam nii lihtne.  

KokkuvÔtted:

  • Teenused, millel ei ole mingit autoriseerimist, ei tohi sisaldada veebisaidi toimimiseks kriitilisi andmeid. NĂ€iteks, kui teil ei ole autoriseerimist ES-is — oleks parem keelata juurdepÀÀs vĂ”rgu tasemel kĂ”ikjal, kus see ei ole vajalik, jĂ€tta alles ainult vajalikud, ning seada action.destructive_requires_name: true.
  • Harjutage varukoopiate ja taastamise mehhanismi eelnevalt. NĂ€iteks kirjutage ette skript (nĂ€iteks pythonis), mis oskab nii varundada kui ka taastada.

Esimene koht — „Kapten ebaselgus“ 

Mingil hetkel mĂ€rkamisime, et nginx'i ĂŒlesvoolude koormus oli ebaĂŒhtlaselt jaotunud, kui tagaplaanil oli rohkem kui 10 serverit. Kuna round-robin suunas pĂ€ringud esimesest kuni viimase ĂŒlesvooluni jĂ€rjestikku ja iga nginx'i uuendamine algas algusest, said esimesed ĂŒlesvoolud alati rohkem pĂ€ringuid kui teised. Selle tulemusena töötasid nad aeglasemalt ja kogu veebisait kannatas. See muutus ĂŒha silmatorkavamaks, kui liiklus suurenes. Lihtne nginx'i vĂ€rskendamine random'i toeks ei piisand — pidime ĂŒmber tegema hulga lua koodi, mis versioonil 1.15 ei töötanud (selles hetkes). Me pidime patĆĄima meie nginx 1.14.2, lisades sellele random'i toe. See lahendas probleemi. See bugi vĂ”idab “kapteni ebaselgus” auhinna.

KokkuvÔtted:

See oli vÀga huvitav ja kaasahaarav uurida seda viga). 

  • Seadke jĂ€lgimine ĂŒles nii, et see aitaks kiiresti leida sarnaseid fluctuaatsioone. NĂ€iteks vĂ”ib kasutada ELK-d, et jĂ€lgida rps-i iga tagaplaani jaoks iga ĂŒlesvoolu puhul ning jĂ€lgida nende vastusaega nginx'i kontekstis. Sel juhul aitas see meil probleemi tuvastada. 

Suurema osa ebaÔnnestumisi oleks saanud vÀltida, kui oleksime lÀhenenud asjadele pÔhjalikumalt. Peame alati meeles pidama Murphy seadust: Anything that can go wrong will go wrong, ja ehitama komponente, lÀhtudes sellest. 

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster