Բոլոր դասերը
ՃարտարապետությունԱռաջադեմ13 րոպե ընթերցումԻմ ստեկում

Հուսալիություն, SRE և շահագործում

SLO-ներ և error budget, on-call, միջադեպերի արձագանք, postmortem-ներ և աղետից վերականգնում։

  • SLO / SLA
  • Incidents
  • Runbooks
  • Disaster recovery
  • Postmortems
Քայլ 1/6
Checkout-ը տևում է 8 վայրկյան, ու օգտատերերը կատաղած են։ Ժամանակն է կանչել դետեկտիվներին՝ metrics, traces և logs։

30 վայրկյանում

Հուսալիությունը ծառայությունն այնպես աշխատեցնելու պրակտիկան է, ինչպես սպասում են օգտատերերը, և արագ վերականգնվելը, երբ այդպես չէ։ Site Reliability Engineering-ը (SRE) դա դարձնում է չափելի. սահմանեք, թե ինչ է նշանակում «աշխատում է» (SLI-ներ), դրեք թիրախներ (SLO-ներ) և մնացած error budget-ն օգտագործեք նոր ֆունկցիաների ու կայունության միջև հավասարակշռություն գտնելու համար։ Դրա շուրջ են on-call-ը, միջադեպերի արձագանքը, runbook-երը, postmortem-ները և աղետների համար թեստավորված պլանը։

Ինչու եմ օգտագործում

  • Ես կիրառում եմ այս պրակտիկաները, որովհետև outage-ի թանկ մասը սովորաբար դրա շուրջ եղած խառնաշփոթն է, ոչ թե բագն ինքը։
  • SLO-ները «կայքը կարծես դանդաղ է» տիպի անորոշ բողոքները վերածում են թվերի, որոնց շուրջ թիմն ու հաճախորդը կարող են համաձայնվել։
  • Backup-ը հաշվվում է միայն այն դեպքում, եթե վերականգնումը թեստավորվել է. ես սովորեցի չթեստավորված backup-ը համարել backup-ի բացակայություն։
  • Runbook-երն ու postmortem-ները թույլ են տալիս փոքր թիմին հանգիստ շահագործել production-ը՝ մեկ մարդու հիշողությանը հենվելու փոխարեն։

Ինչպես է աշխատում

01SLI, SLO, SLA և error budget

Service Level Indicator-ը (SLI) օգտատիրոջ փորձառության չափում է, օրինակ՝ հաջողված request-ների բաժինը կամ 300 ms-ից արագ մատուցվածների բաժինը։ Service Level Objective-ը (SLO) այդ ցուցանիշի թիրախն է որոշակի ժամանակահատվածում. checkout-ի request-ների 99.9 տոկոսը հաջողվում է 30 օրվա ընթացքում։ Service Level Agreement-ը (SLA) հետևանքներով պայմանագիր է, սովորաբար՝ գումարի վերադարձով, և այն պետք է ավելի մեղմ լինի, քան ձեր ներքին SLO-ն, որպեսզի զգուշացում ստանաք մինչև այն խախտելը։ Error budget-ը կատարյալի և SLO-ի միջև տարբերությունն է. 99.9 տոկոսը թույլ է տալիս մոտ 43 րոպե ձախողում 30 օրում։ Քանի դեռ budget-ը մնում է, թողարկեք ֆունկցիաներ. երբ այն սպառվել է, առաջնահերթություն տվեք հուսալիության աշխատանքին։ SLI-ները չափեք այնտեղ, որտեղ օգտատերերն են դրանք զգում (load balancer-ի վրա կամ synthetic check-երով), և alert-եր ուղարկեք budget-ի արագ «այրման» դեպքում, ոչ թե CPU-ի ամեն թռիչքի համար։

yaml
groups:
  - name: api-slo
    rules:
      - alert: ApiErrorBudgetFastBurn
        # 99.9% SLO: page if errors burn the budget 14.4x too fast
        expr: |
          (sum(rate(http_requests_total{job="api",status=~"5.."}[1h]))
            / sum(rate(http_requests_total{job="api"}[1h]))) > (14.4 * 0.001)
          and
          (sum(rate(http_requests_total{job="api",status=~"5.."}[5m]))
            / sum(rate(http_requests_total{job="api"}[5m]))) > (14.4 * 0.001)
        for: 2m
        labels:
          severity: page
        annotations:
          summary: "API is burning its 30-day error budget too fast"

02On-call և միջադեպերի արձագանք

