انجیناکس؛ شب ۲۵: upstream، توزیع بار و خرابی عضو
فهرست نوشته
دو backend ظرفیت و امکان ادامهٔ سرویس میدهند، ولی وضعیت نشست و عملیات نیمهتمام خودکار حل نمیشود. امشب توزیع درخواست و failover را با شواهد بررسی میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: backend A روی 8080 و B روی 8081، هرکدام http.server محلی و پوشهٔ مستقل با متن متفاوت؛ config TLS داخلی بازیابی شده باشد.
گروه upstream#
در یک ترمینال جدا روی وبسرور، backend B را بساز و اجرا کن؛ A شب ۲۲ باید همچنان روی 8080 فعال باشد:
mkdir -p ~/nginx-lab/backend-b
printf '%s\n' 'backend B' > ~/nginx-lab/backend-b/index.html
"$LAB_PYTHON" -m http.server 8081 --bind 127.0.0.1 --directory ~/nginx-lab/backend-b
در http:
upstream lab_app {
server 127.0.0.1:8080 max_fails=1 fail_timeout=5s;
server 127.0.0.1:8081 max_fails=1 fail_timeout=5s;
keepalive 8;
}
در location ریشهٔ app:
proxy_pass http://lab_app;
proxy_http_version 1.1;
include /etc/nginx/snippets/lab-proxy-headers.conf;
proxy_set_header Connection "";
proxy_next_upstream error timeout http_502 http_503 http_504;
اینها جای نگاشت قبلی مینشینند. keepalive تعداد اتصال بیکار upstream است و سقف کل اتصال نیست. الگوریتم پیشفرض توزیع با وزنها کار میکند؛ برای نیاز مشخص میتوان least_conn را بررسی کرد.
آزمون عضو خراب#
چند GET تازه از کلاینت بفرست و upstream_addr و پاسخ A/B را ثبت کن. A را متوقف کن، زمان خطا و انتقال درخواستهای مجاز به B را ببین؛ پس از fail_timeout، برگشت A را هم آزمایش کن. ترتیب دقیق پاسخ را تضمین نکن.
تشخیص این نمونه منفعل و مبتنی بر درخواست واقعی است. health_check فعال را از راهنمای Nginx Plus کور به Open Source منتقل نکن؛ edition و قابلیت باید مشخص باشد. endpoint سلامت هم باید واقعاً نیاز برنامه را بسنجد.
تمرین: تکرار GET با تکرار پرداخت POST چه تفاوتی دارد؟ گزینهٔ non_idempotent را برای retry خودکار اضافه نمیکنیم؛ برنامه باید idempotency، یعنی تکرار بدون اثر اضافی، را طراحی کند. نشست مشترک یا پایدار نیز مسئولیت برنامه است.
بازگشت: نگاشت تکbackend را بازیابی، upstream اضافی را از http بردار و B را متوقف کن.
منبع: upstream ، proxy_next_upstream .