Labi visiem!
Mani sauc Å
ikita, es esmu Cian inženieru komandas komandas vadÄ«tÄjs. Viens no maniem pienÄkumiem uzÅÄmumÄ ir lÄ«dz nullei samazinÄt ar infrastruktÅ«ru saistÄ«to incidentu skaitu ražoÅ”anÄ.
Tas, kas tiks apspriests tÄlÄk, sagÄdÄja mums daudz sÄpju, un Ŕī raksta mÄrÄ·is ir neļaut citiem cilvÄkiem atkÄrtot mÅ«su kļūdas vai vismaz samazinÄt to ietekmi.
Preambula
Sen, kad Cian sastÄvÄja no monolÄ«tiem un vÄl nebija ne miÅas no mikropakalpojumiem, mÄs izmÄrÄ«jÄm resursa pieejamÄ«bu, pÄrbaudot 3-5 lapas.
ViÅi atbild - viss ir kÄrtÄ«bÄ, ja viÅi ilgu laiku neatbild - modri. Cik ilgi viÅiem bija jÄbÅ«t bez darba, lai to uzskatÄ«tu par incidentu, cilvÄki lÄma sanÄksmÄs. NegadÄ«juma izmeklÄÅ”anÄ vienmÄr bija iesaistÄ«ta inženieru komanda. Kad izmeklÄÅ”ana bija pabeigta, viÅi uzrakstÄ«ja pÄcnÄves ziÅojumu ā sava veida ziÅojumu pa e-pastu Å”ÄdÄ formÄtÄ: kas noticis, cik ilgi tas ilga, ko mÄs darÄ«jÄm Å”obrÄ«d, ko darÄ«sim turpmÄk.
Vietnes galvenÄs lapas jeb kÄ mÄs saprotam, ka esam trÄpÄ«juÅ”i apakÅ”Ä
Lai kaut kÄ izprastu kļūdas prioritÄti, esam noteikuÅ”i biznesa funkcionalitÄtei vissvarÄ«gÄkÄs vietnes lapas. Izmantojot tos, mÄs uzskaitÄm veiksmÄ«go/neveiksmÄ«go pieprasÄ«jumu un taimautu skaitu. Å Ädi mÄs novÄrtÄjam darbÄ«bas laiku.
Teiksim, mÄs noskaidrojÄm, ka vietnÄ ir vairÄkas Ä«paÅ”i svarÄ«gas sadaļas, kas ir atbildÄ«gas par galveno pakalpojumu - sludinÄjumu meklÄÅ”anu un iesniegÅ”anu. Ja neveiksmÄ«go pieprasÄ«jumu skaits pÄrsniedz 1%, tas ir kritisks incidents. Ja 15 minÅ«Å”u laikÄ vislabÄkajÄ laikÄ kļūdu lÄ«menis pÄrsniedz 0,1%, tad arÄ« tas tiek uzskatÄ«ts par kritisku incidentu. Å ie kritÄriji attiecas uz lielÄko daļu incidentu; pÄrÄjie ir Ärpus Ŕī raksta darbÄ«bas jomas.
LabÄkie incidenti Cyan
TÄtad, mÄs noteikti esam iemÄcÄ«juÅ”ies noteikt faktu, ka noticis incidents.
Tagad katrs incidents ir sÄ«ki aprakstÄ«ts un atspoguļots Jira eposÄ. Starp citu: Å”im nolÅ«kam mÄs sÄkÄm atseviŔķu projektu, ko sauca par FAIL - tajÄ var izveidot tikai epikus.
Ja apkopojat visas pÄdÄjo gadu neveiksmes, lÄ«deri ir:
- ar mssql saistīti incidenti;
- ÄrÄju faktoru izraisÄ«ti incidenti;
- admin kļūdas.
ApskatÄ«sim sÄ«kÄk administratoru kļūdas, kÄ arÄ« dažas citas interesantas neveiksmes.
PiektÄ vieta - āSakÄrtot lietas DNSā
TÄ bija vÄtraina otrdiena. MÄs nolÄmÄm atjaunot kÄrtÄ«bu DNS klasterÄ«.
Es gribÄju pÄrsÅ«tÄ«t iekÅ”Äjos DNS serverus no bind uz powerdns, pieŔķirot tam pilnÄ«gi atseviŔķus serverus, kur nav nekÄ, izÅemot DNS.
MÄs ievietojÄm vienu DNS serveri katrÄ mÅ«su DC vietÄ, un pienÄca brÄ«dis pÄrvietot zonas no saistÄ«Å”anas uz powerdns un pÄrslÄgt infrastruktÅ«ru uz jauniem serveriem.
PÄrvietoÅ”anÄs laikÄ no visiem serveriem, kas bija norÄdÄ«ti vietÄjÄs keÅ”atmiÅas saitÄs visos serveros, palika tikai viens, kas atradÄs datu centrÄ SanktpÄterburgÄ. Å is DC sÄkotnÄji tika pasludinÄts par mums nekritisku, taÄu pÄkÅ”Åi kļuva par vienu neveiksmes punktu.
TieÅ”i Å”ajÄ pÄrvietoÅ”anas periodÄ nogÄzÄs kanÄls starp Maskavu un SanktpÄterburgu. MÄs faktiski palikÄm bez DNS piecas minÅ«tes un atgriezÄmies, kad mitinÄtÄjs novÄrsa problÄmu.
SecinÄjumi:
Ja agrÄk, gatavojoties darbam, mÄs atstÄjÄm novÄrtÄ ÄrÄjos faktorus, tad tagad arÄ« tie ir iekļauti sarakstÄ, kam gatavojamies. Un tagad mÄs cenÅ”amies nodroÅ”inÄt, lai visi komponenti bÅ«tu rezervÄti n-2, un darba laikÄ mÄs varam pazeminÄt Å”o lÄ«meni lÄ«dz n-1.
- SastÄdot rÄ«cÄ«bas plÄnu, atzÄ«mÄjiet punktus, kur pakalpojums varÄtu neizdoties, un iepriekÅ” pÄrdomÄjiet scenÄriju, kurÄ viss noritÄja āno slikta uz sliktÄkuā.
- Izplatiet iekÅ”Äjos DNS serverus pa dažÄdÄm Ä£eogrÄfiskajÄm atraÅ”anÄs vietÄm/datu centriem/statÄ«viem/slÄdžiem/ievadÄm.
- KatrÄ serverÄ« instalÄjiet lokÄlo keÅ”atmiÅas DNS serveri, kas novirza pieprasÄ«jumus uz galvenajiem DNS serveriem, un, ja tas nav pieejams, tas atbildÄs no keÅ”atmiÅas.
CeturtÄ vieta - āLietu sakopÅ”ana NginksÄā
KÄdÄ jaukÄ dienÄ mÅ«su komanda nolÄma, ka āmums ar to ir ganaā, un sÄkÄs nginx konfigurÄciju pÄrveidoÅ”anas process. Galvenais mÄrÄ·is ir izveidot konfigurÄcijas intuitÄ«vÄ struktÅ«rÄ. IepriekÅ” viss bija āvÄsturiski izveidotsā, un tam nebija nekÄdas loÄ£ikas. Tagad katrs servera_nosaukums ir pÄrvietots uz tÄda paÅ”a nosaukuma failu, un visas konfigurÄcijas ir sadalÄ«tas mapÄs. Starp citu, konfigurÄcijÄ ir 253949 rindiÅas vai 7836520 rakstzÄ«mes un tÄ aizÅem gandrÄ«z 7 megabaitus. AugstÄkais struktÅ«ras lÄ«menis:
Nginx struktūra
āāā 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
Tas kļuva daudz labÄks, taÄu konfigurÄciju pÄrdÄvÄÅ”anas un izplatÄ«Å”anas procesÄ dažÄm no tÄm bija nepareizs paplaÅ”inÄjums un tÄs netika iekļautas direktÄ«vÄ include *.conf. RezultÄtÄ daži saimnieki kļuva nepieejami un atgrieza 301 galvenajÄ lapÄ. SakarÄ ar to, ka atbildes kods nebija 5xx/4xx, tas netika pamanÄ«ts uzreiz, bet tikai no rÄ«ta. PÄc tam mÄs sÄkÄm rakstÄ«t testus, lai pÄrbaudÄ«tu infrastruktÅ«ras komponentus.
SecinÄjumi:
- Pareizi strukturÄjiet savas konfigurÄcijas (ne tikai nginx) un pÄrdomÄjiet struktÅ«ru projekta agrÄ«nÄ stadijÄ. TÄdÄ veidÄ jÅ«s padarÄ«siet tos saprotamÄkus komandai, kas savukÄrt samazinÄs TTM.
- Uzrakstiet testus dažiem infrastruktÅ«ras komponentiem. PiemÄram: pÄrbaudiet, vai visiem atslÄgas servera_nosaukumiem ir pareizs statuss + atbildes pamatteksts. Pietiks tikai ar dažiem skriptiem, kas pÄrbauda komponenta pamatfunkcijas, lai trijos no rÄ«ta drudžaini neatcerÄtos, kas vÄl ir jÄpÄrbauda.
TreÅ”Ä vieta - āPÄkÅ”Åi KasandrÄ pietrÅ«ka vietasā
Dati nepÄrtraukti auga, un viss bija kÄrtÄ«bÄ lÄ«dz brÄ«dim, kad Cassandra klasterÄ« sÄka nedarboties lielo korpusu remonts, jo uz tiem nevarÄja strÄdÄt blÄ«vÄÅ”ana.
KÄdÄ vÄtrainÄ dienÄ klasteris gandrÄ«z pÄrvÄrtÄs par Ä·irbi, proti:
- klasterÄ« bija palikuÅ”i aptuveni 20% no kopÄjÄs vietas;
- Nav iespÄjams pilnÄ«bÄ pievienot mezglus, jo tÄ«rÄ«Å”ana nenotiek pÄc mezgla pievienoÅ”anas, jo starpsienÄs trÅ«kst vietas;
- produktivitÄte pakÄpeniski samazinÄs, jo blÄ«vÄÅ”ana nedarbojas;
- Klasteris ir avÄrijas režīmÄ.
Iziet ā mÄs pievienojÄm vÄl 5 mezglus bez tÄ«rÄ«Å”anas, pÄc tam sÄkÄm tos sistemÄtiski noÅemt no klastera un atkÄrtoti ievadÄ«t, piemÄram, tukÅ”us mezglus, kuriem bija beigusies vieta. Tika pavadÄ«ts daudz vairÄk laika, nekÄ mÄs vÄlÄtos. PastÄvÄja klastera daļÄjas vai pilnÄ«gas nepieejamÄ«bas risks.
SecinÄjumi:
- Visos cassandra serveros nedrÄ«kst aizÅemt vairÄk kÄ 60% vietas katrÄ nodalÄ«jumÄ.
- Tie ir jÄielÄdÄ ar ne vairÄk kÄ 50% CPU.
- Jums nevajadzÄtu aizmirst par jaudas plÄnoÅ”anu un rÅ«pÄ«gi pÄrdomÄt katru komponentu, pamatojoties uz tÄ specifiku.
- Jo vairÄk mezglu klasterÄ«, jo labÄk. Serveri, kuros ir neliels datu apjoms, tiek pÄrslogoti ÄtrÄk, un Å”Ädu kopu ir vieglÄk atdzÄ«vinÄt.
OtrÄ vieta - āDati pazuda no konsula atslÄgas vÄrtÄ«bu krÄtuvesā
Pakalpojumu atklÄÅ”anai mÄs, tÄpat kÄ daudzi, izmantojam konsulu. Bet mÄs izmantojam arÄ« tÄs atslÄgas vÄrtÄ«bu monolÄ«ta zili zaļajam izkÄrtojumam. TajÄ tiek glabÄta informÄcija par aktÄ«vajÄm un neaktÄ«vajÄm augÅ”tecÄm, kas izvietoÅ”anas laikÄ mainÄs vietÄm. Å im nolÅ«kam tika uzrakstÄ«ts izvietoÅ”anas pakalpojums, kas sadarbojÄs ar KV. KÄdÄ brÄ«dÄ« dati no KV pazuda. Atjaunots no atmiÅas, bet ar vairÄkÄm kļūdÄm. RezultÄtÄ augÅ”upielÄdes laikÄ augÅ”Äjo plÅ«smu slodze tika sadalÄ«ta nevienmÄrÄ«gi, un mÄs saÅÄmÄm daudzas 502 kļūdas, jo centrÄlÄ procesora aizmugursistÄmas tika pÄrslogotas. RezultÄtÄ mÄs no konsula KV pÄrcÄlÄmies uz postgresu, no kurienes tos vairs nav tik vienkÄrÅ”i noÅemt.
SecinÄjumi:
- Pakalpojumos bez jebkÄdas atļaujas nedrÄ«kst bÅ«t dati, kas ir bÅ«tiski vietnes darbÄ«bai. PiemÄram, ja jums nav autorizÄcijas ES, labÄk bÅ«tu liegt piekļuvi tÄ«kla lÄ«menÄ« no visur, kur tas nav nepiecieÅ”ams, atstÄt tikai nepiecieÅ”amos, kÄ arÄ« iestatÄ«t action.desstructive_requires_name: true.
- IepriekÅ” praktizÄjiet dublÄÅ”anas un atkopÅ”anas mehÄnismu. PiemÄram, iepriekÅ” izveidojiet skriptu (piemÄram, python), kas var dublÄt un atjaunot.
PirmÄ vieta - "Captain Unobvious"
KÄdÄ brÄ«dÄ« mÄs pamanÄ«jÄm nevienmÄrÄ«gu slodzes sadalÄ«jumu nginx augÅ”pusÄ gadÄ«jumos, kad aizmugursistÄmÄ bija 10+ serveri. SakarÄ ar to, ka apļveida robots sÅ«tÄ«ja pieprasÄ«jumus no 1. lÄ«dz pÄdÄjai augÅ”pusei un katra nginx pÄrlÄdÄÅ”ana sÄkÄs no jauna, pirmÄs augÅ”upÄjÄs plÅ«smas vienmÄr saÅÄma vairÄk pieprasÄ«jumu nekÄ pÄrÄjÄs. RezultÄtÄ tie darbojÄs lÄnÄk un cieta visa vietne. Tas kļuva arvien pamanÄmÄks, palielinoties satiksmes apjomam. VienkÄrÅ”a nginx atjauninÄÅ”ana, lai iespÄjotu izlases veidu, neizdevÄs ā mums ir jÄpÄrveido virkne lua koda, kas (tajÄ brÄ«dÄ«) netika palaista 1.15 versijÄ. Mums bija jÄuzlabo mÅ«su nginx 1.14.2, ievieÅ”ot tajÄ nejauÅ”u atbalstu. Tas atrisinÄja problÄmu. Å Ä« kļūda iegÅ«st kategoriju āKapteinis, kas nav acÄ«mredzamsā.
SecinÄjumi:
Bija ļoti interesanti un aizraujoÅ”i izpÄtÄ«t Å”o kļūdu).
- OrganizÄjiet uzraudzÄ«bu tÄ, lai tas palÄ«dzÄtu Ätri atrast Å”Ädas svÄrstÄ«bas. PiemÄram, varat izmantot ELK, lai uzraudzÄ«tu rps katrÄ katras augÅ”puses aizmugurÄ, pÄrraudzÄ«tu to reakcijas laiku no nginx viedokļa. Å ajÄ gadÄ«jumÄ tas mums palÄ«dzÄja noteikt problÄmu.
TÄ rezultÄtÄ lielÄko daļu neveiksmju varÄja izvairÄ«ties, rÅ«pÄ«gÄk pievÄrÅ”oties tam, ko darÄt. Mums vienmÄr jÄatceras MÄrfija likums: Viss, kas var noiet greizi, noies greizi, un veidot komponentus, pamatojoties uz to.
Avots: www.habr.com