برنامه نویسی

Balancer Load 101: یک راهنمای عملی در صورتی که برنامه شما یک شبه ویروسی شود

این را تصویر کنید: شما یک برنامه شگفت انگیز ایجاد کرده اید که ناگهان یک شبه ویروسی می شود. هزاران نفر از کاربر در آن جاری می شوند ، و سرور یک بار Zippy شما مانند کسی که تصمیم به اجرای ماراتن بدون آموزش گرفت ، شروع به نفس کشیدن می کند. برنامه شما به خزیدن کند می شود ، بارها و بارها خراب می شود و کاربران خروج مخوف را شروع می کنند. این کابوس دیجیتال دقیقاً همان چیزی است که ترازو بار برای جلوگیری از طراحی طراحی شده اند.

فهرست مطالب

متعادل کننده بار چیست؟

-> هادی ترافیک دیجیتال

به یک متعادل کننده بار فکر کنید به عنوان کارآمدترین هادی ترافیک جهان که در یک تقاطع شلوغ ایستاده است. در حالی که ممکن است یک جاده واحد با اتومبیل های زیادی روبرو شود ، این هادی به طرز ماهرانه ای وسایل نقلیه را به مسیرهای کمتر پر ازدحام سوق می دهد و اطمینان می دهد که همه افراد بدون اینکه در ناامیدی قرار بگیرند به مقصد خود می رسند.

از نظر فنی ، یک متعادل کننده بار بین کاربران و سرورهای برنامه شما قرار دارد و با هوشمندی درخواست های ورودی را در چندین نمونه سرور توزیع می کند. این تضمین نمی کند که هیچ سرور منفرد از سنبله ترافیک برخوردار نباشد ، دقیقاً مانند این که چگونه از یک نفر نمی خواهید که در هنگام داشتن پنج دوست برای کمک به یک پیانو در طبقه بالا حمل کند.

چرا برنامه شما به یک متعادل کننده بار نیاز دارد (قبل از اینکه خیلی دیر شود)

  1. از آغوش مرگ زنده بمانید: هنگامی که ایده درخشان شما به صفحه اول برخورد می کند و هزاران بازدید کننده کنجکاو به طور همزمان از برنامه شما بازدید می کنند ، یک متعادل کننده بار به جای تماشای سرور شما به طرز تماشایی ، همه چیز را به راحتی انجام می دهد.

  2. عملکرد بالا را حفظ کنید: کاربران سایتهایی را که بیش از 3 ثانیه طول می کشد ، رها می کنند. یک متعادل کننده بار درخواست هایی را برای اطمینان از زمان پاسخگویی به اندازه کافی سریع می گذارد که حتی بی تاب ترین کاربران وقت لازم برای دستیابی به دکمه پشت خود را ندارند.

  3. هنگامی که سرورها Tantrums را پرتاب می کنند ، انعطاف پذیر باشید: سرورها سقوط می کنند. این یک واقعیت ناگوار از زندگی دیجیتال است. هنگامی که یک سرور پایین می رود و یکپارچه ترافیک را به سمت سرورهای سالم هدایت می کند ، یک متعادل کننده بار متوجه می شود ، بنابراین کاربران هرگز پیام “اتصال مخوف” را تجربه نمی کنند.

  4. مقیاس بدون وحشت: با رشد پایه کاربر ، به سادگی سرورهای بیشتری را به استخر خود اضافه کنید. بالانسر بار آنها را به طور خودکار درج می کند ، مانند اضافه کردن خطوط پرداخت بیشتر در یک فروشگاه مواد غذایی شلوغ.

چگونه متعادل کننده ها جادوی خود را کار می کنند

توازن بار از الگوریتم های توزیع استفاده می کند که باعث می شود ریاضیدانان لبخند بزنند. در اینجا چند مورد از محبوب ترین آنها وجود دارد:

  • رابین گرد: تصور کنید که والدینی که کارهای خود را به طور مساوی در بین کودکان توزیع می کند. “شما ظروف را می شکنید ، خلاء می کنید ، سطل زباله را بیرون می آورید ، و اکنون برای لباسشویی به شما باز می گردید.” ساده ، منصفانه و مؤثر برای سرورهایی با قابلیت های مشابه.

  • حداقل اتصالات: این مانند انتخاب خط پرداخت با کمترین خریداران است. Balancer Load درخواست های جدیدی را به سرورهایی که کمترین اتصالات فعال را اداره می کنند ، ارسال می کند و مانع از تبدیل شدن هر سرور واحد به سرپرست کاری بدشانس می شود.