On-call նշանակում է, որ ինչ-որ մեկը պատասխանատու է արձագանքելու համար, երբ production-ը կոտրվում է՝ հստակ հերթափոխով, էսկալացիայի ճանապարհով և բավարար հանգստով։ Դա աշխատում է միայն այն դեպքում, եթե alert-երը գործողության ենթակա են. յուրաքանչյուր page պետք է նշանակի օգտատիրոջ համար տեսանելի խնդիր, որին հիմա մարդ է պետք՝ dashboard-ի և runbook-ի հղումով։ Մնացած ամեն ինչ գնում է ticket-ների հերթ։ Երբ միջադեպը սկսվում է, հետևեք պարզ հաջորդականության։ Հաստատեք (acknowledge) alert-ը։ Գնահատեք ազդեցությունը և հայտարարեք severity-ն։ Բաշխեք դերերը. incident commander, որը համակարգում է, մեկը, որն անմիջականորեն աշխատում է, և մեկը, որը հաղորդակցվում է օգտատերերի ու շահագրգիռ կողմերի հետ։ Նախ մեղմացրեք. rollback արեք deploy-ը, fail over արեք, անջատեք feature flag-ը, scale up արեք կամ արգելափակեք չարաշահող տրաֆիկը։ Root cause-ը փնտրեք միայն այն ժամանակ, երբ օգտատերերն արդեն ապահով են։ Ընթացքում timeline պահեք մեկ ալիքում և կանոնավոր ռիթմով status update-ներ հրապարակեք, նույնիսկ եթե ոչինչ չի փոխվել։

  • Հայտնաբերել, հաստատել, գնահատել severity-ն, բաշխել դերերը։
  • Մեղմացրեք մինչև ախտորոշելը. rollback-ը հաճախ ամենաարագ լուծումն է։
  • Հաղորդակցվեք ժամանակացույցով. լռությունը միջադեպերն ավելի վատ է ցույց տալիս։
  • Փակեք ստուգումով, հետո պլանավորեք postmortem-ը։

03Runbook-եր և blameless postmortem-ներ

Runbook-ը կարճ, գործնական ուղեցույց է հայտնի իրավիճակի համար. «սկավառակը 90 տոկոսից բարձր է», «հերթի backlog-ը աճում է», «վերականգնել բազան որոշակի պահի դրությամբ»։ Այն թվարկում է ախտանիշները, ստուգվող dashboard-ները, անվտանգ ախտորոշիչ հրամանները, լուծումը և երբ էսկալացիա անել։ Լավ runbook-երը թույլ են տալիս գիշերվա 3-ին հոգնած ինժեներին ճիշտ գործել, և դրանք լուծումն ավտոմատացնելու առաջին քայլն են։ Ցանկացած նշանակալի միջադեպից հետո գրեք postmortem. ինչ է տեղի ունեցել, timeline-ը, ազդեցությունը, ինչպես է հայտնաբերվել և լուծվել, նպաստող գործոնները և կոնկրետ հետագա գործողությունները՝ պատասխանատուներով և ժամկետներով։ Պահեք այն blameless. հարցրեք, թե ինչու համակարգը թույլ տվեց սխալը, ոչ թե ով արեց այն, որովհետև մարդիկ թաքցնում են տեղեկատվությունը, երբ վախենում են մեղադրանքից։ Վերանայեք հետագա գործողությունները մինչև ավարտը. առանց կատարված գործողությունների postmortem-ը պարզապես պատմություն է։

04High availability vs disaster recovery. RPO և RTO

High availability-ն (HA) ծառայությունն աշխատեցնում է կոմպոնենտի ձախողման ժամանակ. հավելվածի մի քանի instance, failover-ի համար պատրաստ բազայի replica, պահուստային load balancer-ներ, health check-եր, որոնք տրաֆիկը շրջանցում են ձախողումներից։ Disaster recovery-ն (DR) վերադառնալու մասին է այն բանից հետո, ինչը HA-ն չի կարող կլանել. ամբողջ ռեգիոնի outage, տվյալների վնասում, ransomware, պատահական DROP TABLE, որն ակնթարթորեն replicate է լինում բոլոր replica-ներին։ Երկու թիվ է սահմանում DR-ը։ Recovery Point Objective-ը (RPO) այն է, թե որքան տվյալ կարող եք թույլ տալ կորցնել՝ չափված ժամանակով. ժամային backup-ները նշանակում են մինչև մեկ ժամի կորուստ։ Recovery Time Objective-ը (RTO) այն է, թե որքան ժամանակ կարող եք անջատված մնալ վերականգնման ընթացքում։ Ավելի փոքր թվերն ավելի թանկ են. շարունակական WAL archiving և point-in-time recovery՝ փոքր RPO-ի համար, warm standby ենթակառուցվածք՝ փոքր RTO-ի համար։ Backup-ները պահեք սերվերից դուրս, գաղտնագրված և version արված, և վերականգնեք դրանք ժամանակացույցով։

  • Replica-ները պաշտպանում են hardware-ի ձախողումից, ոչ թե վատ գրառումներից. դրանից պաշտպանում են backup-ները։
  • Հետևեք 3-2-1 սկզբունքին. երեք պատճեն, երկու կրիչ, մեկը՝ այլ վայրում։
  • Վերականգնման փորձը (restore drill) չափում է ձեր իրական RTO-ն։

05Chaos testing և ամենօրյա շահագործում

