ЁЯПк рдзрдбрд╛ 11 тАФ Load balancers, proxies рдЖрдгрд┐ CDNs: рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдкреБрдвреЗ: lesson-12-debugging
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ11. рдПрдХ рдирд╛рд╡, рдЕрдиреЗрдХ counters: рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдирд╛ рд╡рд╛рдЯреВрди рджреЗрдгрд╛рд░рд╛, рдЖрд░реЛрдЧреНрдп рддрдкрд╛рд╕рдгрд╛рд░рд╛ рдЖрдгрд┐ рд╕реАрд▓ рдХреЗрд▓реЗрд▓рд╛ рд▓рдЦреЛрдЯрд╛ рддрд┐рдереЗрдЪ рдЙрдШрдбрдгрд╛рд░рд╛ desk тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╣рд░рд╛рдд рд╕реВрдЪрдирд╛-рдлрд▓рдХрд╛рдЪреА рдПрдХ рдкреНрд░рдд.
- net/demo.py тАФ
httpрдЖрдгрд┐tls: рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖ рддреБрдордЪреНрдпрд╛ рд╡рддреАрдиреЗ рдмреЛрд▓рддреЛ рддреНрдпрд╛ рджреЛрди рдЧреЛрд╖реНрдЯреА
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╣рдЬрд╛рд░ рдкрд╛рд╣реБрдгреЗ "рдХрд╛рд░реНрдпрд╛рд▓рдп" рдорд╛рдЧрддрд╛рдд. рддреЗ рд╕рдЧрд│реЗ рдПрдХрд╛рдЪ desk рд╡рд░ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реАрдд. рдореНрд╣рдгреВрди рд╕рдореЛрд░ рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖ рдЙрднрд╛ рдЕрд╕рддреЛ: рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╣реБрдгреНрдпрд╛рд▓рд╛ рд░рд┐рдХрд╛рдореНрдпрд╛ counter рдХрдбреЗ рдкрд╛рдард╡рддреЛ, рдЖрдЬрд╛рд░реА рд░рдЬреЗрд╡рд░ рдЕрд╕рд▓реЗрд▓рд╛ counter рд╡рдЧрд│рддреЛ (health check), рдЖрдгрд┐ рд╕реАрд▓ рдХреЗрд▓реЗрд▓рд╛ рд▓рдЦреЛрдЯрд╛ рд╕реНрд╡рддрдГрдЪ рд╡рд╛рдЪреВ рд╢рдХрддреЛ рдореНрд╣рдгрдЬреЗ counters рдирд╛ рддреЗ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдд рдирд╛рд╣реА. reverse proxy рдореНрд╣рдгрдЬреЗ рдереЛрдбреНрдпрд╛ рдЬрд╛рд╕реНрдд рд╢рд┐рд╖реНрдЯрд╛рдЪрд╛рд░рд╛рдВрдЪрд╛ рддреЛрдЪ desk: рддреЛ рдЪрд┐рдареНрдареА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣реВ рд╢рдХрддреЛ, рдЙрддреНрддрд░ cache рдХрд░реВ рд╢рдХрддреЛ, рдХрд┐рдВрд╡рд╛ рдкрд╛рд╣реБрдгрд╛ рдЦрд░реЛрдЦрд░ рдХреБрдареВрди рдЖрд▓рд╛ рддреЗ рд╕рд╛рдВрдЧрдгрд╛рд░реА рдЯреАрдк рдЬреЛрдбреВ рд╢рдХрддреЛ. CDN рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╣рд░рд╛рддрд▓рд╛, рд╕реВрдЪрдирд╛-рдлрд▓рдХрд╛рдЪреА рдкреНрд░рдд рдЕрд╕рд▓реЗрд▓рд╛ рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖ тАФ рд╡рд╛рдЪрдХрд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдЬрд╡рд│рдЪреА рдкреНрд░рдд рдорд┐рд│рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
V["ЁЯСе visitors"] --> LB["ЁЯПк load balancer<br/>L4: ip:port ┬╖ L7: URL, headers<br/>TLS ends here ┬╖ health checks"]
LB --> A["counter 1 тЬЕ"] ; LB --> B["counter 2 тЬЕ"] ; LB -.->|unhealthy| C["counter 3 тЭМ"]
V --> CDN["ЁЯМН CDN edge<br/>static files by URL"]
тЭУ рдХрд╛рдп
- L4 balancing: рдкрддреНрддрд╛ рдЖрдгрд┐ port рдиреБрд╕рд╛рд░, protocol рд╢реА рджреЗрдгреЗрдШреЗрдгреЗ рдирд╛рд╣реА, TLS рддрд╕реЗрдЪ рдкреБрдвреЗ рдЬрд╛рддреЗ. L7: URL, header, cookie рдиреБрд╕рд╛рд░; TLS рдЗрдереЗ рд╕рдВрдкрд╡рддреЛ; retry, rewrite, canary рдХрдбреЗ route рдХрд░реВ рд╢рдХрддреЛ.
- Algorithms: round-robin, least connections, hashing; sticky sessions рдкрд╛рд╣реБрдгреНрдпрд╛рд▓рд╛ рдПрдХрд╛рдЪ counter рд▓рд╛ рдмрд╛рдВрдзрддрд╛рдд (рдПрдХ cookie).
- Health checks рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдгреНрдпрд╛рдЖрдзреА рдмрд┐рдШрдбрд▓реЗрд▓рд╛ counter рдмрд╛рдЬреВрд▓рд╛ рдХрд░рддрд╛рдд.
X-Forwarded-For/ForwardedрдЦрд▒реНрдпрд╛ client рдЪрд╛ рдкрддреНрддрд╛ рдкреБрдвреЗ рдиреЗрддрд╛рдд. - CDN: users рдЬрд╡рд│рдЪреНрдпрд╛ edges рд╡рд░ URL рдиреБрд╕рд╛рд░ responses cache рдХрд░рддреЛ; anycast рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдЬрд╡рд│рдЪреНрдпрд╛рдХрдбреЗ рдкрд╛рдард╡рддреЛ; static files, images, UI рд╢рд╛рд│реЗрдЪрд╛ рдлрд▓рдХ.
- Kubernetes рдордзреНрдпреЗ: Service рдореНрд╣рдгрдЬреЗ L4, Ingress рдореНрд╣рдгрдЬреЗ L7. AWS рдордзреНрдпреЗ: NLB / ALB.
ЁЯдФ рдХрд╛
рд╕рдореЛрд░ desk рдЕрд╕рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп horizontally scale рдХрд░рдгреЗ рдЕрд╢рдХреНрдп рдЖрд╣реЗ. рдЬрдЧрднрд░рд╛рддрд▓реНрдпрд╛ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╛рдареА latency рдордзрд▓реЗ рдмрд╣реБрддреЗрдХ рдлрд╛рдпрджреЗ рдЬрд▓рдж servers рдордзреВрди рдирд╛рд╣реА, рддрд░ CDN рдордзреВрди рдпреЗрддрд╛рдд. рдЖрдгрд┐ рдмрд╣реБрддреЗрдХ "load balancer рдмрд┐рдШрдбрд▓рд╛ рдЖрд╣реЗ" рдореНрд╣рдгрдЬреЗ fail рд╣реЛрдгрд╛рд░рд╛ health check рдЕрд╕рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
desk рд╕рд╛рдареА рд╕реНрд╡рддрдГ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реА рдирд╛рд╣реА; рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдЪрд╛рд▓рд╡рд▓реЗрд▓реЗ рджреЛрди рд╡рд┐рднрд╛рдЧ рдореНрд╣рдгрдЬреЗ рддреЛ
рдмреЛрд▓рдд рдЕрд╕рд▓реЗрд▓реЗ рджреЛрди protocols. рдХреЛрдгрддреНрдпрд╛рд╣реА рдореЛрдареНрдпрд╛ site рд╡рд┐рд░реБрджреНрдз curl -sI рдХреЗрд▓реНрдпрд╛рд╕ desk рдЪреНрдпрд╛
рдЦреБрдгрд╛ рджрд┐рд╕рддрд╛рдд: server: cloudflare, via, x-cache: HIT.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
curl -sI https://www.wikipedia.org | grep -iE 'server|via|x-cache|cf-ray|age' # the desk's headers
curl -sI https://example.com -H 'X-Forwarded-For: 203.0.113.9' | head -1 # the note the proxy adds (harmless here)
python3 -m http.server 8081 & python3 -m http.server 8082 & # two counters; a one-line desk in front:
python3 - <<'EOF'
import http.server, urllib.request, itertools
up = itertools.cycle(["8081", "8082"])
class LB(http.server.BaseHTTPRequestHandler):
def do_GET(self):
p = next(up); r = urllib.request.urlopen(f"http://127.0.0.1:{p}{self.path}")
self.send_response(200); self.send_header("X-Served-By", p); self.end_headers(); self.wfile.write(r.read()[:200])
print("desk on :8000 тЖТ 8081, 8082 round-robin"); http.server.HTTPServer(("127.0.0.1", 8000), LB).serve_forever()
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Wikipedia CDN/proxy рдЪреЗ рдирд╛рд╡ рд╕рд╛рдВрдЧрдгрд╛рд░рд╛ server: header рдЖрдгрд┐ age рдХрд┐рдВрд╡рд╛ cache header
рджреЗрдКрди рдЙрддреНрддрд░ рджреЗрддреЗ. рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ curl -sI localhost:8000 рдХреЗрд▓реНрдпрд╛рд╡рд░ рддреБрдордЪрд╛ рдЦреЗрд│рдгреНрдпрд╛рддрд▓рд╛
desk X-Served-By: 8081 рдЖрдгрд┐ 8082 рдЖрд▓рдЯреВрди рдкрд╛рд▓рдЯреВрди рджреЗрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
load balancer рдореНрд╣рдгрдЬреЗ рдкреБрдвреЗ рдкрд╛рдард╡рдгрд╛рд░рд╛ рдПрдХ рд╕рд╛рдзрд╛ program; рддреНрдпрд╛рдЪреЗ рдореВрд▓реНрдп health checks, TLS termination рдЖрдгрд┐ routing rules рдордзреНрдпреЗ рдЖрд╣реЗ тАФ рдЖрдгрд┐ рддрд┐рдиреНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ headers рдордзреНрдпреЗ рджрд┐рд╕рддрд╛рдд.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- readiness рджрд╛рдЦрд╡рдгрд╛рд▒реНрдпрд╛ рд╕реНрд╡рд╕реНрдд
/healthрдРрд╡рдЬреА/(рдЬрдб, cached) рдЪрд╛ health-check рдХрд░рдгреЗ. - stateless counters рд▓рд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди sticky sessions рд╡рд╛рдкрд░рдгреЗ.
Set-CookieрдЕрд╕рд▓реЗрд▓рд╛ API response CDN рд╡рд░ cache рдХрд░рдгреЗ. рдПрдХрд╛ user рдЪрд╛ data рд╕рдЧрд│реНрдпрд╛рдВрдирд╛.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: ALB рд╡рд┐рд░реБрджреНрдз NLB, Ingress controllers, рд╕рдЧрд│реНрдпрд╛рд╕рдореЛрд░ Cloudflare тАФ TLS, WAF, rate limits рдЖрдгрд┐ canaries рдпрд╛ desk рд╡рд░рдЪ рд░рд╛рд╣рддрд╛рдд. API рд╢рд╛рд│реЗрдЪрд╛ gateway (рдзрдбрд╛ 12) рдореНрд╣рдгрдЬреЗ auth рдЬреЛрдбрд▓реЗрд▓рд╛ рд╣рд╛рдЪ desk.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 12 тАФ network рдЪреЗ debugging: рд╕рд╣рд╛ рдкрд╛рдпрд▒реНрдпрд╛рдВрдЪреА рд╢рд┐рдбреА рдЖрдгрд┐ рд╕рд╛рдзрдирдкреЗрдЯреА.