ساختن اولین بالانسر بار خود: یک راهنمای عملی

بیایید دستان خود را کثیف کنیم و با استفاده از یک تنظیم متعادل کننده بار ساده اما قدرتمند بسازیم چیز کوچک وت node.jsبشر در پایان این بخش ، یک سیستم کاری خواهید داشت که اصول متعادل کننده بار را در عمل نشان می دهد.

مرحله 1: هادی ترافیک خود را نصب کنید (NGINX)

اول ، ما باید nginx ، maestro تعادل بار خود را نصب کنیم:

  brew install nginx
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  sudo apt update
  sudo apt install nginx
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 2: چندین سرور یکسان ایجاد کنید (node.js)

حال بیایید برخی از سرورهای برنامه یکسان ایجاد کنیم که درخواست های کاربر ما را کنترل کنند:

  1. ایجاد یک خانه پروژه:
   mkdir load-balancer-lab
   cd load-balancer-lab
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. یک سرور ساده ایجاد کنید (app.js) این خود را برای بازدید کنندگان شناسایی می کند:
   const http = require('http');

   // Get port from environment or default to 3000
   const port = process.env.PORT || 3000;

   // Create our humble server
   const server = http.createServer((req, res) => {
       // Send a response that identifies which server instance responded
       res.writeHead(200, { 'Content-Type': 'text/plain' });
       res.end(`Hello! I'm the server running on port ${port}. At your service!\n`);
   });

   // Start listening for requests
   server.listen(port, () => {
       console.log(`Server #${port - 3000 + 1} is alive and listening on port ${port}`);
   });
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. سه نمونه سرور یکسان را شروع کنید ، هر کدام در درگاه متفاوت:
   PORT=3000 node app.js
   # Open a new terminal window
   PORT=3001 node app.js
   # Open another terminal window
   PORT=3002 node app.js
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 3: nginx را به عنوان maestro تعادل بار خود پیکربندی کنید

اکنون ما در مورد نمونه های سرور خود به NGINX می گوییم و آن را پیکربندی می کنیم تا ترافیک بین آنها توزیع شود:

  1. پرونده پیکربندی NGINX را باز کنید:

    • در MACOS: sudo nano /usr/local/etc/nginx/nginx.conf
    • در لینوکس: sudo nano /etc/nginx/nginx.conf
  2. پیکربندی زیر را جایگزین یا اضافه کنید:

   http {
       # Include mime types (important to keep this if it exists in your file)
       include       mime.types;
       default_type  application/octet-stream;

       # Define our group of application servers
       upstream application_servers {
           server 127.0.0.1:3000;  # Server #1
           server 127.0.0.1:3001;  # Server #2
           server 127.0.0.1:3002;  # Server #3

           # Using round robin by default - simple but effective!
       }

       # Configure our web server
       server {
           listen 80;  # Listen on the standard HTTP port

           location / {
               # Pass requests to our application servers
               proxy_pass http://application_servers;

               # Forward important 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;

               # Add a custom header to see load balancing in action
               add_header X-Load-Balanced "Yes, magic is happening!";
           }
       }
   }

   # Don't forget to keep the events block if it exists
   events {
       worker_connections 1024;
   }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. پیکربندی خود را آزمایش کرده و nginx را مجدداً راه اندازی کنید:

     nginx -t  # Test the configuration
     brew services restart nginx  # Restart Nginx
    

مرحله 4: شاهد سمفونی متعادل کننده بار باشید

حالا برای لحظه حقیقت! بیایید متعادل کننده بار ما را در عمل ببینیم:

  1. ترمینال خود را باز کنید و این دستور را اجرا کنید تا چندین درخواست ارائه دهید:
   for i in {1..10}; do curl http://localhost; echo; done
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. مشاهده کنید که چگونه هر درخواست توسط یک نمونه سرور متفاوت انجام می شود. شما باید پاسخ هایی را ببینید که بین سه سرور خود می چرخد ​​، ثابت می کند که NGINX درخواست ها را در همه موارد توزیع می کند.

  2. برای یک تجربه بصری ، مرورگر خود را باز کرده و به سمت آن حرکت کنید http://localhostبشر چندین بار تازه کنید و تغییر شناسایی سرور را تماشا کنید.

از پروژه Hobby گرفته تا Enterprise-آماده: کانتینر با Docker

بیایید راه اندازی خود را از یک آزمایش محلی به چیزی که می تواند در تولید با استفاده از آن اجرا شود ، بالا ببریم اسکله وت داکر آهنگسازیبشر