Chaos testing նշանակում է միտումնավոր ձախողումներ ներարկել՝ ստուգելու համար, որ համակարգը և թիմը սպասվածի պես են իրենց պահում։ Սկսեք փոքրից և անվտանգից. staging-ում սպանեք հավելվածի instance-ը, կանգնեցրեք Redis-ը, latency ավելացրեք վճարման API-ի mock-ին, լցրեք սկավառակը և տեսեք՝ արդյոք alert-երը գործարկվում են, retry-ները ճիշտ են աշխատում, և ծառայությունը նրբորեն է degrade լինում։ Game day-երը նույնն են անում մարդկանց հետ. փորձարկեք բազայի վերականգնում կամ failover՝ runbook-ը ձեռքին։ Ամենօրյա շահագործումն ավելի քիչ դրամատիկ է, բայց ավելի կարևոր. dashboard-ների և alert-ների վերանայում, անվտանգության թարմացումների կիրառում, սերտիֆիկատների և գաղտնիքների ռոտացիա, սկավառակի և բազայի աճի հետևում, backup job-երի և վերականգնման թեստերի ստուգում, լոգերի և հին build-երի մաքրում, դանդաղ query-ների tuning և կախվածությունների թարմ պահում։ Հետևեք toil-ին՝ կրկնվող ձեռքով աշխատանքին, և ավտոմատացրեք այն մասերը, որոնք ամեն շաբաթ վերադառնում են։

Օգտագործեք, երբ

  • Ցանկացած production ծառայություն՝ վճարող օգտատերերով կամ պայմանագրային պարտավորություններով։
  • Թիմեր, որոնք վիճում են՝ ֆունկցիաներ թողարկե՞լ, թե՞ կայունությունը շտկել. error budget-ը լուծում է այդ վեճը։
  • Համակարգեր, որոնք պահում են տվյալներ, որոնց վերստեղծումը թանկ կամ անհնար կլիներ։
  • Միգրացիաներից կամ ենթակառուցվածքային փոփոխություններից առաջ՝ ընդունելի ռիսկի շուրջ համաձայնվելու համար։

Մի՛ օգտագործեք, երբ

  • 99.99 տոկոս թիրախներ դնել ներքին գործիքի համար, որտեղ 99 տոկոսը միանգամայն բավարար է. ամեն լրացուցիչ «ինը» շատ թանկ արժե։
  • Ծանր գործընթացներ (միջադեպի դերեր, պաշտոնական review-ներ) հանգստյան օրերի prototype-ի համար։
  • Chaos փորձարկումներ production-ում, քանի դեռ չկան հիմնական monitoring և rollback։

Այլընտրանքներ

  • Միայն uptime check-եր

    Պարզ արտաքին monitor-ը լավ սկիզբ է փոքր կայքերի համար, բայց բաց է թողնում մասնակի ձախողումները։

  • Managed պլատֆորմներ

    PaaS-ը և managed բազաները հասանելիության և backup-ի աշխատանքի մի մասը փոխանցում են provider-ին։

  • ITIL-ի ոճի շահագործում

    Ավելի պաշտոնական change և incident management, տարածված խոշոր ընկերություններում։

  • Incident գործիքներ

    Paging և status-page ծառայությունները կառուցվածք են ավելացնում on-call-ին և հաղորդակցությանը։

Լավագույն պրակտիկաներ

  1. Սահմանեք մի քանի SLI օգտատիրոջ տեսանկյունից և դրեք իրատեսական SLO-ներ։
  2. Page արեք միայն գործողության ենթակա, օգտատիրոջ համար տեսանելի ախտանիշների դեպքում. մնացածն ուղարկեք ticket-ների։
  3. Յուրաքանչյուր alert կապեք dashboard-ի և runbook-ի հետ։
  4. Նախ մեղմացրեք, հետո ախտորոշեք. rollback-ը դարձրեք մեկ հրաման։
  5. Գրեք blameless postmortem-ներ՝ պատասխանատուներով և ժամկետներով գործողություններով։
  6. Backup-ները պահեք սերվերից դուրս և վերականգնումները թեստավորեք ժամանակացույցով։
  7. RPO-ի և RTO-ի շուրջ համաձայնվեք բիզնեսի հետ և backup-ները նախագծեք դրանց համապատասխանելու համար։

Տարածված սխալներ

  • Alert ամեն մետրիկի վրա, ինչը մարդկանց սովորեցնում է անտեսել page-երը։
  • Replica-ները համարել backup, հետո վատ delete-ը replicate անել ամենուր։
  • Երբեք չթեստավորել վերականգնումները և կոտրված backup-ը հայտնաբերել աղետի ժամանակ։
  • Մեկ ժամ live debug անել, երբ rollback-ը րոպեների ընթացքում կլուծեր օգտատերերի խնդիրը։
  • Գրել postmortem-ներ, որոնք մեղադրում են մարդուն և համակարգում ոչ մի փոփոխություն չեն բերում։

Խորը վերլուծություն

06Multi-window, multi-burn-rate alerting

