دو 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 .