ЁЯУИ рдзрдбрд╛ 10 тАФ Scaling: рдЕрдзрд┐рдХ рдХрд╛рд░рдХреВрди, рдЕрдзрд┐рдХ рдЦреЛрд▓реНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреАрд▓: lesson-09-backups-recovery ┬╖ рдкреБрдвреАрд▓: lesson-11-nosql-other-rooms
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ рдЦреЛрд▓реА рдЧрд░реНрджреАрдиреЗ рднрд░рд▓реА рдХреА рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ: connection pools, caches, read replicas (рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ lag), partitions, sharding тАФ рдЖрдгрд┐ teams рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╣реЗ рд╡рд╛рдкрд░рддрд╛рдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдореЛрдареА рдЭрд╛рд▓реА. рд░реЗрдХреЙрд░реНрдб рд░реВрдордЪреНрдпрд╛ рджрд╛рд░рд╛рдкрд░реНрдпрдВрдд рд░рд╛рдВрдЧ рд▓рд╛рдЧрд▓реА рдЖрд╣реЗ. рдЖрддрд╛ рдХрд╛рдп? рджрд░ рд╡реЗрд│реА рддреАрдЪ рдпрд╛рджреА, рддреНрдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ:
- рдЖрдзреА рдкреНрд░рд╢реНрди рд╕реБрдзрд╛рд░рд╛ тАФ рдмрд╣реБрддреЗрдХ рд░рд╛рдВрдЧрд╛ рдореНрд╣рдгрдЬреЗ рдПрдХрдЪ рд╣рд│реВ рдкреНрд░рд╢реНрди рд╣рдЬрд╛рд░ рд╡реЗрд│рд╛ рд╡рд┐рдЪрд╛рд░рд▓реЗрд▓рд╛ (рд╣рд░рд╡рд▓реЗрд▓рд╛ card catalogue, рдзрдбрд╛ 06; рдПрдХ N+1, рдзрдбрд╛ 12).
- рдХрд╛рд░рдХреБрдирд╛рдВрдЪрд╛ pool ЁЯЪ░ тАФ рдкреНрд░рддреНрдпреЗрдХ request рд╕рд╛рдареА рдирд╡реЗ connection рдЙрдШрдбрдгреЗ рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╣реБрдгреНрдпрд╛рд╕рд╛рдареА рдирд╡рд╛ рдХрд╛рд░рдХреВрди рдиреЗрдордгреЗ. рдПрдХ pool рдареЗрд╡рд╛; рддреЗрдЪ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд╛.
- рдЧрд░рдо рдЙрддреНрддрд░рд╛рдВрдЪрд╛ рд╕реВрдЪрдирд╛ рдлрд▓рдХ ЁЯзК (рдПрдХ cache, рдЙрджрд╛. Redis) тАФ "3A рдордзреНрдпреЗ рдХрд┐рддреА рд╡рд┐рджреНрдпрд╛рд░реНрдереА?" рд╣рд╛ рдкреНрд░рд╢реНрди рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рджрд┐рд╡рд╕рд╛рддреВрди рджреЛрдирджрд╛рдЪ рдмрджрд▓рддреЛ. рдЙрддреНрддрд░ counter рд╡рд░ рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рд╕рд╛рдареА рд▓рд╛рд╡реВрди рдареЗрд╡рд╛.
- рдореЛрдареА рдЦреЛрд▓реА тАФ рдЬрд╛рд╕реНрдд memory рдЖрдгрд┐ рдЬрд▓рдж disks рдЦреВрдк рдлрд░рдХ рдкрд╛рдбрддрд╛рдд.
- рдЦреЛрд▓реАрдЪреНрдпрд╛ рдлрдХреНрдд-рд╡рд╛рдЪрдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рддреА ЁЯУЦ (replicas) тАФ рд╡рд╛рдЪрдгрд╛рд░реЗ рдкреНрд░рддреАрдВрдХрдбреЗ рдЬрд╛рддрд╛рдд, рд▓рд┐рд╣рд┐рдгрд╛рд░реЗ рдПрдХрд╛рдЪ рдореВрд│ рдЦреЛрд▓реАрдХрдбреЗ. рдкреНрд░рддреА рдереЛрдбреНрдпрд╛ рдорд╛рдЧреЗ рдЕрд╕рддрд╛рдд (replication lag): рд╕реНрд╡рддрдГ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдореВрд│ рдЦреЛрд▓реАрддреВрдирдЪ рд╡рд╛рдЪрд╛.
- Partitions тАФ рд╣рдЬреЗрд░реАрдЪреА рдиреЛрдВрджрд╡рд╣реА рд╡рд░реНрд╖рд╛рдиреБрд╕рд╛рд░ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓реА; рдЬреБрдиреА рд╡рд░реНрд╖реЗ рд╣рд│реВ рдХрдкрд╛рдЯрд╛рд╡рд░.
- Shards ЁЯПв тАФ рдкреНрд░рджреЗрд╢ рдХрд┐рдВрд╡рд╛ рд╢рд╛рд│реЗрдиреБрд╕рд╛рд░ рд╡реЗрдЧрд│реНрдпрд╛ рдЦреЛрд▓реНрдпрд╛. рд╢реЗрд╡рдЯрдЪрд╛ рдЙрдкрд╛рдп: рдЦреЛрд▓реНрдпрд╛рдВрдкрд▓реАрдХрдбрдЪреЗ рдкреНрд░рд╢реНрди рдЖрдгрд┐ рдЦреЛрд▓реНрдпрд╛рдВрдкрд▓реАрдХрдбрдЪреЗ transactions рдХрдареАрдг рд╣реЛрддрд╛рдд.
рдмрд╣реБрддреЗрдХ рд╢рд╛рд│рд╛рдВрдирд╛ рдкрд╛рдпрд▒реНрдпрд╛ 6тАУ7 рдХрдзреАрдЪ рд▓рд╛рдЧрдд рдирд╛рд╣реАрдд. рдЬреНрдпрд╛рдВрдирд╛ рд▓рд╛рдЧрд▓реНрдпрд╛, рддреНрдпрд╛ рдЖрдзреА 1тАУ5 рдХрд░реВрдирдЪ рддрд┐рдереЗ рдкреЛрд╣реЛрдЪрд▓реНрдпрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
q["ЁЯРМ the queue"] --> f["1 fix queries + indexes"] --> p["2 connection pool"] --> c["3 cache hot answers"] --> b["4 bigger machine"] --> r["5 read replicas (lag!)"] --> pt["6 partitions"] --> s["7 shards тАФ last"]
w["тЬНя╕П writes: one primary; Multi-AZ standby is for surviving a fire, not for speed"]
r -.-> w
тЭУ рдХрд╛рдп
- Connection pool (pgbouncer, HikariCP, driver рдЪрд╛ pool): connections рдорд╣рд╛рдЧ рдЕрд╕рддрд╛рдд; рддреНрдпрд╛рдВрдирд╛ рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓рд╛ (рд╣рдЬрд╛рд░реЛ connections рдЭрд╛рд▓реЗ рдХреА databases рдХреЛрд╕рд│рддрд╛рдд) рдЖрдгрд┐ рддреЗрдЪ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд╛.
- Cache: key тЖТ рдЙрддреНрддрд░, TTL рд╕рд╣; write рдЭрд╛рд▓реНрдпрд╛рд╡рд░ invalidate рдХрд░рд╛ рдХрд┐рдВрд╡рд╛ рдереЛрдбрд╛ рд╡реЗрд│ рдЬреБрдирд╛ data рдЪрд╛рд▓реЗрд▓ рд╣реЗ рд╕реНрд╡реАрдХрд╛рд░рд╛. рд╕рдЧрд│реЗ рдирд╛рд╣реА, рддрд░ рдЧрд░рдо рдЖрдгрд┐ рд╣рд│реВ рддреЗрдЪ cache рдХрд░рд╛.
- Read replicas: streaming рдкреНрд░рддреА; рдЬрд╡рд│рдЬрд╡рд│ рд▓рдЧреЗрдЪ, рдкрдг рдЕрдЧрджреА рд▓рдЧреЗрдЪ рдирд╛рд╣реА. lag рдЪрд╛рд▓рдгрд╛рд░реЗ reads рддрд┐рдХрдбреЗ рдкрд╛рдард╡рд╛; "рд╕реНрд╡рддрдГ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рд╡рд╛рдЪрдгреЗ" primary рдХрдбреЗ рдкрд╛рдард╡рд╛. failover рд╕рд╛рдареА рддрдпрд╛рд░ standby рдореНрд╣рдгреВрдирд╣реА рдЙрдкрдпреЛрдЧреА.
- Vertical scaling: рдореЛрдареЗ instance тАФ engineering рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд╕рд╛рдорд╛рдЧреЗ рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдкрд╛рдпрд░реА, рдПрдХрд╛ рдорд░реНрдпрд╛рджреЗрдкрд░реНрдпрдВрдд.
- Partitioning: рдПрдХ logical table, рдЕрдиреЗрдХ physical рддреБрдХрдбреЗ (рддрд╛рд░рдЦреЗрдиреБрд╕рд╛рд░, рдкреНрд░рджреЗрд╢рд╛рдиреБрд╕рд╛рд░); рдПрдХрд╛рдЪ partition рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ queries рдЬрд▓рдж рд╣реЛрддрд╛рдд; рджреЗрдЦрднрд╛рд▓ рд╕реЛрдкреА рд╣реЛрддреЗ.
- Sharding: key рдиреБрд╕рд╛рд░ рд╡реЗрдЧрд│реЗ databases; application routing рдХрд░рддреЗ. Cross-shard JOINs рдЖрдгрд┐ transactions application code рдмрдирддрд╛рдд.
- Managed (AWS L17, RDS): replicas, Multi-AZ, snapshots рдлрдХреНрдд checkboxes; queries, indexes рдЖрдгрд┐ schema рдорд╛рддреНрд░ рддреБрдордЪреЗрдЪ рд░рд╛рд╣рддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг scaling рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреА рджреЛрдирдкреИрдХреА рдПрдХрд╛ рдкреНрд░рдХрд╛рд░реЗ рдлрд╕рддрд╛рдд: рдПрдЦрд╛рджреНрдпрд╛ blog рдиреЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдореНрд╣рдгреВрди 50 GB database shard рдХрд░рдгреЗ (рдПрдХ рд╡рд░реНрд╖ рд╡рд╛рдпрд╛), рдХрд┐рдВрд╡рд╛ рдХрдзреАрдЪ index рди рдЬреЛрдбрддрд╛ database рд▓рд╛ "рд╣рд│реВ" рдореНрд╣рдгрдгреЗ (рдПрдХ customer рдЧрдорд╛рд╡рд▓рд╛). рд╣реА рд╢рд┐рдбреА рджреЛрдиреНрд╣реАрдкрд╛рд╕реВрди рдмрдЪрд╛рд╡ рдЖрд╣реЗ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реА рдкреБрдврдЪреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╕реНрд╡рд╕реНрдд рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
SQLite рд╣реА рдПрдХрдЪ file рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЗрдереЗ replicas рдЖрдгрд┐ shards рдХрд╛рдЧрджрд╛рд╡рд░рдЪреЗ рд╕рд░рд╛рд╡ рдЖрд╣реЗрдд тАФ рдкрдг pool, cache рдЖрдгрд┐ "рдЖрдзреА query рд╕реБрдзрд╛рд░рд╛" рд╣реА рдкрд╛рдпрд░реА рдЦрд░реА рдЖрд╣реЗ: рдзрдбрд╛ 06 рдЪрд╛ index рдЖрдгрд┐ рдзрдбрд╛ 12 рдЪрд╛ N+1 рдореНрд╣рдгрдЬреЗ рдкрд╛рдпрд░реА 1; рдЦрд╛рд▓рдЪрд╛ code рдореНрд╣рдгрдЬреЗ рдкрд╛рдпрд▒реНрдпрд╛ 2тАУ3 рд▓рд╣рд╛рди рд░реВрдкрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 - <<'EOF'
import sqlite3, time
# rung 2: a pool in miniature тАФ one connection reused vs opened per request
t=time.perf_counter()
for _ in range(2000): sqlite3.connect("db/school.db").execute("SELECT 1").fetchone()
per_request=(time.perf_counter()-t)*1000
c=sqlite3.connect("db/school.db"); t=time.perf_counter()
for _ in range(2000): c.execute("SELECT 1").fetchone()
pooled=(time.perf_counter()-t)*1000
print(f"2000 queries тАФ new connection each: {per_request:.0f} ms ┬╖ one reused connection: {pooled:.0f} ms")
# rung 3: a cache with a TTL for a hot, slow-ish question
cache={}; TTL=60
def class_size(cls):
hit=cache.get(cls)
if hit and time.time()-hit[1] < TTL: return hit[0], "cache"
n=c.execute("SELECT COUNT(*) FROM students s JOIN classes k ON k.id=s.class_id WHERE k.name=?", (cls,)).fetchone()[0]
cache[cls]=(n, time.time()); return n, "db"
print(class_size("3A"), class_size("3A"))
EOF
# paper exercise (5 min): your app shows "your enrolment was saved" then lists students from a replica тАФ what can the user see, and what do you change?
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдкреНрд░рддреНрдпреЗрдХ query рд╕рд╛рдареА рдирд╡реЗ connection рдЙрдШрдбрдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реЗрд▓реЗ connection рдХрд┐рддреНрдпреЗрдХ рдкрдЯ рдЬрд▓рдж рдЖрд╣реЗ (pool рдЪреА рдкрд╛рдпрд░реА, рдореЛрдЬреВрди рдкрд╛рд╣рд┐рд▓реЗрд▓реА); рджреБрд╕рд░рд╛ class_size call cache рдордзреВрди рдЙрддреНрддрд░ рджреЗрддреЛ. рддреБрдордЪреЗ рдХрд╛рдЧрджрд╛рд╡рд░рдЪреЗ рдЙрддреНрддрд░: рдирд╡рд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдХреНрд╖рдгрднрд░ рджрд┐рд╕рдгрд╛рд░ рдирд╛рд╣реА (lag) тАФ рд╕реНрд╡рддрдГ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рд╡рд╛рдЪрдгреЗ primary рдХрдбреЗ рдЬрд╛рддреЗ, рдХрд┐рдВрд╡рд╛ UI рд╕рд╛рдард╡рд▓реЗрд▓реА row рд╕реНрдерд╛рдирд┐рдХрдкрдгреЗ рджрд╛рдЦрд╡рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рджреЛрди рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдкрд╛рдпрд▒реНрдпрд╛ тАФ connections рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд╛, рдЧрд░рдо рдЙрддреНрддрд░реЗ cache рдХрд░рд╛ тАФ рдЦрд▒реНрдпрд╛ database рд╡рд░ рдореЛрдЬрд▓реНрдпрд╛, рдЖрдгрд┐ replica-lag рдЪрд╛ рд╕рд╛рдкрд│рд╛ рддреЛ рднреЗрдЯрдгреНрдпрд╛рдЖрдзреАрдЪ рдУрд│рдЦрд▓рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- index рдХрд░рдгреНрдпрд╛рдЖрдзреА sharding
- рдЕрдорд░реНрдпрд╛рдж connections (рдкреНрд░рддреНрдпреЗрдХ app instance ├Ч рдкреНрд░рддреНрдпреЗрдХ worker) тАФ database queries рдореБрд│реЗ рдирд╛рд╣реА, рддрд░ connections рдореБрд│реЗ рдХреЛрд╕рд│рддреЛ
- рд╕рдЧрд│реЗ cache рдХрд░рдгреЗ (рдХрд┐рдВрд╡рд╛ TTL рд╢рд┐рд╡рд╛рдп) тАФ рдЬреБрдирд╛ data, рдЖрдгрд┐ рддрд╛рдЬрд╛ рдХрд░рд╛рдпрдЪрд╛ рдорд╛рд░реНрдЧ рдирд╛рд╣реА
- рд╕реНрд╡рддрдГ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ replica рд╡рд░реВрди рд╡рд╛рдЪрдгреЗ
- Multi-AZ рд▓рд╛ performance feature рд╕рдордЬрдгреЗ тАФ рддреЗ рдЯрд┐рдХрдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ feature рдЖрд╣реЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "DB рд╣рд│реВ рдЖрд╣реЗ, shard рдХрд░рд╛рдпрдЪреЗ рдХрд╛?" рдЕрд╕реЗ рд╡рд┐рдЪрд╛рд░рд▓реНрдпрд╛рд╡рд░ senior engineer рд╣реАрдЪ рд╢рд┐рдбреА рд╕рд╛рдВрдЧрддреЛ: рдЖрдзреА slow query log рджрд╛рдЦрд╡рд╛. рдЦрд▒реНрдпрд╛ companies рдордзрд▓реЗ рдмрд╣реБрддреЗрдХ scaling рдЪреЗ рд╡рд┐рдЬрдп рдкрд╛рдпрд▒реНрдпрд╛ 1тАУ3 рдордзреВрдирдЪ рдЖрд▓реЗ.
тПня╕П рдкреБрдвреЗ
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрди рдиреЛрдВрджрд╡рд╣реАрдд рдмрд╕рдд рдирд╛рд╣реА. NoSQL рдЖрдгрд┐ рдЗрддрд░ рдЦреЛрд▓реНрдпрд╛ тАФ document, key-value, columnar, graph, vector тАФ рдЖрдгрд┐ рдирд┐рд╡рдб рдХрд╢реА рдХрд░рд╛рдпрдЪреА.
git checkout lesson-11-nosql-other-rooms