Burn rate-ը ցույց է տալիս, թե որքան արագ ես ծախսում error budget-ը պլանի համեմատ․ 1 burn rate-ը ծախսում է ճիշտ բյուջեն SLO-ի պատուհանի ընթացքում, 14.4-ը 30-օրյա բյուջեն ծախսում է մոտ երկու օրում։ SRE Workbook-ը խորհուրդ է տալիս համադրել մի քանի շեմ, որոնցից յուրաքանչյուրը ստուգվում է երկար և կարճ պատուհանով։ Page արա, երբ ամսական բյուջեի 2 տոկոսը ծախսվում է մեկ ժամում (burn rate 14.4, հաստատված 5 րոպեի ընթացքում) կամ 5 տոկոսը՝ վեց ժամում (burn rate 6, հաստատված 30 րոպեի ընթացքում)։ Ticket բաց, երբ 10 տոկոսը ծախսվում է երեք օրում (burn rate 1, հաստատված 6 ժամի ընթացքում)։ Երկար պատուհանը տալիս է նշանակալիություն, որպեսզի կարճ «ցատկերը» page չանեն․ կարճ պատուհանը թույլ է տալիս alert-ին դադարել խնդրի շտկումից անմիջապես հետո։ Օգտագործիր recording rule-եր՝ յուրաքանչյուր պատուհանի համար սխալների հարաբերակցությունը նախապես հաշվարկելու համար, որպեսզի alert-ների գնահատումը էժան մնա։

yaml
groups:
  - name: api-slo-recordings
    rules:
      - record: job:slo_errors:ratio_rate5m
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[5m])) / sum(rate(http_requests_total{job="api"}[5m]))
      - record: job:slo_errors:ratio_rate1h
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[1h])) / sum(rate(http_requests_total{job="api"}[1h]))
      - record: job:slo_errors:ratio_rate30m
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[30m])) / sum(rate(http_requests_total{job="api"}[30m]))
      - record: job:slo_errors:ratio_rate6h
        expr: sum(rate(http_requests_total{job="api",status=~"5.."}[6h])) / sum(rate(http_requests_total{job="api"}[6h]))
  # Page: (1h > 14.4*0.001 and 5m > 14.4*0.001) or (6h > 6*0.001 and 30m > 6*0.001)

07SLI-ների ճիշտ ընտրություն․ latency-ի histogram-ներ և կախվածություններ

Լավ SLI-ները լավ իրադարձությունների և վավեր իրադարձությունների հարաբերակցություններ են՝ չափված որքան հնարավոր է մոտ օգտատերերին։ Latency-ի համար օգտագործիր histogram-ներ՝ bucket-ների սահմաններով քո շեմերի վրա, հետո SLI-ն սահմանիր որպես, ասենք, 300 ms-ից արագ հարցումների մասնաբաժին․ ինստանսների միջև միջինացված percentile-ները մաթեմատիկորեն սխալ են, իսկ bucket-ների քանակները ճիշտ են գումարվում։ Բացառիր այն, ինչը քո ձախողումը չէ (կլիենտի 4xx սխալներ, health check-եր), բայց խիստ եղիր այն ամենի նկատմամբ, ինչը քոնն է․ 200 պատասխանը սխալի էջով ձախողում է։ Հաշվի առ կախվածությունները․ եթե քո ծառայությանը սինխրոն պետք են երեք այլ ծառայություններ՝ յուրաքանչյուրը 99.9 տոկոսով, քո հասանելի availability-ն 99.9 տոկոսից ցածր է, եթե չավելացնես ռեդունդանտություն, քեշավորում կամ graceful degradation։ Քո SLO-ն պետք է թույլ լինի կոշտ կախվածությունների արտադրյալից, կամ դրանցից մի քանիսը պետք է հանես կրիտիկական ուղուց։

  • SLI = լավ իրադարձություններ / վավեր իրադարձություններ՝ սահող պատուհանում։
  • Latency SLI՝ histogram-ի bucket-ներից, ոչ թե միջինացված percentile-ներից։
  • Կոշտ կախվածությունները սահմանափակում են քո հասանելի SLO-ն։

08Անվտանգ փոփոխություն․ progressive delivery և արագ rollback

Ինցիդենտների մեծ մասն առաջանում է փոփոխություններից․ դեպլոյներ, կոնֆիգուրացիայի թարմացումներ, միգրացիաներ, սերտիֆիկատների կամ DNS-ի խմբագրումներ։ Նվազեցրու յուրաքանչյուր փոփոխության blast radius-ը։ Դեպլոյ արա աստիճանաբար․ նախ մեկ ինստանս կամ տրաֆիկի փոքր տոկոս (canary), համեմատիր դրա error rate-ը և latency-ն մնացածի հետ, հետո ընդլայնիր։ Կոդի դեպլոյը տարանջատիր ֆիչերի թողարկումից flag-երով, որպեսզի վատ ֆիչն անջատվի առանց վերադեպլոյի։ Տվյալների բազայի միգրացիաները դարձրու backward compatible, որպեսզի հավելվածի նախորդ տարբերակը դեռ աշխատի սխեմայի փոփոխությունից հետո․ դա rollback-ը հնարավոր է պահում։ Որտեղ հնարավոր է, ավտոմատացրու rollback-ը canary-ի ձախողման դեպքում։ Բիզնեսի պիկային իրադարձությունների շուրջ սառեցրու ռիսկային փոփոխությունները։ Հետևիր change failure rate-ին և վերականգնման ժամանակին․ դրանք ցույց են տալիս, թե արդյոք delivery-ն ավելի անվտանգ է դառնում, և հուսալիության շահույթների մեծ մասը գալիս է այստեղից, ոչ թե ավելի շատ սարքավորումներից։

09Backup-ներ, որոնք վերականգնվում են․ PITR, անփոփոխելիություն և վարժանքներ

