Load Balancer چیست و چرا اهمیت دارد؟
فرض کنید وارد یک فروشگاه اینترنتی بزرگ شدهاید و قرار است یک محصول محبوب را خریداری کنید. ناگهان به دلیل یک تخفیف ویژه، هزاران نفر همزمان وارد سایت میشوند.
اگر تمام این کاربران به یک سرور متصل شوند، چه اتفاقی میافتد؟
سرور ممکن است بیش از حد شلوغ شود، پاسخدهی آن کاهش پیدا کند و در نهایت حتی از دسترس خارج شود. در این شرایط، حتی اگر سرور از نظر سختافزاری قدرتمند باشد، باز هم تعداد زیادی درخواست همزمان میتواند آن را تحت فشار قرار دهد.
اینجاست که مفهومی به نام Load Balancer یا متعادلکننده بار وارد میشود.
اما Load Balancer دقیقاً چیست و چگونه باعث میشود سایتها و سرویسهای بزرگ بتوانند هزاران یا میلیونها درخواست را مدیریت کنند؟
Load Balancer چیست؟
Load Balancer یک سیستم یا سرویس است که درخواستهای کاربران را بین چند سرور مختلف تقسیم میکند تا بار کاری روی یک سرور متمرکز نشود.
به زبان ساده:
Load Balancer مانند یک مسئول تقسیم کار است که درخواستهای ورودی را بین سرورهای مختلف توزیع میکند.
برای مثال فرض کنید یک سایت سه سرور دارد:
Server 1
Server 2
Server 3
کاربر مستقیماً به یکی از این سرورها متصل نمیشود. ابتدا درخواست او به Load Balancer میرسد.
Load Balancer بررسی میکند که درخواست را به کدام سرور ارسال کند و سپس آن را به یکی از سرورها منتقل میکند.
مثلاً:
کاربران
↓
Load Balancer
↙ ↓ ↘
Server 1 Server 2 Server 3
در نتیجه، به جای اینکه تمام کاربران به یک سرور فشار وارد کنند، درخواستها بین چند سرور تقسیم میشوند.
یک مثال ساده؛ رستوران شلوغ
فرض کنید یک رستوران محبوب فقط یک صندوق دارد.
در ساعات شلوغی، ۵۰ نفر باید در یک صف منتظر بمانند.
حالا تصور کنید رستوران سه صندوق داشته باشد.
یک نفر مسئول هدایت مشتریان است و هر مشتری را به یکی از صندوقهای خلوتتر میفرستد.
در این حالت:
مشتریان
↓
مسئول تقسیم صف
↙ ↓ ↘
صندوق 1 صندوق 2 صندوق 3
صفها کوتاهتر میشوند و مشتریان سریعتر خدمات دریافت میکنند.
Load Balancer نیز تقریباً همین کار را برای سرورها انجام میدهد.
البته در دنیای واقعی، تصمیمگیری Load Balancer بر اساس قوانین و الگوریتمهای مختلف انجام میشود.
چرا به Load Balancer نیاز داریم؟
در پروژههای کوچک ممکن است یک سرور بتواند تمام درخواستهای کاربران را مدیریت کند.
اما وقتی یک برنامه رشد میکند، شرایط تغییر میکند.
برای مثال یک فروشگاه اینترنتی را تصور کنید که در حالت عادی روزانه ۱۰ هزار کاربر دارد، اما در زمان یک حراج بزرگ ناگهان تعداد کاربران به چند صد هزار نفر میرسد.
در این شرایط یک سرور ممکن است نتواند تمام درخواستها را بهموقع پردازش کند.
Load Balancer کمک میکند درخواستها بین چند سرور توزیع شوند.
بنابراین میتوانیم به جای:
10000 درخواست
↓
یک سرور
داشته باشیم:
10000 درخواست
↓
Load Balancer
↙ ↓ ↘
Server 1 Server 2 Server 3
Load Balancer چگونه کار میکند؟
فرایند کلی بسیار ساده است.
وقتی کاربر وارد یک سایت یا سرویس میشود، درخواست او ابتدا به Load Balancer میرسد.
Load Balancer سپس با توجه به الگوریتم مورد استفاده، یکی از سرورها را انتخاب میکند.
برای مثال:
کاربر
↓
Load Balancer
↓
Server 2
↓
پاسخ
↓
کاربر
اگر کاربر دیگری درخواست مشابهی ارسال کند، ممکن است Load Balancer این بار Server 1 یا Server 3 را انتخاب کند.
نکته مهم این است که کاربر معمولاً نیازی ندارد بداند درخواستش دقیقاً توسط کدام سرور پردازش شده است.
از دید کاربر، همه چیز مثل یک سایت یا سرویس واحد به نظر میرسد.
الگوریتمهای Load Balancing چیست؟
Load Balancer برای انتخاب سرور مناسب میتواند از الگوریتمهای مختلفی استفاده کند.
چند مورد از معروفترین آنها عبارتاند از:
1. Round Robin
در روش Round Robin، درخواستها به ترتیب بین سرورها تقسیم میشوند.
مثلاً اگر سه سرور داشته باشیم:
Request 1 → Server 1
Request 2 → Server 2
Request 3 → Server 3
Request 4 → Server 1
Request 5 → Server 2
Request 6 → Server 3
این روش ساده است و زمانی مناسب است که سرورها تقریباً ظرفیت مشابهی داشته باشند.
2. Least Connections
در روش Least Connections، Load Balancer سروری را انتخاب میکند که در حال حاضر تعداد اتصال فعال کمتری دارد.
مثلاً:
Server 1 → 120 اتصال
Server 2 → 70 اتصال
Server 3 → 35 اتصال
در این شرایط، احتمال دارد درخواست جدید به Server 3 ارسال شود.
این روش در سیستمهایی که تعداد و مدت زمان اتصال کاربران متفاوت است، میتواند بسیار مفید باشد.
3. Weighted Load Balancing
همه سرورها الزاماً قدرت یکسانی ندارند.
فرض کنید:
Server 1 → قدرتمند
Server 2 → متوسط
Server 3 → ضعیفتر
در این شرایط میتوان برای سرورها وزنهای متفاوتی تعیین کرد تا سرور قدرتمندتر درخواستهای بیشتری دریافت کند.
مثلاً:
Server 1 → Weight: 5
Server 2 → Weight: 3
Server 3 → Weight: 2
در نتیجه توزیع درخواستها متناسب با ظرفیت سرورها انجام میشود.
Load Balancer فقط برای تقسیم درخواستهاست؟
خیر.
یکی از قابلیتهای بسیار مهم Load Balancer، بررسی سلامت سرورها یا همان Health Check است.
فرض کنید یک سایت سه سرور دارد:
Server 1 → سالم ✅
Server 2 → سالم ✅
Server 3 → خراب ❌
اگر Load Balancer متوجه شود Server 3 دیگر پاسخ مناسبی نمیدهد، میتواند درخواستهای جدید را به آن ارسال نکند.
در نتیجه:
Load Balancer
↙ ↘
Server 1 Server 2
✅ ✅
Server 3 ❌
بدون درخواست جدید
این قابلیت اهمیت بسیار زیادی دارد؛ زیرا اگر یکی از سرورها از کار بیفتد، کل سرویس الزاماً نباید از دسترس خارج شود.
Load Balancer و افزایش دسترسپذیری
یکی از مهمترین دلایل استفاده از Load Balancer، افزایش Availability یا دسترسپذیری سیستم است.
فرض کنید یک سایت فقط یک سرور داشته باشد.
اگر آن سرور خراب شود:
Server ❌
↓
سایت از دسترس خارج میشود
اما اگر چند سرور داشته باشیم:
Load Balancer
↙ ↓ ↘
Server 1 Server 2 Server 3
❌ ✅ ✅
حتی اگر Server 1 از کار بیفتد، Load Balancer میتواند درخواستها را به Server 2 و Server 3 ارسال کند.
البته این موضوع به معماری کل سیستم وابسته است و داشتن چند سرور بهتنهایی تضمین نمیکند که تمام بخشهای برنامه همیشه در دسترس باشند.
آیا Load Balancer باعث سریعتر شدن سایت میشود؟
بهصورت مستقیم نه.
Load Balancer قرار نیست سرعت پردازنده سرور را افزایش دهد یا زمان اجرای یک Query را از ۲ ثانیه به نیم ثانیه کاهش دهد.
اما میتواند با توزیع مناسب بار، از ایجاد گلوگاه روی یک سرور جلوگیری کند.
برای مثال:
بدون Load Balancer:
1000 درخواست
↓
Server 1
🔥 فشار زیاد
با Load Balancer:
1000 درخواست
↓
Load Balancer
↙ ↓ ↘
Server 1 Server 2 Server 3
330 335 335
در چنین شرایطی هر سرور بخش کوچکی از بار را پردازش میکند و سیستم میتواند عملکرد پایدارتری داشته باشد.
Load Balancer در سایتهای بزرگ
اگر از سرویسهایی مانند فروشگاههای آنلاین بزرگ، پلتفرمهای ویدئویی، شبکههای اجتماعی یا سرویسهای ابری استفاده کرده باشید، احتمالاً متوجه شدهاید که این سیستمها باید بتوانند حجم بسیار زیادی از درخواستها را مدیریت کنند.
در معماریهای بزرگ، معمولاً چندین سرور در کنار هم قرار میگیرند.
اما موضوع فقط تعداد سرورها نیست.
ممکن است معماری به شکل زیر باشد:
کاربران
↓
Load Balancer
↓
┌───────────┼───────────┐
↓ ↓ ↓
Web Server Web Server Web Server
↓ ↓ ↓
└───────────┼───────────┘
↓
Database
در معماریهای پیشرفتهتر نیز ممکن است چند لایه Load Balancing، Cache، Database، CDN و سرویسهای مختلف در کنار یکدیگر قرار بگیرند.
به همین دلیل Load Balancer یکی از مفاهیم مهم در معماری سیستمهای مقیاسپذیر محسوب میشود.
Load Balancer سختافزاری یا نرمافزاری؟
Load Balancer میتواند به شکلهای مختلف پیادهسازی شود.
Hardware Load Balancer
در این روش از تجهیزات سختافزاری اختصاصی برای مدیریت و توزیع ترافیک استفاده میشود.
این تجهیزات معمولاً در زیرساختهای بزرگ و سازمانی کاربرد دارند.
Software Load Balancer
در این روش از نرمافزارهایی استفاده میشود که وظیفه توزیع درخواستها را بر عهده دارند.
از نمونههای شناختهشده میتوان به:
NGINX
HAProxy
Traefik
اشاره کرد.
امروزه در بسیاری از معماریهای مدرن، Load Balancing میتواند توسط سرویسهای ابری نیز انجام شود.
برای مثال سرویسهای Cloud معمولاً ابزارهایی برای توزیع ترافیک میان چند نمونه از یک برنامه در اختیار توسعهدهندگان قرار میدهند.
Load Balancer در معماری مدرن چه نقشی دارد؟
در معماریهای مدرن، معمولاً برنامه فقط یک سرور ساده نیست.
ممکن است یک سیستم شامل چندین سرویس مختلف باشد:
کاربران
↓
Load Balancer
↓
┌──────────┼──────────┐
↓ ↓ ↓
API 1 API 2 API 3
↓ ↓ ↓
Cache Database Services
برای مثال ممکن است یک فروشگاه اینترنتی چندین نمونه از سرویس API خود داشته باشد.
Load Balancer میتواند درخواستهای کاربران را میان این نمونهها توزیع کند.
اگر تعداد کاربران افزایش پیدا کند، میتوان تعداد نمونههای سرویس را نیز افزایش داد.
این مفهوم را Horizontal Scaling یا مقیاسپذیری افقی مینامیم.
Load Balancing و Horizontal Scaling
فرض کنید برنامه شما در ابتدا روی یک سرور اجرا میشود:
Application
↓
Server 1
با افزایش کاربران، میتوانید یک سرور دیگر اضافه کنید:
Load Balancer
↙ ↘
Server 1 Server 2
اگر کاربران باز هم افزایش پیدا کنند:
Load Balancer
↙ ↓ ↘
Server 1 Server 2 Server 3
این یکی از ایدههای اصلی مقیاسپذیری افقی است.
یعنی به جای اینکه فقط یک سرور را قدرتمندتر کنیم، تعداد سرورها را افزایش میدهیم.
یک نکته مهم؛ Session چه میشود؟
اینجا Load Balancer با یکی دیگر از مفاهیم مهم توسعه وب یعنی Session ارتباط پیدا میکند.
فرض کنید کاربر وارد سایت شده و اطلاعات ورود او در Session یک سرور نگهداری میشود.
اگر درخواست بعدی او به سرور دیگری ارسال شود، ممکن است آن سرور اطلاعات Session را نداشته باشد.
برای حل این مشکل، معماریهای مختلفی وجود دارد؛ برای مثال میتوان Session را در یک محل مشترک مانند Redis نگهداری کرد یا از روشهای مناسب مدیریت وضعیت در معماری استفاده کرد.
به همین دلیل هنگام طراحی سیستمهای چندسروره، فقط تقسیم درخواستها اهمیت ندارد؛ مدیریت State و Session نیز باید بهدرستی طراحی شود.
آیا هر سایتی به Load Balancer نیاز دارد؟
خیر.
اگر یک وبسایت شخصی یا یک پروژه کوچک دارید که تعداد کاربران آن کم است، ممکن است یک سرور کاملاً برای نیازهای شما کافی باشد.
Load Balancer زمانی اهمیت بیشتری پیدا میکند که:
تعداد کاربران زیاد باشد.
درخواستهای همزمان زیادی داشته باشید.
نیاز به دسترسپذیری بالا داشته باشید.
بخواهید چند سرور را همزمان مدیریت کنید.
سیستم قابلیت Scale شدن داشته باشد.
خرابی یک سرور نباید کل سرویس را متوقف کند.
بنابراین استفاده از Load Balancer بیشتر به نیاز و معماری پروژه بستگی دارد، نه صرفاً به اندازه کد یا تعداد صفحات سایت.
Load Balancer چه تفاوتی با Reverse Proxy دارد؟
این دو مفهوم گاهی با یکدیگر اشتباه گرفته میشوند.
Reverse Proxy واسطهای بین کاربر و سرورهای پشت آن است و میتواند وظایف مختلفی مانند مسیریابی، SSL Termination، Cache و کنترل ترافیک را انجام دهد.
Load Balancer نیز ترافیک را میان چند سرور یا نمونه توزیع میکند.
در بسیاری از ابزارها، یک سیستم میتواند همزمان نقش Reverse Proxy و Load Balancer را داشته باشد.
برای مثال NGINX میتواند درخواستهای ورودی را دریافت کرده و آنها را میان چند Backend Server توزیع کند.
پس این دو مفهوم کاملاً یکی نیستند، اما در معماریهای واقعی میتوانند در کنار یکدیگر استفاده شوند.
Load Balancer چه مزایایی دارد؟
مهمترین مزایای Load Balancer عبارتاند از:
✅ توزیع بار بین چند سرور
از متمرکز شدن تمام درخواستها روی یک سرور جلوگیری میکند.
✅ افزایش دسترسپذیری
در صورت خرابی یک سرور، درخواستها میتوانند به سرورهای سالم منتقل شوند.
✅ مقیاسپذیری
با افزایش کاربران، میتوان سرورهای بیشتری به سیستم اضافه کرد.
✅ Health Check
وضعیت سرورها بررسی میشود تا ترافیک به سرورهای مشکلدار ارسال نشود.
✅ بهبود پایداری سیستم
ترافیک بهتر مدیریت میشود و احتمال ایجاد فشار شدید روی یک سرور کاهش پیدا میکند.
✅ مدیریت بهتر ترافیک
در سیستمهای بزرگ میتوان قوانین مختلفی برای هدایت درخواستها تعریف کرد.
آیا Load Balancer همیشه بهترین راهحل است؟
نه.
Load Balancer خودش یک بخش مهم از زیرساخت است و باید بهدرستی طراحی و مدیریت شود.
برای مثال اگر سیستم شما فقط یک Load Balancer داشته باشد و همان Load Balancer از کار بیفتد، ممکن است تمام درخواستها با مشکل مواجه شوند.
به همین دلیل در معماریهای حساس، خود Load Balancer نیز میتواند به شکل High Availability طراحی شود تا یک نقطه شکست واحد ایجاد نکند.
همچنین باید موضوعاتی مانند Database، Cache، Session، Network و سایر سرویسهای وابسته نیز در معماری در نظر گرفته شوند.
جمعبندی
Load Balancer یکی از مفاهیم مهم در طراحی سیستمهای مقیاسپذیر و معماری نرمافزار است.
به زبان ساده، Load Balancer مانند یک هماهنگکننده عمل میکند که درخواستهای کاربران را بین چند سرور تقسیم میکند تا فشار روی یک سرور متمرکز نشود.
علاوه بر تقسیم ترافیک، قابلیتهایی مانند Health Check، افزایش Availability، مدیریت ترافیک و کمک به Horizontal Scaling باعث شدهاند Load Balancer در بسیاری از سیستمهای بزرگ و مدرن نقش مهمی داشته باشد.
اگر بخواهیم همه مفهوم را در یک جمله خلاصه کنیم:
Load Balancer یعنی تقسیم هوشمندانه درخواستها بین چند سرور برای ساخت سیستمی پایدارتر، مقیاسپذیرتر و قابلاعتمادتر.