ЁЯФв рдзрдбрд╛ 09 тАФ Reliability math: рд╕рд╛рдЦрд│реНрдпрд╛, рдкреНрд░рддреА рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ nine рдЪреА рдХрд┐рдВрдордд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреЗ: lesson-08-incident-command ┬╖ рдкреБрдвреЗ: lesson-10-overload
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рднрд╛рдЧ 3 рд╕реБрд░реВ рд╣реЛрддреЛ: рдЕрдкрдпрд╢ рдЧреГрд╣реАрдд рдзрд░реВрди design. рдХрд╛рд╣реАрд╣реА рдмрд╛рдВрдзрдгреНрдпрд╛рдЖрдзреА рдЧрдгрд┐рдд рдХрд░рд╛. рд░рд╛рдВрдЧреЗрддреАрд▓
(serial) рднрд╛рдЧ рддреНрдпрд╛рдВрдЪреА availability рдЧреБрдгрд╛рдХрд╛рд░рд╛рдиреЗ рдХрдореА рдХрд░рддрд╛рдд; рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рддреА (parallel)
nines рд╡рд╛рдврд╡рддрд╛рдд. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЬрд╛рд╕реНрддреАрдЪрд╛ nine рджрд╣рд╛рдкрдЯ рдХрдореА downtime рдареЗрд╡рддреЛ тАФ рд▓рд╡рдХрд░рдЪ рддреЛ рдПрдЦрд╛рджреНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛
рдкреНрд░рддрд┐рд╕рд╛рдж рджреНрдпрд╛рдпрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рд╡реЗрд│реЗрдкреЗрдХреНрд╖рд╛рд╣реА рдХрдореА рд╣реЛрддреЛ. sre/design.py рдордзреАрд▓ serial, parallel рдЖрдгрд┐ downtime
рдЖрдгрд┐ sre/demo.py рдордзреАрд▓ nines().
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрд▓рд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рд░рд╛рдВрдЧреЗрддреАрд▓ рддреАрди рджрд╛рд░рд╛рдВрддреВрди рдЬрд╛рддреЗ: рдлрд╛рдЯрдХ, рд╕рднрд╛рдЧреГрд╣рд╛рдЪреЗ рджрд╛рд░ рдЖрдгрд┐ office рдЪреЗ рджрд╛рд░. ЁЯЪкЁЯЪкЁЯЪк рдХреЛрдгрддреЗрд╣реА рдПрдХ рджрд╛рд░ рдЕрдбрдХрд▓реЗ, рддрд░ рддреА рдЖрдд рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА.
рдлрд╛рдЯрдХ 99.99% рд╡реЗрд│ рдЪрд╛рд▓рддреЗ, рд╕рднрд╛рдЧреГрд╣рд╛рдЪреЗ рджрд╛рд░ 99.95%, office рдЪреЗ рджрд╛рд░ 99.9%. рддрд┐рдиреНрд╣реА рдорд┐рд│реВрди? рддреБрдореНрд╣реА рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рддрд╛: 99.84%. рд╣реЗ рд╕рд░реНрд╡рд╛рдд рд╡рд╛рдИрдЯ рджрд╛рд░рд╛рдкреЗрдХреНрд╖рд╛рд╣реА рд╡рд╛рдИрдЯ рдЖрд╣реЗ. рддреБрдореНрд╣реА рдЬреЛрдбрд▓реЗрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд░ рдкреНрд░рд╡рд╛рд╕ рдХрдореА рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдХрд░рддреЗ.
рдЖрддрд╛ рдкрдердХ рдкрд╣рд┐рд▓реНрдпрд╛ рджрд╛рд░рд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рд╢реЗрдЬрд╛рд░реА office рдЪреЗ рджреБрд╕рд░реЗ рджрд╛рд░ рдмрд╛рдВрдзрддреЗ. рдПрдХ рдЕрдбрдХрд▓реЗ, рддрд░ рддреБрдореНрд╣реА рджреБрд╕рд░реЗ рд╡рд╛рдкрд░рддрд╛. рджреЛрдиреНрд╣реА рдПрдХрд╛рдЪ рдХреНрд╖рдгреА рдЕрдбрдХрд▓реА рддрд░рдЪ рджреЛрдиреНрд╣реА рдмрдВрдж тАФ рдЖрдгрд┐ рд╣реЗ рдлрд╛рд░ рдХреНрд╡рдЪрд┐рдд рдШрдбрддреЗ (рдЬреЛрдкрд░реНрдпрдВрдд рддреНрдпрд╛рдВрдирд╛ рдПрдХрдЪ рдХреБрд▓реВрдк рдирд╛рд╣реА!). Office 99.9999% рд╣реЛрддреЗ, рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рд╡рд╛рд╕ 99.94% рд╣реЛрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
u["ЁЯСйтАНЁЯОУ pupil"] --> g["gateway<br/>99.99%"] --> a["timetable app<br/>99.95%"] --> d["database<br/>99.9%"]
d --> r1["serial: 99.84%<br/>14.0 h a year"]
a --> d1["db copy 1<br/>99.9%"]
a --> d2["db copy 2<br/>99.9%"]
d1 & d2 --> r2["parallel: 99.9999%<br/>chain 99.94%"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l09
тЭУ рдХрд╛рдп
- Availability тАФ service рдЪрд╛рд▓реВ рдЕрд╕рдгреНрдпрд╛рдЪрд╛ рд╡реЗрд│реЗрддреАрд▓ (рдХрд┐рдВрд╡рд╛ requests рдордзреАрд▓) рд╡рд╛рдЯрд╛. рдПрдХ "nine" рдореНрд╣рдгрдЬреЗ рдПрдХ рдЕрдВрдХ: 99% рдореНрд╣рдгрдЬреЗ рджреЛрди nines, 99.9% рддреАрди, 99.99% рдЪрд╛рд░.
- Serial (рд╕рд╛рдЦрд│реАрдд) тАФ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдЖрд╡рд╢реНрдпрдХ:
A = a1 ├Ч a2 ├Ч a3. рд╕рд╛рдЦрд│реА рдиреЗрд╣рдореА рддрд┐рдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдХрдордХреБрд╡рдд рднрд╛рдЧрд╛рдкреЗрдХреНрд╖рд╛ рд╡рд╛рдИрдЯ рдЕрд╕рддреЗ. рдкреНрд░рддреНрдпреЗрдХреА 99.9% рдЕрд╕рд▓реЗрд▓реНрдпрд╛ 10 services рдирд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рдгрд╛рд░реА request рд╕рд╛рдзрд╛рд░рдг 99.0% рдорд┐рд│рд╡рддреЗ. - Parallel (redundant рдкреНрд░рддреА) тАФ рдХреЛрдгрддреАрд╣реА рдПрдХ рдкреНрд░рдд рдкреБрд░реЗрд╢реА:
A = 1 тИТ (1 тИТ a)тБ┐. 99.9% рдЪреНрдпрд╛ рджреЛрди рдкреНрд░рддреА 99.9999% рджреЗрддрд╛рдд, рдЬрд░ рддреНрдпрд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдмрд┐рдШрдбрдд рдЕрд╕рддреАрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ switch рдЪрд╛рд▓рдд рдЕрд╕реЗрд▓ рддрд░. - Independence (рд╕реНрд╡рд╛рддрдВрддреНрд░реНрдп) тАФ рдореЛрдареЗ рдЧреГрд╣реАрддрдХ. рдПрдХрд╛рдЪ rack, zone, region рдордзреАрд▓, рдХрд┐рдВрд╡рд╛ рдПрдХрд╛рдЪ config рдЖрдгрд┐ рдПрдХрд╛рдЪ bug рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рджреЛрди рдкреНрд░рддреА рдПрдХрддреНрд░ рдмрд┐рдШрдбрддрд╛рдд. рдкрд░рд╕реНрдкрд░рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдШрд╛рдбрд╛рдВрдореБрд│реЗрдЪ рдЦрд▒реНрдпрд╛ systems рд╕реВрддреНрд░рд╛рддреАрд▓ рдЖрдХрдбреНрдпрд╛рдкрд░реНрдпрдВрдд рдХреНрд╡рдЪрд┐рддрдЪ рдкреЛрд╣реЛрдЪрддрд╛рдд. рд╕реВрддреНрд░рд╛рд▓рд╛ рдХрдорд╛рд▓ рдорд░реНрдпрд╛рджрд╛ рд╕рдордЬрд╛.
- Failover рд╕реНрд╡рддрдГ тАФ рджреБрд╕рд▒реНрдпрд╛ рдкреНрд░рддреАрдХрдбреЗ switch рдХрд░рд╛рдпрд▓рд╛ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ рдЖрдгрд┐ рддреЗ рдЕрдпрд╢рд╕реНрд╡реАрд╣реА рд╣реЛрдК рд╢рдХрддреЗ; рд╕реВрддреНрд░ рддреЗ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдд рдирд╛рд╣реА.
- рдкреНрд░рддреНрдпреЗрдХ nine рдорд╛рдЧреЗ downtime тАФ рдПрдХрд╛ рд╡рд░реНрд╖рд╛рдд: 99% тЙИ 87.6 h, 99.9% тЙИ 8.76 h, 99.95% тЙИ 4.38 h, 99.99% тЙИ 52.6 min, 99.999% тЙИ 5.3 min. 28 рджрд┐рд╡рд╕рд╛рдВрдЪреНрдпрд╛ window рдордзреНрдпреЗ 99.99% рдлрдХреНрдд 4.0 рдорд┐рдирд┐рдЯреЗ рджреЗрддреЗ.
- рдкреНрд░рддреНрдпреЗрдХ nine рдЪреА рдХрд┐рдВрдордд тАФ рдкреНрд░рддреНрдпреЗрдХ рдЬрд╛рд╕реНрддреАрдЪрд╛ nine рдореНрд╣рдгрдЬреЗ 10 ├Ч рдХрдореА downtime, рдЖрдгрд┐ рддреНрдпрд╛рд╕рд╛рдареА рд╕рд╣рд╕рд╛ рдЬрд╛рд╕реНрдд рдореЗрд╣рдирдд рдирд╛рд╣реА рддрд░ рд╡реЗрдЧрд│реЗ design рд▓рд╛рдЧрддреЗ: multi-zone, рдордЧ automatic failover, рдордЧ multi-region, рдордЧ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдЪрд╛ automatic rollback. рдЪрд╛рд░ nines рд╡рд░ budget рд╣реЗ page рдЖрд▓реЗрд▓реНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛ рдЙрдареВрди login рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рд╡реЗрд│реЗрдкреЗрдХреНрд╖рд╛ рдХрдореА рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди recovery automatic рдЕрд╕рд╛рдпрд▓рд╛рдЪ рд╣рд╡реА.
- Dependencies рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓рддрд╛рдд тАФ service рдкреНрд░рддреНрдпреЗрдХ request рд╡рд░ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ hard dependency рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд available рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА, рдЬреЛрдкрд░реНрдпрдВрдд рддреА рддрд┐рдЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХрд╛рдо рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА (cache, default, graceful degradation тАФ рдзрдбрд╛ 10).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг SLOs (рдзрдбрд╛ 02) рд╣реА рд╡рдЪрдиреЗ рдЖрд╣реЗрдд, рдЖрдгрд┐ рд╡рдЪрди рджреЗрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА рддреЗ рд╢рдХреНрдп рддрд░реА рдЖрд╣реЗ рдХрд╛ рд╣реЗ рдЕрд╕реЗ рддрдкрд╛рд╕рддрд╛рдд. рдЧреБрдгрд╛рдХрд╛рд░рд╛рдиреЗ 99.84% рд╣реЛрдгрд╛рд▒реНрдпрд╛ рд╕рд╛рдЦрд│реАрд╡рд░ 99.9% SLO рдореНрд╣рдгрдЬреЗ design рдкрд╛рд│реВ рд╢рдХрдд рдирд╛рд╣реА рдЕрд╕реЗ рд╡рдЪрди тАФ рдзрдбрд╛ 12 рдЪрд╛ рдЖрдврд╛рд╡рд╛ рддреЗ рдЕрдбрд╡реЗрд▓. рдЖрдгрд┐ downtime рдЪреЗ table рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рдХреА рдкрд╛рдЪрд╡рд╛ nine рдЗрддрдХрд╛ рдорд╣рд╛рдЧ рдХрд╛ рдЖрд╣реЗ: рддреЗ "рдЬрд╛рд╕реНрдд рдореЗрд╣рдирдд рдХрд░рд╛" рдирд╛рд╣реА, рддреЗ "loop рдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА рдорд╛рдгреВрд╕ рдирд╛рд╣реА" рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/design.py рдордзреНрдпреЗ: serial(avails) рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рддреЗ, parallel(a, n)
1 тИТ (1 тИТ a)тБ┐ рдкрд░рдд рджреЗрддреЗ, рдЖрдгрд┐ downtime(avail, period_h) рдПрдЦрд╛рджреНрдпрд╛ рдХрд╛рд▓рд╛рд╡рдзреАрдд рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓реА downtime рдЪреА рдорд┐рдирд┐рдЯреЗ
рдкрд░рдд рджреЗрддреЗ. sre/demo.py рдордзреАрд▓ nines() рд╕рд╛рдЦрд│реА, рджреБрд╕рд░реА database
рдкреНрд░рдд рдЖрдгрд┐ table рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py nines
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from design import serial, parallel, downtime
for n in (1, 2, 3):
print(f"{n} app cop{'y' if n == 1 else 'ies'} at 99.5% тЖТ {parallel(0.995, n):.5%}")
for parts in (3, 10, 30):
a = serial([0.999] * parts)
print(f"{parts:>2} services in a row, each 99.9% тЖТ {a:.2%} ┬╖ {downtime(a, 24 * 28):6.0f} min down in 28 days")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
nines рд╣реЗ рдЫрд╛рдкрддреЗ:
тФАтФА a request needs all three: gateway 99.99% ├Ч timetable app 99.95% ├Ч database 99.90% = 99.840%
the chain is worse than its weakest part: 14.0 h a year of downtime allowed by the math
two independent database copies: 1 тИТ (1 тИТ 0.999)┬▓ = 99.9999% тЖТ chain 99.940%
99% тЖТ 87.60 h a year ┬╖ 403.2 min in 28 days
99.9% тЖТ 8.76 h a year ┬╖ 40.3 min in 28 days
99.95% тЖТ 4.38 h a year ┬╖ 20.2 min in 28 days
99.99% тЖТ 0.88 h a year ┬╖ 4.0 min in 28 days
99.999% тЖТ 0.09 h a year ┬╖ 0.4 min in 28 days
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
1 app copy at 99.5% тЖТ 99.50000%
2 app copies at 99.5% тЖТ 99.99750%
3 app copies at 99.5% тЖТ 99.99999%
3 services in a row, each 99.9% тЖТ 99.70% ┬╖ 121 min down in 28 days
10 services in a row, each 99.9% тЖТ 99.00% ┬╖ 401 min down in 28 days
30 services in a row, each 99.9% тЖТ 97.04% ┬╖ 1192 min down in 28 days
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рд░рд╛рдВрдЧреЗрддреАрд▓ рддреАрди рдЪрд╛рдВрдЧрд▓реЗ рднрд╛рдЧ (99.84%) 99.9% SLO рдкреВрд░реНрдг рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд тАФ code рдЪреА рдПрдХ рдУрд│ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЖрдзреАрдЪ design рдЪреБрдХрд▓реЗрд▓реЗ рдЖрд╣реЗ. рджреБрд╕рд▒реНрдпрд╛, рд╕реНрд╡рддрдВрддреНрд░ database рдкреНрд░рддреАрдиреЗ рддреЗ рджреБрд░реБрд╕реНрдд рдЭрд╛рд▓реЗ (99.94%). 99.5% рдЪреНрдпрд╛ рджреЛрди рд╕реНрд╡рд╕реНрдд рдкреНрд░рддреА рдПрдХрд╛ рдорд╣рд╛рдЧ 99.9% рднрд╛рдЧрд╛рдкреЗрдХреНрд╖рд╛ рд╕рд░рд╕ рдард░рддрд╛рдд тАФ рдЬрд░ рддреНрдпрд╛ рдЦрд░реЛрдЦрд░ рд╕реНрд╡рддрдВрддреНрд░ рдЕрд╕рддреАрд▓. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХреА рддреАрди nines рдЕрд╕рд▓реЗрд▓реНрдпрд╛ 30 services рдордзреВрди рдкрд╕рд░рдгрд╛рд░реА request рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ рд╕рд╛рдзрд╛рд░рдг 20 рддрд╛рд╕ рдмрдВрдж рдЕрд╕рддреЗ: рдореНрд╣рдгреВрдирдЪ рдЦреЛрд▓ call chains рдирд╛ timeouts, fallbacks рдЖрдгрд┐ рдХрдореА hard dependencies рд▓рд╛рдЧрддрд╛рдд.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- availabilities рдЪрд╛ рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдмреЗрд░реАрдЬ рдХрд░рдгреЗ
- рдПрдХрд╛рдЪ zone рдордзреАрд▓ (рдХрд┐рдВрд╡рд╛ рдПрдХрд╛рдЪ config push рдЕрд╕рд▓реЗрд▓реНрдпрд╛) рджреЛрди рдкреНрд░рддреАрдВрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рдорд╛рдирдгреЗ
- failover рд╡рд┐рд╕рд░рдгреЗ: рдЬреНрдпрд╛ рдкреНрд░рддреАрдХрдбреЗ рдХреЛрдгреА switch рдХрд░рдд рдирд╛рд╣реА, рддреА рдХрд╛рд╣реАрдЪ рд╡рд╛рдврд╡рдд рдирд╛рд╣реА
- fallback рд╢рд┐рд╡рд╛рдп, hard dependency рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд SLO рдЪреЗ рд╡рдЪрди рджреЗрдгреЗ
- рдЬреНрдпрд╛ service рдЪреЗ users рд╕рд╛рдбреЗрддреАрди nines рд╕реБрджреНрдзрд╛ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгрд╛рд░ рдирд╛рд╣реАрдд, рддрд┐рдЪреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЪ nines рдорд╛рдЧрдгреЗ
- provider рдЪрд╛ SLA рддреНрдпрд╛рдЪреА рдЦрд░реА availability рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдгреЗ тАФ SLA рдореНрд╣рдгрдЬреЗ рдкреИрд╕реЗ рдкрд░рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡рдЪрди, рдореЛрдЬрдорд╛рдк рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Request рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ hard dependency рдЪреА рдпрд╛рджреА рдХрд░рд╛, рддрд┐рдЪреНрдпрд╛ рдореЛрдЬрд▓реЗрд▓реНрдпрд╛ availability рд╕рд╣ (рддрд┐рдЪрд╛ SLA рдирд╛рд╣реА). рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ Prometheus рдордзреВрди, 28 рджрд┐рд╡рд╕рд╛рдВрддреАрд▓ database рд▓рд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ calls рдЪреЗ success ratio (metric рдЖрдгрд┐ label рдЪреА рдирд╛рд╡реЗ рддреБрдордЪреА):
curl -s http://prometheus:9090/api/v1/query --data-urlencode \
'query=sum(increase(db_client_requests_total{outcome="success"}[28d])) / sum(increase(db_client_requests_total[28d]))' \
| jq -r '.data.result[0].value[1]'
рдордЧ service repo рдордзреНрдпреЗ SLO рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рд╕рд╛рдЦрд│реА рд▓рд┐рд╣реВрди рдареЗрд╡рд╛:
slo: 99.9
hard_dependencies: # measured over the last 28 days
gateway: 99.99
timetable-app: 99.95
database: 99.9 # тЖТ add a replica in another zone with automatic failover
chain_ceiling: 99.84 # serial product тАФ below the SLO: must fix
soft_dependencies: [recommendations, photos] # have fallbacks, not in the chain
рд╕реНрд╡рд╛рддрдВрддреНрд░реНрдп design рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ: рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ zones рдордзреАрд▓ рдкреНрд░рддреА (рдзрдбрд╛ 07 рдЪрд╛ topology spread), рд╡реАрдЬ рдЖрдгрд┐ network рд╕рд╛рдареА рд╡реЗрдЧрд╡реЗрдЧрд│реЗ failure domains, рдЖрдгрд┐ рдЯрдкреНрдкреНрдпрд╛рдЯрдкреНрдкреНрдпрд╛рдиреЗ рдХреЗрд▓реЗрд▓реЗ config pushes, рдореНрд╣рдгрдЬреЗ рдПрдХ рд╡рд╛рдИрдЯ push рдПрдХрджрдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдордЪреНрдпрд╛ service рдЪрд╛ SLO рдШреНрдпрд╛ рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ hard dependencies рдЪреНрдпрд╛ рдореЛрдЬрд▓реЗрд▓реНрдпрд╛ availability рдЪрд╛ рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рд╛. рдЧреБрдгрд╛рдХрд╛рд░ SLO рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪрд╛ рдкреБрдврдЪрд╛ project рд╕рд╛рдкрдбрд▓рд╛ рдЖрд╣реЗ тАФ рдХрд┐рдВрд╡рд╛ рддреБрдордЪрд╛ SLO рдЪреБрдХреАрдЪрд╛ рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдЧрдгрд┐рддрд╛рдиреЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдХреА рдорд╛рдЧрдгреА capacity рдордзреНрдпреЗ рдмрд╕рддреЗ. рдЗрдорд╛рд░рдд рд╕рд╛рдорд╛рд╡реВ рд╢рдХреЗрд▓ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд▓реЗ, рддрд░ рддреБрдореНрд╣реА рдиреАрдЯ рдЕрдкрдпрд╢реА рдХрд╕реЗ рд╣реЛрддрд╛?
git checkout lesson-10-overload