PostgreSQL-ի համար point-in-time recovery-ն համադրում է պարբերական base backup-ը WAL սեգմենտների անընդհատ արխիվացման հետ, այնպես որ կարող ես վերականգնել ցանկացած պահի, օրինակ՝ պատահական DELETE-ից մեկ րոպե առաջ։ pgBackRest-ի և WAL-G-ի նման գործիքները կառավարում են սեղմումը, գաղտնագրումը, retention-ը և զուգահեռ վերականգնումը object storage-ից։ Backup-ները պաշտպանիր նույն սպառնալիքներից, ինչ պրոդակշնը․ օգտագործիր առանձին credentials, որոնք հավելվածի սերվերները չունեն, միացրու object versioning կամ object lock, որպեսզի ransomware-ը կամ կոտրված սերվերը չկարողանա դրանք ջնջել, և պատճենիր երկրորդ տարածաշրջան կամ provider։ Հետո չափիր։ Պլանավորված վարժանքը վերջին backup-ը վերականգնում է նոր սերվերի վրա, գործարկում ամբողջականության ստուգումներ և մի քանի հավելվածային հարցում և գրանցում, թե որքան ժամանակ տևեց։ Այդ տևողությունը քո իրական RTO-ն է․ վերականգնելի ամենանոր տվյալների տարիքը քո իրական RPO-ն է։

bash
# pgBackRest: full backup weekly, differential daily, WAL archived continuously
pgbackrest --stanza=main --type=full backup
pgbackrest --stanza=main --type=diff backup
pgbackrest --stanza=main info
 
# Restore to just before a bad DELETE (run on a fresh server)
pgbackrest --stanza=main --delta \
  --type=time "--target=2026-11-05 14:31:00+00" \
  --target-action=promote restore

Իրական իրավիճակներ

01

Թիմը խեղդվում է alert-ների մեջ

Խնդիր

On-call-ը շաբաթական ստանում է քառասուն page, հիմնականում CPU-ի, հիշողության և առանձին ձախողված health check-երի մասին, որոնք ինքնուրույն լուծվում են։ Իրական ինցիդենտները երկու անգամ բաց են թողնվել, որովհետև մարդիկ անջատել էին ծանուցումները։

Ինչպես լուծել

Աուդիտ արա մեկ ամսվա page-երը և յուրաքանչյուրը պիտակավորիր․ պահանջում էր գործողություն հիմա, գործողություն ավելի ուշ, թե գործողություն չէր պահանջում։ Վերջին երկու խմբի ամեն ինչ ջնջիր կամ իջեցրու ticket-ների կամ dashboard-ների։ Յուրաքանչյուր օգտատիրական ծառայության համար սահմանիր երկու-երեք SLI (success rate, latency) և պատճառի վրա հիմնված page-երը փոխարինիր multi-window burn-rate alert-ներով։ Պահանջիր, որ մնացած յուրաքանչյուր page հղում ունենա runbook-ի և dashboard-ի։ Page-երի ծավալը վերանայիր ամեն շաբաթ թիմի հանդիպմանը՝ թիրախով, օրինակ՝ առավելագույնը երկու page մեկ on-call հերթափոխի համար, և կրկնվող page-երը դիտարկիր որպես շտկման ենթակա bug-եր։

02

Պատահական DELETE պրոդակշնում

Խնդիր

Առանց WHERE պայմանի սպասարկման script-ը ջնջեց customers աղյուսակի տողերի մեծ մասը։ Ռեպլիկաները մեկ վայրկյանի ընթացքում կիրառեցին այն։

Ինչպես լուծել

Կանգնեցրու գրառումները, որոնք կարող են կառուցվել վնասի վրա, օրինակ՝ հավելվածը տուժած ֆիչերի համար դնելով maintenance ռեժիմի։ Մի վերականգնիր պրոդակշնի վրայից։ Վերջին base backup-ը գումարած WAL-ը վերականգնիր առանձին սերվերի վրա՝ DELETE-ից անմիջապես առաջ թիրախային ժամանակով, ստուգիր տվյալները, հետո բացակայող տողերը պատճենիր պրոդակշն INSERT ... SELECT-ով կամ այդ աղյուսակի dump-ով՝ համադրելով դրանից հետո ստեղծված տողերը։ Աշխատելու ընթացքում հաղորդիր ազդեցության մասին։ Postmortem-ում ավելացրու պաշտպանություններ․ script-ները գործարկվում են տրանզակցիաներում՝ տողերի քանակի ստուգումներով, իսկ պրոդակշնի հասանելիությունը՝ վերանայված ընթացակարգերով։

03

Հուսալիության թիրախների համաձայնեցում հաճախորդի հետ

Խնդիր

Հաճախորդը «հինգ ինը» է պահանջում ամրագրումների հարթակի համար, որը հոսթինգ է արված մեկ VPS-ի վրա՝ փոքր թիմով և ֆիքսված բյուջեով։

Ինչպես լուծել