مرحله 1: برای برنامه خود یک dockerfile ایجاد کنید

ابتدا بیایید برنامه node.js خود را کانتینر کنیم:

# Start with a lightweight Node.js image
FROM node:16-alpine

# Set the working directory inside the container
WORKDIR /app

# Create a non-root user for security
RUN adduser -D nodeuser

# Create a package.json (not strictly needed for our simple app, but good practice)
RUN echo '{"name":"load-balanced-app","version":"1.0.0","main":"app.js"}' > package.json

# Copy our application code
COPY app.js .

# Switch to the non-root user
USER nodeuser

# Tell Docker which port the application uses
EXPOSE 3000

# Command to run when the container starts
CMD ["node", "app.js"]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 2: پیکربندی آهنگسازی Docker را ایجاد کنید

حال ، بیایید تنظیمات چند کانتینر خود را با آهنگسازی Docker تعریف کنیم:

version: '3.8'

services:
  # First application server
  app1:
    build: .
    environment:
      - PORT=3000
      - SERVER_NAME=Speedy
    restart: always
    networks:
      - loadbalancer-net

  # Second application server  
  app2:
    build: .
    environment:
      - PORT=3000
      - SERVER_NAME=Zippy
    restart: always
    networks:
      - loadbalancer-net

  # Third application server
  app3:
    build: .
    environment:
      - PORT=3000
      - SERVER_NAME=Nimble
    restart: always
    networks:
      - loadbalancer-net

  # Nginx load balancer
  loadbalancer:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    restart: always
    depends_on:
      - app1
      - app2
      - app3
    networks:
      - loadbalancer-net

networks:
  loadbalancer-net:
    driver: bridge
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 3: یک پیکربندی اختصاصی nginx ایجاد کنید

بیایید app.js خود را به روز کنیم تا از متغیر محیط server_name استفاده کنیم:

const http = require('http');

const port = process.env.PORT || 3000;
const serverName = process.env.SERVER_NAME || `Server-${port}`;

const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`Hello from ${serverName}!\nRequest handled at: ${new Date().toISOString()}\n`);
});

