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

این را تصویر کنید: شما یک برنامه شگفت انگیز ایجاد کرده اید که ناگهان یک شبه ویروسی می شود. هزاران نفر از کاربر در آن جاری می شوند ، و سرور یک بار Zippy شما مانند کسی که تصمیم به اجرای ماراتن بدون آموزش گرفت ، شروع به نفس کشیدن می کند. برنامه شما به خزیدن کند می شود ، بارها و بارها خراب می شود و کاربران خروج مخوف را شروع می کنند. این کابوس دیجیتال دقیقاً همان چیزی است که ترازو بار برای جلوگیری از طراحی طراحی شده اند.
متعادل کننده بار چیست؟
-> هادی ترافیک دیجیتال
به یک متعادل کننده بار فکر کنید به عنوان کارآمدترین هادی ترافیک جهان که در یک تقاطع شلوغ ایستاده است. در حالی که ممکن است یک جاده واحد با اتومبیل های زیادی روبرو شود ، این هادی به طرز ماهرانه ای وسایل نقلیه را به مسیرهای کمتر پر ازدحام سوق می دهد و اطمینان می دهد که همه افراد بدون اینکه در ناامیدی قرار بگیرند به مقصد خود می رسند.
از نظر فنی ، یک متعادل کننده بار بین کاربران و سرورهای برنامه شما قرار دارد و با هوشمندی درخواست های ورودی را در چندین نمونه سرور توزیع می کند. این تضمین نمی کند که هیچ سرور منفرد از سنبله ترافیک برخوردار نباشد ، دقیقاً مانند این که چگونه از یک نفر نمی خواهید که در هنگام داشتن پنج دوست برای کمک به یک پیانو در طبقه بالا حمل کند.
چرا برنامه شما به یک متعادل کننده بار نیاز دارد (قبل از اینکه خیلی دیر شود)
-
از آغوش مرگ زنده بمانید: هنگامی که ایده درخشان شما به صفحه اول برخورد می کند و هزاران بازدید کننده کنجکاو به طور همزمان از برنامه شما بازدید می کنند ، یک متعادل کننده بار به جای تماشای سرور شما به طرز تماشایی ، همه چیز را به راحتی انجام می دهد.
-
عملکرد بالا را حفظ کنید: کاربران سایتهایی را که بیش از 3 ثانیه طول می کشد ، رها می کنند. یک متعادل کننده بار درخواست هایی را برای اطمینان از زمان پاسخگویی به اندازه کافی سریع می گذارد که حتی بی تاب ترین کاربران وقت لازم برای دستیابی به دکمه پشت خود را ندارند.
-
هنگامی که سرورها Tantrums را پرتاب می کنند ، انعطاف پذیر باشید: سرورها سقوط می کنند. این یک واقعیت ناگوار از زندگی دیجیتال است. هنگامی که یک سرور پایین می رود و یکپارچه ترافیک را به سمت سرورهای سالم هدایت می کند ، یک متعادل کننده بار متوجه می شود ، بنابراین کاربران هرگز پیام “اتصال مخوف” را تجربه نمی کنند.
-
مقیاس بدون وحشت: با رشد پایه کاربر ، به سادگی سرورهای بیشتری را به استخر خود اضافه کنید. بالانسر بار آنها را به طور خودکار درج می کند ، مانند اضافه کردن خطوط پرداخت بیشتر در یک فروشگاه مواد غذایی شلوغ.
چگونه متعادل کننده ها جادوی خود را کار می کنند
توازن بار از الگوریتم های توزیع استفاده می کند که باعث می شود ریاضیدانان لبخند بزنند. در اینجا چند مورد از محبوب ترین آنها وجود دارد:
-
رابین گرد: تصور کنید که والدینی که کارهای خود را به طور مساوی در بین کودکان توزیع می کند. “شما ظروف را می شکنید ، خلاء می کنید ، سطل زباله را بیرون می آورید ، و اکنون برای لباسشویی به شما باز می گردید.” ساده ، منصفانه و مؤثر برای سرورهایی با قابلیت های مشابه.
-
حداقل اتصالات: این مانند انتخاب خط پرداخت با کمترین خریداران است. Balancer Load درخواست های جدیدی را به سرورهایی که کمترین اتصالات فعال را اداره می کنند ، ارسال می کند و مانع از تبدیل شدن هر سرور واحد به سرپرست کاری بدشانس می شود.
ساختن اولین بالانسر بار خود: یک راهنمای عملی
بیایید دستان خود را کثیف کنیم و با استفاده از یک تنظیم متعادل کننده بار ساده اما قدرتمند بسازیم چیز کوچک وت node.jsبشر در پایان این بخش ، یک سیستم کاری خواهید داشت که اصول متعادل کننده بار را در عمل نشان می دهد.
مرحله 1: هادی ترافیک خود را نصب کنید (NGINX)
اول ، ما باید nginx ، maestro تعادل بار خود را نصب کنیم:
brew install nginx
sudo apt update
sudo apt install nginx
مرحله 2: چندین سرور یکسان ایجاد کنید (node.js)
حال بیایید برخی از سرورهای برنامه یکسان ایجاد کنیم که درخواست های کاربر ما را کنترل کنند:
- ایجاد یک خانه پروژه:
mkdir load-balancer-lab
cd load-balancer-lab
- یک سرور ساده ایجاد کنید (
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}`);
});
- سه نمونه سرور یکسان را شروع کنید ، هر کدام در درگاه متفاوت:
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 می گوییم و آن را پیکربندی می کنیم تا ترافیک بین آنها توزیع شود:
-
پرونده پیکربندی NGINX را باز کنید:
- در MACOS:
sudo nano /usr/local/etc/nginx/nginx.conf
- در لینوکس:
sudo nano /etc/nginx/nginx.conf
- در MACOS:
-
پیکربندی زیر را جایگزین یا اضافه کنید:
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;
}
-
پیکربندی خود را آزمایش کرده و nginx را مجدداً راه اندازی کنید:
nginx -t # Test the configuration brew services restart nginx # Restart Nginx
مرحله 4: شاهد سمفونی متعادل کننده بار باشید
حالا برای لحظه حقیقت! بیایید متعادل کننده بار ما را در عمل ببینیم:
- ترمینال خود را باز کنید و این دستور را اجرا کنید تا چندین درخواست ارائه دهید:
for i in {1..10}; do curl http://localhost; echo; done
-
مشاهده کنید که چگونه هر درخواست توسط یک نمونه سرور متفاوت انجام می شود. شما باید پاسخ هایی را ببینید که بین سه سرور خود می چرخد ، ثابت می کند که NGINX درخواست ها را در همه موارد توزیع می کند.
-
برای یک تجربه بصری ، مرورگر خود را باز کرده و به سمت آن حرکت کنید
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
استراتژی های تعادل بار پیشرفته برای جاه طلب
پس از تسلط بر اصول ، این تکنیک های پیشرفته را در نظر بگیرید:
- متعادل کننده بار وزنه برداری: به سرورهای قدرتمندتر سهم بیشتری از ترافیک بدهید:
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
}
- جلسات چسبنده: اطمینان حاصل کنید که درخواست های کاربر همیشه به همان سرور بروید:
upstream sticky_servers {
ip_hash; # Routes based on client IP
server app1:3000;
server app2:3000;
server app3:3000;
}
- بررسی های بهداشتی هوشمند: به طور خودکار سرورهای ناسالم را حذف کنید:
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
و اطمینان حاصل کنید که پروب های آمادگی شما به درستی پیکربندی شده است