Ինները թարգմանիր անհասանելիության ժամանակի և արժեքի․ 99.999 տոկոսը թույլ է տալիս ամսական մոտ 26 վայրկյան, ինչը պահանջում է multi-region ռեդունդանտություն և 24/7 անձնակազմ։ Հետո հարցրու, թե իրականում ինչն է վնասում բիզնեսին․ պիկային ժամերին ձախողված ամրագրումները, կորած տվյալները, թե դանդաղ էջերը։ Առաջարկիր SLO-ներ այդ հոսքերի համար, օրինակ՝ ամսական 99.9 տոկոս հաջող ամրագրումներ՝ հինգ րոպե RPO-ով և մեկ ժամ RTO-ով, և ցույց տուր, թե ինչ արժե յուրաքանչյուր հաջորդ քայլը (երկրորդ սերվեր, managed տվյալների բազա, on-call rotation)։ Համաձայնեցրեք error budget policy, որպեսզի երկու կողմերն էլ իմանան, թե ինչ է լինում, երբ այն սպառվում է։

Արագ ուղեցույց

Error budget-ի րոպեներ (30 օր)
99% = 432 րոպե, 99.9% = 43.2 րոպե, 99.95% = 21.6 րոպե, 99.99% = 4.3 րոպե
Fast-burn page
Burn rate 14.4՝ 1ժ-ում ԵՎ 5ր-ում (բյուջեի 2%)
Slow-burn page
Burn rate 6՝ 6ժ-ում ԵՎ 30ր-ում (բյուջեի 5%)
Ticket, ոչ թե page
Burn rate 1՝ 3օ-ում ԵՎ 6ժ-ում (բյուջեի 10%)
Burn rate
դիտարկված սխալների հարաբերակցություն / (1 - SLO)
Ստուգել backup-ները
pgbackrest --stanza=main info
Point-in-time վերականգնում
pgbackrest --stanza=main --type=time "--target=..." restore
Ինցիդենտի դերեր
Incident commander, operations lead, communications lead
Postmortem-ում պարտադիր է
Ժամանակագրություն, ազդեցություն, նպաստող գործոններ, պատասխանատուով և ժամկետով գործողություններ

Իմ իրական նախագծերում

  • POS SaaS-ի սերվերը աշխատեցնում է Prometheus, Grafana և Loki observability stack՝ health check-երով, runbook-երով և backup script-երով Docker Compose deployment-ի կողքին։
  • Յուրաքանչյուր սերվերի իմ բազային մակարդակը ներառում է snapshot-ներ գումարած թեստավորված վերականգնումներ, և սկավառակի, բեռնվածության ու uptime-ի monitoring Uptime Kuma-ի կամ provider-ի alert-երի միջոցով։
  • Production-ի խնդիրները նախ ախտորոշում եմ read-only ռեժիմով, լոգերից, մինչև որևէ բան փոխելը. այդպես եմ շտկել localization middleware-ի բագը, պատկերների փոխարկման բագը և cache-permission սխալը։
  • Սերվերների համախմբման ժամանակ հետևում եմ հաջորդականությանը՝ inventory, պատճենում, ստուգում, DNS-ի փոխարկում, և հին սերվերը պահում եմ, մինչև ամեն ինչ ստուգված լինի. մի սերվերում սկավառակի օգտագործումը 91%-ից իջեցրի 66%-ի։

Հարցեր և պատասխաններ

Q1Ո՞րն է տարբերությունը SLO-ի և SLA-ի միջև։

SLO-ն ներքին հուսալիության թիրախ է չափվող ցուցանիշի համար, օրինակ՝ API request-ների 99.9 տոկոսը հաջողվում է 30 օրվա ընթացքում։ Այն ուղղորդում է ինժեներական որոշումները։ SLA-ն արտաքին պայմանագիր է, որը խոստանում է ծառայության որոշակի մակարդակ և սահմանում հետևանքներ, սովորաբար service credit-ներ, եթե այն չեք պահպանում։ SLA-ն պետք է ավելի մեղմ լինի, քան SLO-ն, որպեսզի խնդիրը տեսնեք ներսում և արձագանքեք նախքան հաճախորդներին որևէ բան պարտք լինելը։ Երկուսն էլ կախված են SLI-ներից՝ իրական չափումներից, որոնք պետք է արտացոլեն օգտատերերի փորձառությունը, օրինակ՝ հաջողության տոկոսը և latency-ն edge-ում, այլ ոչ թե սերվերի CPU-ն։

Q2Ի՞նչ է error budget-ը, և ինչպե՞ս եք այն օգտագործում։

Դա անհուսալիության այն քանակն է, որը թույլ է տալիս ձեր SLO-ն։ Ամսական 99.9 տոկոս հասանելիության թիրախը թույլ է տալիս մոտ 43 րոպե ձախողում 30 օրում։ Budget-ը հուսալիությունը վերածում է համատեղ որոշման. քանի դեռ budget-ը մնում է, թիմը թողարկում է ֆունկցիաներ և ողջամիտ ռիսկեր է վերցնում. երբ այն գրեթե սպառված է, թիմը դանդաղեցնում է release-ները և առաջնահերթություն տալիս կայունության աշխատանքին, օրինակ՝ անկայուն կախվածությունների շտկմանը կամ rollback-ների բարելավմանը։ Այն նաև ուղղորդում է alerting-ը. սխալների հում քանակի վրա page անելու փոխարեն page եք անում, երբ budget-ը այնքան արագ է այրվում, որ շուտով կսպառվի, ինչը զգալիորեն կրճատում է աղմուկը։