server.listen(port, () => {
    console.log(`${serverName} is running on port ${port}`);
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

یک پرونده به نام ایجاد کنید nginx.conf در پوشه پروژه خود:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '"$upstream_addr" "$upstream_response_time"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    # Load balancing configuration
    upstream app_servers {
        # Least connections algorithm - adapts better to varying load
        least_conn;

        server app1:3000;
        server app2:3000;
        server app3:3000;

        # Enable session persistence (optional)
        # ip_hash;

        # Health checks and slow-start for production
        # server app1:3000 max_fails=3 fail_timeout=30s slow_start=30s;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://app_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # Add useful headers for debugging
            add_header X-Load-Balanced "Yes";
            add_header X-Upstream-Server $upstream_addr;
            add_header X-Response-Time $upstream_response_time;
        }

        # Health check endpoint for monitoring tools
        location /health {
            return 200 'Load balancer is healthy!';
            add_header Content-Type text/plain;
        }
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 4: برنامه متعادل بار کانتینر شده خود را راه اندازی کنید

حال ، بیایید تنظیمات کانتینر شده خود را مستقر کنیم:

# Build and start the containers
docker-compose up --build -d

# Watch the logs to see requests being distributed
docker-compose logs -f loadbalancer
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای آزمایش متعادل کننده بار ، مرورگر خود را باز کنید http://localhost و چندین بار تازه کنید ، یا از Curl استفاده کنید:

for i in {1..20}; do curl http://localhost; sleep 0.5; done
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مقیاس برای رسیدگی به یک راه اندازی ویروسی: رفتن به ابر بومی

هنگامی که برنامه شما به طور ناگهانی نیاز به اداره هزاران کاربر همزمان دارد ، وقت آن است که با استفاده از Kubernetes ، تنظیمات کانتینر شده خود را به ابر برسانیم ، استاندارد صنعت برای برنامه های کانتینر شده ارکستر در مقیاس.

مرحله 1: تصویر Docker خود را به یک رجیستری فشار دهید

ابتدا باید تصویر خود را در دسترس خدمات ابری قرار دهیم:

# Log in to Docker Hub
docker login

# Tag your image
docker build -t yourusername/load-balanced-app:latest .

# Push to Docker Hub
docker push yourusername/load-balanced-app:latest
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 2: استقرار Kubernetes خود را تعریف کنید

یک پرونده به نام ایجاد کنید k8s-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  labels:
    app: load-balanced-app
spec:
  replicas: 5  # Start with 5 instances
  selector:
    matchLabels:
      app: load-balanced-app
  template:
    metadata:
      labels:
        app: load-balanced-app
    spec:
      containers:
      - name: app
        image: yourusername/load-balanced-app:latest
        ports:
        - containerPort: 3000
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 256Mi
        readinessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 15
          periodSeconds: 20
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 3: یک سرویس Kubernetes ایجاد کنید

یک پرونده به نام ایجاد کنید k8s-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: load-balanced-app
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer  # Exposes your app with a public IP
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 4: مقیاس خودکار را تنظیم کنید

یک پرونده به نام ایجاد کنید k8s-autoscaler.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-autoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app-deployment
  minReplicas: 5
  maxReplicas: 100  # Scale up to 100 pods if needed
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70  # Scale up when CPU usage reaches 70%
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80  # Scale up when memory usage reaches 80%
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 5: استقرار به Kubernetes

# Apply your configurations
kubectl apply -f k8s-deployment.yaml
kubectl apply -f k8s-service.yaml
kubectl apply -f k8s-autoscaler.yaml

# Check the status of your deployment
kubectl get deployments
kubectl get pods
kubectl get services

# Get the external IP to access your application
kubectl get service app-service
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استراتژی های تعادل بار پیشرفته برای جاه طلب

پس از تسلط بر اصول ، این تکنیک های پیشرفته را در نظر بگیرید:

  1. متعادل کننده بار وزنه برداری: به سرورهای قدرتمندتر سهم بیشتری از ترافیک بدهید:
   upstream weighted_servers {
       server app1:3000 weight=5;  # This server gets 5x more traffic
       server app2:3000 weight=3;
       server app3:3000 weight=1;  # This server gets the least traffic
   }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. جلسات چسبنده: اطمینان حاصل کنید که درخواست های کاربر همیشه به همان سرور بروید:
   upstream sticky_servers {
       ip_hash;  # Routes based on client IP
       server app1:3000;
       server app2:3000;
       server app3:3000;
   }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. بررسی های بهداشتی هوشمند: به طور خودکار سرورهای ناسالم را حذف کنید:
   upstream smart_servers {
       server app1:3000 max_fails=3 fail_timeout=30s;
       server app2:3000 max_fails=3 fail_timeout=30s;
       server app3:3000 max_fails=3 fail_timeout=30s;
   }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان کابوس های سرور: نتیجه گیری

تعادل بار فقط یک راه حل فنی نیست – این آرامش خاطر است. هنگامی که درخواست شما به طور ناگهانی معادل دیجیتالی فروش جمعه سیاه می شود ، خوشحال می شوید که وقت خود را برای ایجاد یک زیرساخت مناسب تعادل بار گرفتید.

این که آیا شما یک وبلاگ کوچک ، یک فروشگاه تجارت الکترونیکی یا احساس رسانه های اجتماعی بعدی را اداره می کنید ، اصول موجود در این راهنما به شما کمک می کند تا برنامه ای ایجاد کنید که مهم نیست که چقدر محبوب شود ، پاسخگو باشد.

به یاد داشته باشید: در دنیای دیجیتال ، موفقیت بعضی اوقات می تواند به طرز مشکوکی مانند حمله انکار سرویس به نظر برسد. با اجرای تعادل بار قبل از نیاز به آن آماده شوید ، و هرگز مجبور نخواهید شد از کاربران بخاطر قربانی موفقیت خود عذرخواهی کنید.

اکنون بروید و آن بارها را متعادل کنید! سرورهای شما – و کاربران شما – از شما متشکرم. 🚦🚀


راهنمای عیب یابی سریع

مشکل: nginx شروع نمی شود

راه حل: پیکربندی خود را با بررسی کنید nginx -t و به دنبال خطاهای نحوی باشید

مشکل: نمی بینید که درخواست هایی به طور مساوی توزیع می شوند

راه حل: بررسی کنید که جلسات چسبنده فعال شده است یا اینکه الگوریتم شما وزنی است

مشکل: ظروف نمی توانند ارتباط برقرار کنند

راه حل: اطمینان حاصل کنید که آنها در همان شبکه Docker هستند که در Docker-Compose.yml تعریف شده است

مشکل: غلافهای Kubernetes در حال خراب شدن هستند

راه حل: سیاهههای مربوط به غلاف را با آن بررسی کنید kubectl logs pod-name و اطمینان حاصل کنید که پروب های آمادگی شما به درستی پیکربندی شده است

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا