System Design

Load Balancing

Load Balancer — trafikni bir nechta serverlar o’rtasida taqsimlaydigan tizim komponenti.

Muammo

Bitta server million foydalanuvchiga xizmat qila olmaydi:

              ┌─────────┐
1M users ───→ │ Server  │ ←  Overloaded!
              └─────────┘

Natija:

Yechim: Load Balancer

                ┌─────────────┐
                │    Load     │
     Users ───→ │  Balancer   │
                └──────┬──────┘

       ┌───────────────┼───────────────┐
       ▼               ▼               ▼
   ┌───────┐       ┌───────┐       ┌───────┐
   │Server1│       │Server2│       │Server3│
   └───────┘       └───────┘       └───────┘
   300K users      400K users      300K users

Har bir server 300-400K foydalanuvchiga xizmat → barchasi yaxshi ishlaydi

Load Balancing algoritmlari

1. Round Robin

Navbat bilan serverga yuborish:

Request 1 → Server 1
Request 2 → Server 2
Request 3 → Server 3
Request 4 → Server 1 (qaytadan)

Afzalliklari:

Kamchiliklari:

2. Weighted Round Robin

Kuchli serverga ko’proq trafik:

Server 1 (8 CPU):  40% trafik
Server 2 (4 CPU):  20% trafik
Server 3 (8 CPU):  40% trafik

Qachon: Serverlar turli konfiguratsiyada

3. Least Connections

Eng kam ulanishli serverga yuborish:

Server 1: 100 connections
Server 2: 50 connections  ← Bu yerga yuboradi
Server 3: 80 connections

Afzalliklari:

Qachon: WebSocket, streaming, file uploads

4. Least Response Time

Eng tez javob bergan serverga yuborish:

Server 1: 100ms avg
Server 2: 50ms avg   ← Bu yerga yuboradi
Server 3: 150ms avg

Afzalliklari:

Kamchiliklari:

5. IP Hash

User IP asosida bitta serverga biriktirish:

hash(192.168.1.1) % 3 = 0 → Server 1
hash(192.168.1.2) % 3 = 1 → Server 2
hash(192.168.1.3) % 3 = 2 → Server 3

Afzalliklari:

Kamchiliklari:

Layer 4 vs Layer 7 Load Balancing

Layer 4 (Transport Layer)

IP va Port asosida routing:

Client → LB → Server

         └─ IP: 192.168.1.1, Port: 443

Afzalliklari:

Kamchiliklari:

Ishlatiladi: TCP/UDP traffic, high performance kerak

Layer 7 (Application Layer)

HTTP content asosida routing:

example.com/api    → API Servers
example.com/static → Static File Servers
example.com/admin  → Admin Servers

Afzalliklari:

Kamchiliklari:

Ishlatiladi: HTTP/HTTPS, microservices

Health Checks

Load balancer serverlar “tirik” yoki yo’qligini tekshiradi:

// Har 10 sekundda
GET /health → Server 1
  200 OK → Trafikni yuboradi

GET /health → Server 2
  Timeout → Trafikni yubormaydi

Health check endpoint:

// Express.js
app.get('/health', (req, res) => {
  // Database ulanish
  // Cache ulanish
  // Disk bo'sh joy
  if (allGood) {
    res.status(200).send('OK');
  } else {
    res.status(503).send('Unhealthy');
  }
});

Session Persistence (Sticky Sessions)

Muammo: User login qildi → Server 1 (session saqlandi) → Keyingi request → Server 2 (session yo’q!)

Yechim 1: Sticky Sessions

User ilk marta → Server 1
User keyingi safar → Server 1 (har doim)

Qanday:

Kamchiliklari:

Yechim 2: Shared Session Store (Yaxshiroq!)

User → Server 1 → Redis (session)
User → Server 2 → Redis (bir xil session) 

Stateless serverlar + centralized session = ideal.

High Availability

Load balancer o’zi single point of failure bo’lmaslik kerak:

Active-Passive

      ┌─────────────┐
      │ LB Primary  │ Active
      └─────────────┘

      ┌─────────────┐
      │ LB Secondary│ 💤 Standby
      └─────────────┘

Primary ishlamasa → Secondary aktivlanadi (30-60 sekund)

Active-Active

      ┌─────────────┐
      │ LB Primary  │ 50% traffic
      └─────────────┘

      ┌─────────────┐
      │ LB Secondary│ 50% traffic
      └─────────────┘

Ikkalasi ham ishlaydi → 0 downtime

Load Balancer texnologiyalari

Hardware Load Balancers

Software Load Balancers

Cloud Load Balancers

Nginx misoli

upstream backend {
    # Least connections algoritm
    least_conn;
    
    # Serverlar
    server server1.example.com weight=3;
    server server2.example.com weight=2;
    server server3.example.com weight=1;
    
    # Health check
    server server4.example.com max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    
    location / {
        proxy_pass http://backend;
        
        # Headers
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Global Load Balancing (DNS)

Foydalanuvchini eng yaqin data centerga yo’naltirish:

US user      → US data center
Europe user  → Europe data center
Asia user    → Asia data center

Qanday:

Real-world misollar

Netflix

Instagram

Facebook

Best Practices

  1. Health checks o’rnating — 10-30s interval
  2. Monitoring qo’ying — latency, error rate, connections
  3. Auto-scaling qiling — traffic spike’larga tayyor bo’ling
  4. Multi-AZ deploy — single data center failure
  5. Session external saqlang — Redis/Memcached
  6. SSL termination — load balancerda qiling
  7. Timeouts sozlang — hang qilgan requestlarni kesing

Xulosa

Load Balancer:

Asosiy algoritmlar:

Layer:

Keyingi dars: Vertical vs Horizontal Scaling strategiyalari.