Q3Պատմեք, թե ինչպես եք վարվում production միջադեպի ժամանակ։

Նախ հաստատում եմ alert-ը և ստուգում ազդեցությունը. որ օգտատերերը, որ ֆունկցիաները, երբվանից։ Հայտարարում եմ severity-ն և, եթե լուրջ է, բաժանում եմ դերերը, որպեսզի մի մարդ համակարգի և հաղորդակցվի, իսկ մյուսներն անմիջականորեն աշխատեն։ Մեղմացումը գալիս է root cause-ից առաջ. rollback անել վերջին deploy-ը, անջատել feature flag-ը, fail over կամ scale up անել՝ ինչն էլ ամենաարագն է վերականգնում ծառայությունը։ Timeline պահում եմ մեկ ալիքում և կանոնավոր update-ներ ուղարկում շահագրգիռ կողմերին։ Կայունանալուց հետո ստուգում եմ մետրիկաներով, փակում միջադեպը և պլանավորում blameless postmortem՝ կոնկրետ գործողություններով, պատասխանատուներով և ժամկետներով։

Q4Բացատրեք RPO-ն և RTO-ն օրինակով։

RPO-ն՝ recovery point objective-ը, այն է, թե որքան տվյալների կորուստ է ընդունելի՝ արտահայտված ժամանակով։ RTO-ն՝ recovery time objective-ը, այն է, թե որքան ժամանակ կարող է ծառայությունն անջատված լինել, մինչ վերականգնում եք։ Եթե խանութը backup է անում միայն գիշերը, նրա RPO-ն մինչև 24 ժամ է. երեկոյան ձախողումը կորցնում է ամբողջ օրվա պատվերները։ Շարունակական WAL archiving-ով և point-in-time recovery-ով RPO-ն իջնում է րոպեների։ Եթե 200 GB բազան նոր սերվերի վրա վերականգնելը երեք ժամ է տևում, դա է RTO-ն, եթե warm standby չեք պահում։ Թիրախները դնում է բիզնեսը, ինժեներիան գնահատում է դրանց արժեքը։

Q5Ո՞րն է տարբերությունը high availability-ի և disaster recovery-ի միջև։

High availability-ն ծառայությունն աշխատեցնում է կոմպոնենտների սովորական ձախողումների ժամանակ. հավելվածի մի քանի instance load balancer-ի հետևում, standby բազա, որն ավտոմատ ստանձնում է աշխատանքը, պահուստային ցանց։ Իդեալում օգտատերերը ոչինչ չեն նկատում։ Disaster recovery-ն ընդգրկում է իրադարձություններ, որոնք HA-ն չի կարող կլանել. ամբողջ data center-ի կորուստ, տվյալների վնասում, ransomware կամ վատ միգրացիա, որն ակնթարթորեն replicate է լինում բոլոր replica-ներին։ HA-ն իրական ժամանակում ավելորդության (redundancy) մասին է. DR-ը անկախ պատճեններից վերականգնելու մասին է՝ սահմանված RPO-ով և RTO-ով։ Ձեզ երկուսն էլ պետք են, որովհետև կատարյալ replicate արված բազան սիրով կ replicate անի նաև սխալմամբ արված DELETE-ը։

Q6Ի՞նչն է լավ alert-ը դարձնում լավ։

Լավ alert-ը գործողության ենթակա է, հրատապ և կապված է օգտատիրոջ վրա ազդեցության հետ։ Այն գործարկվում է ախտանիշի վրա, որը օգտատերերը զգում են, օրինակ՝ սխալների աճող տոկոս, դանդաղ checkout-ներ կամ SLO-ի այրում, ոչ թե պատճառի վրա, որը կարող է անվնաս լինել, օրինակ՝ CPU-ն 80 տոկոսի վրա։ Այն ունի հստակ վերնագիր, ասում է, թե որքան վատ է վիճակը, հղում է համապատասխան dashboard-ին և runbook-ին և գնում է ճիշտ մարդուն։ Եթե alert-ը կանոնավոր գործարկվում է, առանց որ որևէ մեկին գործել պետք լինի, այն պետք է tuning արվի, իջեցվի ticket-ի մակարդակի կամ ջնջվի։ Աղմկոտ alerting-ը վտանգավոր է, որովհետև մարդիկ սովորում են անտեսել page-երը, այդ թվում՝ իրականը։

Սենիոր մակարդակի հարցեր

S1Ինչպե՞ս կգրեիր error budget policy, և ի՞նչ է տեղի ունենում, երբ այն սպառվում է։

