ЁЯУИ рдзрдбрд╛ 07 тАФ Capacity planning: рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдпреЗрдгреНрдпрд╛рдЖрдзреАрдЪ рдкреБрдврдЪреНрдпрд╛ рд╕рддреНрд░рд╛рд╕рд╛рдареА рдЦреБрд░реНрдЪреНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧреЗ: lesson-06-progressive-delivery ┬╖ рдкреБрдвреЗ: lesson-08-incident-command
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 06, рдЕрдзрд┐рдХ рдирд┐рдпреЛрдЬрди. рдЦрд▒реНрдпрд╛ peaks рд╡рд░реВрди рд╡рд╛рдвреАрдЪреА рд░реЗрд╖рд╛ рдХрд╛рдврд╛, рддрд┐рдЪрд╛ forecast рдХрд░рд╛,
headroom рдареЗрд╡рд╛, рдмрд┐рдШрд╛рдбрд╛рдВрд╕рд╛рдареА рдЬрд╛рд╕реНрддреАрдЪреЗ servers рдЬреЛрдбрд╛ (N+1, N+2), рд╕рдВрдкреВрд░реНрдг zone
рдЧреЗрд▓рд╛ рддрд░реА рдЯрд┐рдХрд╛, рдЖрдгрд┐ рдард╛рдКрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ events (рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕) рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рд╡реЗрдЧрд│рд╛ рдХрд░рд╛.
sre/crew.py рдордзреАрд▓ CapacityPlan рдЖрдгрд┐ sre/demo.py рдордзреАрд▓ capacity().
Load рдХрд╕рд╛ рдореЛрдЬрд╛рдпрдЪрд╛ рдЖрдгрд┐ autoscale рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рд╣реЗ Scaling school рдордзреНрдпреЗ рд╢рд┐рдХрд╡рд▓реЗ рдЖрд╣реЗ;
рд╣рд╛ рдзрдбрд╛ рдореНрд╣рдгрдЬреЗ рдкрдердХрд╛рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рдРрд╢реНрд╡рд░реНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдЧрд░реНрджреАрдЪреНрдпрд╛ рдХреНрд╖рдгреА рд╕рднрд╛рдЧреГрд╣рд╛рдд рдХрд┐рддреА рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдЖрд╣реЗрдд рддреЗ рдореЛрдЬрддреЗ. ЁЯкС рдЖрдард╡рдбрд╛ 1: 1,206. рдЖрдард╡рдбрд╛ 12: 1,707. рдЖрдХрдбрд╛ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рд╕рд╛рдзрд╛рд░рдг 48 рдиреЗ рд╡рд╛рдврддреЛ.
"рд╕рд╣рд╛ рдорд╣рд┐рдиреНрдпрд╛рдВрдиреА рддреЛ рдХреБрдареЗ рдЕрд╕реЗрд▓?" рддреА рдпрд╛ рдЖрдХрдбреНрдпрд╛рдВрдордзреВрди рдПрдХ рд╕рд░рд│ рд░реЗрд╖рд╛ рдХрд╛рдврддреЗ рдЖрдгрд┐ рддреА рдкреБрдвреЗ рдиреЗрддреЗ: рд╕рд╛рдзрд╛рд░рдг 2,963.
рдЦреБрд░реНрдЪреНрдпрд╛рдВрдЪреНрдпрд╛ рдПрдХрд╛ рд░рд╛рдВрдЧреЗрдд 300 рдЬрдг рдмрд╕рддрд╛рдд, рдкрдг рдкреВрд░реНрдг рднрд░рд▓реЗрд▓реА рд░рд╛рдВрдЧ рдЕрд╡рдШрдбрд▓реЗрд▓реА рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рддреА рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдВрдЧреЗрдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ 210 рд╕рд╛рдареА рдХрд░рддреЗ (70% рднрд░рд▓реЗрд▓реА). рдореНрд╣рдгрдЬреЗ 15 рд░рд╛рдВрдЧрд╛.
"рдЖрдгрд┐ рдПрдЦрд╛рджреА рд░рд╛рдВрдЧ рдореЛрдбрд▓реА рддрд░?" рдПрдХ рдЬреЛрдбрд╛: 16. "рдПрдХрд╛ рд░рд╛рдВрдЧреЗрдЪреА рджреБрд░реБрд╕реНрддреА рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рдЖрдгрд┐ рджреБрд╕рд░реА рдореЛрдбрд▓реА рддрд░?" рджреЛрди рдЬреЛрдбрд╛: 17. "рд╕рднрд╛рдЧреГрд╣рд╛рдЪреА рд╕рдВрдкреВрд░реНрдг рдкреВрд░реНрд╡ рдмрд╛рдЬреВ рдмрдВрдж рдЕрд╕рд▓реА рддрд░?" рдЙрд░рд▓реЗрд▓реНрдпрд╛ рджреЛрди рдмрд╛рдЬреВрдВрдиреА рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдмрд╕рд╡рд╛рдпрд▓рд╛ рд╣рд╡реЗ: 24 рд░рд╛рдВрдЧрд╛, рддреАрди рдмрд╛рдЬреВрдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓реНрдпрд╛.
рдЖрдгрд┐ рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕ рд╡реЗрдЧрд│рд╛ рдЕрд╕рддреЛ: рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЧрд░реНрджреАрдЪреНрдпрд╛ 2.5 ├Ч. рддреНрдпрд╛рд▓рд╛ 36 рд░рд╛рдВрдЧрд╛ рд▓рд╛рдЧрддрд╛рдд тАФ рдореНрд╣рдгреВрди рддреНрдпрд╛ рддреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪреНрдпрд╛ рдЖрдзреАрдЪ рдЦреБрд░реНрдЪреНрдпрд╛ рдЙрд╕рдиреНрдпрд╛ рдЖрдгрддрд╛рдд, рдкрд╛рд▓рдХ рдЙрднреЗ рдЕрд╕рддрд╛рдирд╛ рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
peaks["ЁЯУК 12 weekly peaks<br/>1,206 тЖТ 1,707 req/s"] --> fit["ЁЯУИ straight line<br/>+47.8 req/s per week"]
fit --> fc["forecast +26 weeks<br/>2,963 req/s"]
fc --> n["N = 15<br/>210 req/s each (70% of 300)"]
n --> n1["N+1 = 16"]
n --> n2["N+2 = 17"]
n --> z["lose 1 of 3 zones: 24"]
fc --> ev["results day ├Ч 2.5<br/>7,408 req/s тЖТ 36"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l07
тЭУ рдХрд╛рдп
- Demand forecast тАФ рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рдПрдЦрд╛рджреНрдпрд╛ рддрд╛рд░рдЦреЗрд▓рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд peak load, рдЗрддрд┐рд╣рд╛рд╕ рдЖрдгрд┐ рдард╛рдКрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдпреЛрдЬрдирд╛рдВрд╡рд░реВрди (рдирд╡реА рд╢рд╛рд│рд╛ рдЬреЛрдбрд▓реА рдЬрд╛рддреЗ, marketing рдореЛрд╣реАрдо). Lab 12 рдЖрдард╡рдбреНрдпрд╛рдВрдЪреНрдпрд╛ peaks рдордзреВрди рдПрдХ рд╕рд░рд│ рд░реЗрд╖рд╛ (least squares) рдХрд╛рдврддреЗ. рдЦрд░реА рдорд╛рдЧрдгреА рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рд╕рд░рд│ рд░реЗрд╖реЗрдд рдирд╕рддреЗ тАФ рдЖрдард╡рдбреНрдпрд╛рдЪреА рдЖрдгрд┐ рд╡рд░реНрд╖рд╛рдЪреА рдЪрдХреНрд░реЗ, рдЕрдЪрд╛рдирдХ рдЙрдбреНрдпрд╛ тАФ рдореНрд╣рдгреВрди рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ forecast рдЪреА рдкреНрд░рддреНрдпрдХреНрд╖ рдЖрдХрдбреНрдпрд╛рдВрд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛.
- Peak, average рдирд╛рд╣реА тАФ рдЖрдард╡рдбреНрдпрд╛рддреАрд▓ рд╕рд░реНрд╡рд╛рдд рдЧрд░реНрджреАрдЪреНрдпрд╛ рдорд┐рдирд┐рдЯрд╛рд╕рд╛рдареА рдЖрд░рд╛рдЦрдбрд╛ рдХрд░рд╛, рдХрд╛рд░рдг рддреНрдпрд╛рдЪ рд╡реЗрд│реА users рдкрд░рдд рдкрд╛рдард╡рд▓реЗ рдЬрд╛рддрд╛рдд.
- Load-tested limit тАФ latency рдХрд┐рдВрд╡рд╛ errors рдореБрд│реЗ SLO рддреБрдЯрдгреНрдпрд╛рдЖрдзреА рдПрдХ server рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдХрд┐рддреА рдХрд░реВ рд╢рдХрддреЛ, рддреЗ load test рдиреЗ рдореЛрдЬрд▓реЗрд▓реЗ, CPU рд╡рд░реВрди рдЕрдВрджрд╛рдЬрд▓реЗрд▓реЗ рдирд╛рд╣реА. рдЗрдереЗ: 300 requests/s.
- Headroom (target utilisation) тАФ рдкреНрд░рддреНрдпреЗрдХ server рддреНрдпрд╛рдЪреНрдпрд╛ limit рдЪреНрдпрд╛, рд╕рдордЬрд╛, 70% рд╡рд░ рдЪрд╛рд▓реЗрд▓ рдЕрд╕рд╛ рдЖрд░рд╛рдЦрдбрд╛ рдХрд░рд╛. рдЙрд░рд▓реЗрд▓рд╛ рднрд╛рдЧ рдЕрдЪрд╛рдирдХ рд╡рд╛рдв, рд╣рд│реВ dependencies рдЖрдгрд┐ forecast рдордзреАрд▓ рдЪреВрдХ рд╢реЛрд╖реВрди рдШреЗрддреЛ. рдЬрд╛рд╕реНрдд target рдореБрд│реЗ рдкреИрд╕реЗ рд╡рд╛рдЪрддрд╛рдд рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдХрдореА рд╣реЛрддреЗ.
- N+1 / N+2 тАФ N servers peak рд╕рд╛рдВрднрд╛рд│рддрд╛рдд; N+1 рдПрдХ рдмрд┐рдШрд╛рдб рдЭреЗрд▓рддреЛ; N+2 рдПрдХ рдмрд┐рдШрд╛рдб рдЭреЗрд▓рддреЛ рддреЗрд╡реНрд╣рд╛ рджреБрд╕рд░рд╛ рдирд┐рдпреЛрдЬрд┐рдд maintenance рд╕рд╛рдареА рдмрдВрдж рдЕрд╕рддреЛ (Google SRE рдЪрд╛ рдПрдХ рдиреЗрд╣рдореАрдЪрд╛ рдирд┐рдпрдо).
- Zone (failure domain) тАФ рдПрдХрддреНрд░ рдмрдВрдж рдкрдбрдгрд╛рд░рд╛ рдЧрдЯ: рдПрдХ rack, рдПрдХ data center, рдПрдХ cloud availability zone. 3 рдкреИрдХреА рдПрдХ zone рдЧреЗрд▓рд╛ рддрд░реА рдЯрд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА рдЙрд░рд▓реЗрд▓реНрдпрд╛ 2 рдиреА рд╕рдВрдкреВрд░реНрдг peak рд╕рд╛рдВрднрд╛рд│рд╛рдпрд▓рд╛ рд╣рд╡рд╛, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ zone рд▓рд╛ N ├╖ 2 (рд╡рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗрд▓реЗрд▓реЗ) рд▓рд╛рдЧрддрд╛рдд тАФ рдПрдХреВрдг 3 ├Ч тМИN/2тМЙ. рд╣реЗ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ N+2 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рддреЗ.
- Lead time тАФ "рдЖрдгрдЦреА рдорд╛рдЧрд╡рд╛" рдкрд╛рд╕реВрди "traffic рд╕реЗрд╡рд╛ рджреЗрдд рдЖрд╣реЗ" рдкрд░реНрдпрдВрддрдЪрд╛ рд╡реЗрд│. Cloud autoscaling рд╕рд╛рдареА рдорд┐рдирд┐рдЯреЗ; рдирд╡реЗ hardware, рдирд╡рд╛ region рдХрд┐рдВрд╡рд╛ quota рд╡рд╛рдвреАрд╕рд╛рдареА рдЖрдард╡рдбреЗ рдХрд┐рдВрд╡рд╛ рдорд╣рд┐рдиреЗ. рдХрд┐рдорд╛рди рдПрдХрд╛ lead time рдЗрддрдХрд╛ рдкреБрдврдЪрд╛ forecast рдХрд░рд╛.
- Event capacity тАФ рдард╛рдКрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЕрдЪрд╛рдирдХ рд╡рд╛рдвреА (рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕, sale, launch) рдпрд╛рдВрдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рд╣рд╛рддрд╛рдиреЗ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ: рдЖрдзреАрдЪ scale рдХрд░рд╛, quotas рд╡рд╛рдврд╡рд╛, caches рдЧрд░рдо рдХрд░рд╛. Autoscaling load рдЖрд▓реНрдпрд╛рдирдВрддрд░ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЗ; spike рддреНрдпрд╛рдЪреНрдпрд╛ scale рд╣реЛрдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд╛рдиреЗ рдЖрд▓рд╛ рддрд░ рддреЗ рдорджрдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг capacity рд╕рдВрдкрдгреЗ рд╣реЗ рдЕрд╕реЗ outage рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╣рд┐рдиреЛрдиреНрдорд╣рд┐рдиреЗ рдЖрдзреА рдпреЗрддрд╛рдирд╛ рджрд┐рд╕реВ рд╢рдХрддреЗ. рдЖрдгрд┐ рдЧрд░рдЬреЗрдкреЗрдХреНрд╖рд╛ рдЦреВрдк рдЬрд╛рд╕реНрдд рд╡рд┐рдХрдд рдШреЗрдгреЗ рдореНрд╣рдгрдЬреЗ рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ рд╡рд╛рдпрд╛ рдЬрд╛рдгрд╛рд░реЗ рдкреИрд╕реЗ. рдЖрд░рд╛рдЦрдбрд╛ рджреЛрдиреНрд╣реАрд╡рд░ рдЖрдХрдбреЗ рдареЗрд╡рддреЛ, рдореНрд╣рдгреВрди "рдорд╛рд░реНрдЪрдкрд░реНрдпрдВрдд рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрдгрдЦреА 9 servers рд▓рд╛рдЧрддреАрд▓" рд╣рд╛ рдкреБрд░рд╛рд╡реНрдпрд╛рд╕рд╣ рдХреЗрд▓реЗрд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдард░рддреЛ. рддреЛ рд▓рдкрд▓реЗрд▓реА рдЧрд░рдЬрд╣реА рдЙрдШрдб рдХрд░рддреЛ: рдмрд┐рдШрд╛рдбрд╛рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ (рдПрдХ zone рдмрдВрдж) рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рд╡рд╛рдвреАрдЪреНрдпрд╛ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдорд╛рдЧрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/crew.py рдордзреНрдпреЗ CapacityPlan(per_server_rps=300, target_util=0.7, zones=3).
weekly_peaks() 12 seeded рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ peaks рдмрдирд╡рддреЗ (рд╡рд╛рдв
рдЕрдзрд┐рдХ noise), fit(ys) least-squares slope рдЖрдгрд┐ intercept рдкрд░рдд рджреЗрддреЗ, servers(peak) рдореНрд╣рдгрдЬреЗ
тМИpeak ├╖ (300 ├Ч 0.7)тМЙ рдЖрдгрд┐ zone_safe(n) рдореНрд╣рдгрдЬреЗ 3 ├Ч тМИn ├╖ 2тМЙ. capacity() рдЖрдард╡рдбрд╛ 12 рдирдВрддрд░ 26 рдЖрдард╡рдбреЗ
рдкреБрдврдЪрд╛ forecast рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py capacity
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import CapacityPlan
plan = CapacityPlan()
peaks = plan.weekly_peaks(12); slope, icpt = plan.fit(peaks)
for ahead in (4, 13, 26, 52):
fc = round(icpt + slope * (11 + ahead)); n = plan.servers(fc)
print(f"{ahead:>2} weeks ahead: {fc:>5,} req/s тЖТ N {n:>2} ┬╖ N+2 {n + 2:>2} ┬╖ zone-safe {plan.zone_safe(n):>2}")
for util in (0.5, 0.7, 0.9):
print(f"target utilisation {util:.0%} тЖТ N = {CapacityPlan(target_util=util).servers(2963)} for 2,963 req/s")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
capacity рд╣реЗ рдЫрд╛рдкрддреЗ:
тФАтФА weekly peak requests/s, 12 weeks: [1206, 1226, 1276, 1373, 1365, 1448, 1474, 1533, 1600, 1613, 1684, 1707]
straight-line fit: +47.8 req/s per week ┬╖ forecast 26 weeks ahead: 2,963 req/s
one server: 300 req/s at its load-test limit; plan at 70% = 210 тЖТ N = 15 servers for the forecast peak
N+1 = 16 (one server can fail) ┬╖ N+2 = 17 (one in maintenance AND one fails) ┬╖ survive losing 1 of 3 zones: 24
results day (2.5 ├Ч the normal peak = 7,408 req/s) needs 36 тАФ plan it as an event, pre-scale, don't wait for autoscaling
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
4 weeks ahead: 1,912 req/s тЖТ N 10 ┬╖ N+2 12 ┬╖ zone-safe 15
13 weeks ahead: 2,342 req/s тЖТ N 12 ┬╖ N+2 14 ┬╖ zone-safe 18
26 weeks ahead: 2,963 req/s тЖТ N 15 ┬╖ N+2 17 ┬╖ zone-safe 24
52 weeks ahead: 4,204 req/s тЖТ N 21 ┬╖ N+2 23 ┬╖ zone-safe 33
target utilisation 50% тЖТ N = 20 for 2,963 req/s
target utilisation 70% тЖТ N = 15 for 2,963 req/s
target utilisation 90% тЖТ N = 11 for 2,963 req/s
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреНрдпрд╛рдЪ forecast рд╕рд╛рдареА, zone-loss рдЖрд░рд╛рдЦрдбреНрдпрд╛рд▓рд╛ (24) N+2 (17) рдкреЗрдХреНрд╖рд╛ 7 servers рдЬрд╛рд╕реНрдд рд▓рд╛рдЧрддрд╛рдд тАФ рддреБрдореНрд╣реА рдХреЛрдгрддреНрдпрд╛ рдмрд┐рдШрд╛рдбрд╛рд╕рд╛рдареА design рдХрд░рддрд╛ рддреЗ рд╡рд╛рдвреАрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЦрд░реНрдЪ рдард░рд╡рддреЗ. Utilisation target рдореБрд│реЗ N 11 рдкрд╛рд╕реВрди 20 рдкрд░реНрдпрдВрдд рдмрджрд▓рддреЛ: рддреА headroom рдЪреА рдХрд┐рдВрдордд рдЖрд╣реЗ, рдЖрдгрд┐ рддреА рдирд┐рд╡рдб рдЖрд╣реЗ, рдирд┐рдпрдо рдирд╛рд╣реА. рдЖрдгрд┐ рддреБрдореНрд╣реА рдЬрд┐рддрдХрд╛ рдкреБрдврдЪрд╛ forecast рдХрд░рддрд╛, рддрд┐рддрдХрд╛ рд╕рд░рд│-рд░реЗрд╖реЗрдЪрд╛ рдЕрдВрджрд╛рдЬ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдард░рддреЛ: рджрд░ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ рдкреБрдиреНрд╣рд╛ fit рдХрд░рд╛ рдЖрдгрд┐ рдорд╛рдЧрдЪреНрдпрд╛ рдорд╣рд┐рдиреНрдпрд╛рдЪреНрдпрд╛ forecast рдЪреА рдкреНрд░рддреНрдпрдХреНрд╖ рдШрдбрд▓реЗрд▓реНрдпрд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- peak рдРрд╡рдЬреА average рд╡рд░реВрди рдЖрд░рд╛рдЦрдбрд╛ рдХрд░рдгреЗ
- load test рдРрд╡рдЬреА CPU рдЪреНрдпрд╛ рдЕрдВрджрд╛рдЬрд╛рд╡рд░реВрди рдХрд╛рдврд▓реЗрд▓рд╛ per-server рдЖрдХрдбрд╛
- рдПрдХрд╛рдЪ zone рдордзреНрдпреЗ N+1 тАФ zone рдмрд┐рдШрдбрд▓рд╛ рдХреА рд╕рдЧрд│реЗрдЪ рдЬрд╛рддреЗ
- lead time рдкреЗрдХреНрд╖рд╛ рдХрдореА рдХрд╛рд▓рд╛рд╡рдзреАрдЪрд╛ forecast (quota requests, hardware orders)
- рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдд рдпреЗрдгрд╛рд▒реНрдпрд╛ spike рд╕рд╛рдареА autoscaling рд╡рд░ рд╡рд┐рд╕рдВрдмрдгреЗ
- рдЬреБрдиреНрдпрд╛ forecast рдЪреА рдкреНрд░рддреНрдпрдХреНрд╖ рдШрдбрд▓реЗрд▓реНрдпрд╛рд╢реА рдХрдзреАрдЪ рддреБрд▓рдирд╛ рди рдХрд░рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Per-server limit рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА load-test рдХрд░рд╛ тАФ рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде k6 рдиреЗ. рдЦрд▒реНрдпрд╛ account рд╡рд░ (test environment, рд╕рд╣рдорддреАрд╢рд┐рд╡рд╛рдп production рдХрдзреАрдЪ рдирд╛рд╣реА):
k6 run --vus 300 --duration 10m load-timetable.js # raise VUs until p99 or errors break the SLO
Kubernetes рд╡рд░ replicas zones рдордзреНрдпреЗ рдкрд╕рд░рд╡рд╛ рдЖрдгрд┐ maintenance рджрд░рдореНрдпрд╛рди рддреНрдпрд╛рдВрдЪреЗ рд░рдХреНрд╖рдг рдХрд░рд╛:
# in the Deployment's pod template
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector: {matchLabels: {app: timetable}}
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: {name: timetable}
spec:
minAvailable: 22 # voluntary disruptions (node drains) may not go below this
selector: {matchLabels: {app: timetable}}
рдард╛рдКрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ event рд╕рд╛рдареА рдЖрдзреАрдЪ scale рдХрд░рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде Auto Scaling group рд╡рд░реАрд▓ AWS scheduled action рдиреЗ:
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name timetable \
--scheduled-action-name results-day --start-time 2026-10-15T04:00:00Z --min-size 36 --desired-capacity 36
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдкреНрд░рддреНрдпреЗрдХ service рд╕рд╛рдареА рдПрдХ рдУрд│ рд▓рд┐рд╣рд╛: 6 рдорд╣рд┐рдиреНрдпрд╛рдВрдирдВрддрд░рдЪрд╛ forecast peak, load test рдордзреВрди per-server limit, target utilisation, N, рдЖрдгрд┐ zone-loss рдЖрдХрдбрд╛. рддреНрдпрд╛рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рдкреБрдврдЪреНрдпрд╛ рдард╛рдКрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ event рдЪреА рддрд╛рд░реАрдЦ рд▓рд┐рд╣рд╛.
тПня╕П рдкреБрдвреЗ
рдкреБрд░реЗрд╢реА capacity рдЕрд╕рд▓реА рддрд░реА рдЧреЛрд╖реНрдЯреА рдмрд┐рдШрдбрддрд╛рдд. рддреЗрд╡реНрд╣рд╛ рдЬрдмрд╛рдмрджрд╛рд░реА рдХреЛрдгрд╛рдЪреА? рдкреБрдврдЪрд╛ рдзрдбрд╛ рдЖрд╣реЗ рдкрдердХрд╛рдЪреЗ incident command.
git checkout lesson-08-incident-command