Policy-ն կարճ փաստաթուղթ է, որը նախապես համաձայնեցնում են ինժեներիան և պրոդուկտը, որպեսզի ճնշման տակ որոշումները չիմպրովիզացվեն։ Այն նշում է SLO-ները, պատուհանը և թե ում են դրանք պատկանում։ Այն սահմանում է շեմեր․ երբ բյուջեն առողջ է՝ սովորական թողարկումներ, երբ պատուհանի սկզբում կեսից ավելին ծախսված է՝ լրացուցիչ review ռիսկային փոփոխությունների համար, երբ սպառված է՝ ֆիչերի սառեցում այդ ծառայության համար, բացառությամբ հուսալիության շտկումների և անվտանգության patch-երի, մինչև սահող պատուհանը վերականգնվի։ Այն թվարկում է բացառություններ, օրինակ՝ կախվածության պատճառած անհասանելիություն, որը ծածկված է իր սեփական SLO-ով, և escalation-ի ուղի, եթե թիմերը համաձայն չեն։ Փոխզիջումը բացահայտ է․ պրոդուկտն ընդունում է ավելի դանդաղ delivery անհուսալիությունից հետո, ինժեներիան ընդունում է արագ թողարկել, քանի դեռ բյուջեն թույլ է տալիս, և երկուսն էլ օգտագործում են նույն թվերը։

S2Ինչպե՞ս ես նախագծում տարածաշրջանի կամ provider-ի խափանման համար համեստ բյուջեով։

Սկսիր RPO-ից և RTO-ից, ոչ թե ճարտարապետությունից։ Եթե բիզնեսն ընդունում է մեկ ժամ անհասանելիություն և մի քանի րոպեի տվյալների կորուստ, ամբողջական active-active կարգավորումն անհարկի է։ Ծախսարդյունավետ պատերն է pilot light-ը․ WAL-ի անընդհատ արխիվացում և object storage-ի ռեպլիկացիա երկրորդ տարածաշրջան կամ provider, ինֆրաստրուկտուրա՝ սահմանված որպես կոդ, container image-ներ registry-ում, որը հասանելի է երկու կողմից էլ, և DNS՝ ցածր TTL-ով։ Այդ դեպքում failover-ը նշանակում է սերվերների provisioning կոդից, տվյալների բազայի վերականգնում վերջին կետին և DNS-ի փոխարկում։ Փորձիր սա տարին երկու անգամ և չափիր ժամանակը։ Warm standby-ը գործող ռեպլիկայով RTO-ն կրճատում է մինչև րոպեներ՝ ավելի բարձր գնով․ active-active-ն էլ ավելի է կրճատում, բայց ստիպում է լուծել multi-region գրառումների խնդիրը, ինչը մեծ և մշտական բարդություն է։

S3Ինչպիսի՞ն է ինցիդենտների վերանայման հասուն գործընթացը postmortem փաստաթղթից դուրս։

Դա ուսուցման ցիկլ է, ոչ թե թղթաբանություն։ Ինցիդենտները հայտարարվում են առատորեն և էժան, որպեսզի փոքրերն էլ գրանցվեն։ Վերանայումները տեղի են ունենում օրերի ընթացքում, քանի դեռ հիշողությունը թարմ է, ֆասիլիտատորի հետ, որը ներգրավված չի եղել, և կենտրոնանում են այն բանի վրա, թե ինչպես էր իրավիճակը իմաստավորվում մարդկանց համար այդ պահին, և որ ազդանշաններն էին բացակայում։ Գործողությունները քիչ են, կոնկրետ և ունեն պատասխանատու, առաջնահերթություն են ստանում սովորական պլանավորման մեջ և հետևվում են մինչև ավարտ՝ ուշացած տարրերի կանոնավոր հաշվետվությամբ։ Ինցիդենտների միջև պատերնները վերանայվում են եռամսյակը մեկ․ կրկնվող պատճառներ, դանդաղ հայտնաբերում, ցավոտ runbook-եր։ Time to detect-ի, time to mitigate-ի և կրկնվող ինցիդենտների նման մետրիկաները ցույց են տալիս, թե արդյոք ցիկլն աշխատում է։ Փոխզիջումը վերանայումների վրա ծախսված ինժեներական ժամանակն է, որը փոխհատուցվում է՝ կանխելով նույն խափանման կրկնությունը։

Բառարան

SLI
Օգտատիրական փորձի չափվող ցուցանիշ, օրինակ՝ արագ և հաջող հարցումների մասնաբաժինը։
SLO
SLI-ի ներքին թիրախ ժամանակային պատուհանում, օրինակ՝ 99.9 տոկոս 30 օրվա ընթացքում։
Error budget
Ձախողման այն քանակը, որը թույլ է տալիս SLO-ն և որն օգտագործվում է ռիսկը և ֆիչերի աշխատանքը հավասարակշռելու համար։
Burn rate
Որքան արագ է ծախսվում error budget-ը հավասարաչափ տեմպի համեմատ։
MTTR
Mean time to restore․ միջինում որքան ժամանակ է պահանջվում ձախողումից հետո ծառայությունը վերականգնելու համար։
Canary release
Տրաֆիկի փոքր մասի ուղարկում նոր տարբերակին՝ մինչև այն ամբողջությամբ թողարկելը։
PITR
Point-in-time recovery․ տվյալների բազայի վերականգնում ճշգրիտ պահի՝ backup-ների և լոգերի միջոցով։
Toil
Ձեռքով արվող, կրկնվող օպերացիոն աշխատանք, որը աճում է բեռի հետ և կարող է ավտոմատացվել։
Game day
Պլանավորված վարժանք, որտեղ թիմը փորձում է արձագանքել սիմուլյացված ձախողմանը։

Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։

Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։