LoadBalancing
در این نوشته، چند روش کاربردی برای پیادهسازی Load Balancing در پیکربندیهای مستقیم و معکوس (ریورس) توضیح داده میشود.
تعریف Load Balancing
Load Balancing به دو حالت تقسیم میشود:
-
حالت اول: یک سرور در ایران وجود دارد که به چند سرور خارجی متصل میشود و کاربران را بین آنها توزیع میکند.
-
حالت دوم: چند سرور ایرانی به یک سرور خارجی متصل میشوند. این حالت بسیار ساده است و نیازی به قابلیت Load Balancing اضافی ندارد. تنها کافی است برای هر سرور ایرانی، یک پیکربندی جداگانه در سرور خارجی اضافه شود. مثالی از این حالت در ادامه ارائه خواهد شد، اما تمرکز اصلی این آموزش بر روی حالت اول است.
Load Balancing مزایای زیادی دارد:
- احتمال فیلتر شدن سرور خارجی و یا شناسایی سرور ایرانی را به شدت کاهش میدهد.
- دیتاسنترها دیگر متوجه نمیشوند که ترافیک به صورت تونل از یک مبدأ به یک مقصد در حال انتقال است.
پیکربندی مستقیم (Direct Tunnel)
برای توضیح Load Balancing، ابتدا یک پیکربندی مستقیم را نشان میدهیم.
- آیپی سرور ایران:
1.1.1.1
- آیپی سرور آلمان:
2.2.2.2
- آیپی سرور هلند:
3.3.3.3
ابتدا یک ارتباط ساده بین پورتهای سرور ایران و آلمان برقرار میکنیم:
{
"name": "simple_port_to_port",
"nodes": [
{
"name": "input",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "output"
},
{
"name": "output",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "1.1.1.1",
"port": 443
}
}
]
}
این پیکربندی، پورت به پورت است و نیازی به اجرای دیوار آتش (Firewall) روی سرور خارجی ندارد. اما اگر در حالتی هستید که نیاز به اجرای دیوار آتش در سرور خارجی دارید، میتوانید پیکربندی مخصوص به خود را در سرور خارجی اجرا کنید.
در این مثال، پورت 443 سرور ایران به پورت 443 سرور خارجی آلمان متصل شده است.
حال میخواهیم همین پورت 443 را به سرور هلند نیز متصل کنیم تا کاربری که به سرور ایران متصل میشود، به صورت تصادفی یا به آلمان وصل شود یا به هلند.
پیکربندی را تغییر میدهیم و هلند را اضافه میکنیم:
{
"name": "simple_port_to_port_2_kharej",
"nodes": [
{
"name": "input1",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "output_alman"
},
{
"name": "output_alman",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "1.1.1.1",
"port": 443
}
},
{
"name": "input2",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "output_holand"
},
{
"name": "output_holand",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "2.2.2.2",
"port": 443
}
}
]
}
در این پیکربندی، دو ورودی (input) روی یک پورت داریم که کاملاً مشابه هم هستند. اگر اکنون پیکربندی را اجر ا کنیم، متوجه خواهیم شد که همه کاربران به input1 وصل میشوند و در نتیجه همگی به آلمان متصل میشوند.
برای ایجاد Load Balancing، باید بین input1 و input2 یک balance-group تعریف کنیم:
{
"name": "simple_port_to_port_2_kharej",
"nodes": [
{
"name": "input1",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true,
"balance-group": "group name"
},
"next": "output_alman"
},
{
"name": "output_alman",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "1.1.1.1",
"port": 443
}
},
{
"name": "input2",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true,
"balance-group": "group name"
},
"next": "output_holand"
},
{
"name": "output_holand",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "2.2.2.2",
"port": 443
}
}
]
}
در این پیکربندی، پارامتر balance-group را به تنظیمات (Settings) گرههای ورودی (input) اضافه کردهایم. این پارامتر یک نام دلخواه میگیرد و گرههای ورودی که این نام گروه را داشته باشند، با هم متعادل (Balance) میشوند و کاربران را بین خود تقسیم میکنند.
وقتی یک کاربر متصل میشود، ممکن است به input1 یا input2 تخصیص داده شود و تا زمانی که متصل باشد، در همان input باقی میماند. اگر کاربر برای مدت یک دقیقه غیرفعال باشد (یعنی از VPN استفاده نکند، نه اینکه فقط برنامه v2rayng را قطع کند)، در اتصال بعدی ممکن است به یک input جدید تخصیص داده شود و به جای آلمان، به هلند متصل شود.
پارامتر balance-interval
اگر میخواهید مدت زمان یک دقیقهای را برای تست یا هر منظور دیگری تغییر دهید، میتوانید پارامتر balance-interval را به تنظیمات (Settings) اضافه کنید. این پارامتر یک عدد به میلیثانیه میگیرد.
توجه داشته باشید که نباید این عدد را خیلی کم تنظیم کنید. اگر مثلاً آن را روی 1 ثانیه تنظیم کنید، کاربر خیلی سریع جابجا میشود و وبسایتها معمولاً به چنین کاربری اجازه ورود یا انجام کار نمیدهند. سایت برای کاربر به درستی بارگذاری نمیشود و کپچاها (Captcha) نیز مشکل ایجاد میکنند.
پارامتر balance-interval را میتوانید برای هر گره ورودی (input) به صورت جداگانه تعریف کنید. معمولاً اگر بخواهید تغییر دهید، برای همه گرهها عدد جدید را یکسان تنظیم میکنید.
اگر برای گرههای مختلف، مقادیر متفاوتی تنظیم کنید (مثلاً برای input2، 5 دقیقه و برای input1، 1 دقیقه)، در این صورت اگر کاربر به هلند متصل شود، باید 5 دقیقه غیرفعال باشد تا دوباره شانس اتصال به جای دیگری را داشته باشد. اما اگر به آلمان متصل شود، تنها 1 دقیقه غیرفعالی کافی است. این حالت کاربرد خاصی ندارد، مگر اینکه بخواهید عمداً ترافیک بیشتری را به سمت هلند هدایت کنید تا آلمان.
وقتی کاربری را بین چند سرور خارجی متعادل (Balance) میکنید، باید روی هر دو سرور خارجی، یک پنل xui یا راهی برای دسترسی به هسته وجود داشته باشد تا کاربر بتواند متصل شود.
معمولاً یک نسخه پشتیبان از پنل را روی دو سرور نصب میکنند. اما یک حالت کمطرفدار دیگر نیز وجود دارد که در آن، ترافیک سرور خارجی دوم را به سرور خارجی اول هدایت میکنند. در این حالت، کاربر همیشه آیپی سرور اول را خواهد داشت، اما در سرور ایرانی، ترافیک بین دو سرور خارجی توزیع میشود.
شاید تنها کاربرد این نوع Load Balancing، کاهش احتمال فیلتر شدن آیپی خارجی باشد. یا زمانی که هر دو سرور شما در آلمان قرار دارند و نمیخواهید دردسر مدیریت دو پنل را داشته باشید.
اضافه کردن سرور سوم
اگر بخواهید به پیکربندی فعلی، یک سرور دیگر مانند فنلاند را اضافه کنید، کافی است آن را به همان balance-group اضافه کنید.
میتوانید تا 64 عضو را در یک گروه داشته باشید.
Load Balancing در پیکربندیهای معکوس (Reverse)
برای پیادهسازی Load Balancing چند سرور خارجی به یک سرور ایرانی در پیکربندیهای معکوس، تنها کاری که باید انجام دهید این است که در پیکربندی سرور ایرانی، در بخشی که آیپی سرور خارجی اول را در لیست سفید (Whitelist) قرار دادها ید، آیپی سایر سرورهای خارجی را نیز به لیست سفید اضافه کنید.
سپس برنامه را در سایر سرورهای خارجی اجرا کنید.
اگر پنل روی یک سرور خارجی نصب شده باشد، در پیکربندی سرورهای خارجی دیگر، باید آدرس سرور خارجی اصلی را به جای 127.0.0.1
قرار دهید.
اما اگر روی هر کدام از سرورهای خارجی، پنل جداگانهای نصب شده باشد و کاربران روی آنها تعریف شده باشند، باید جلوی مشکل جابجایی سریع کاربران بین آیپیهای مختلف خارجی را بگیریم. برای این منظور، باید balance-group را هم برای گره ورودی خارجی و هم برای گره ورودی کاربر به صورت جداگانه تعریف کنیم. مثال آن را در ادامه خواهیم دید.
ادامه این مستند در آینده نوشته خواهد شد...
دانشنامه
- Load Balancing: فرآیند توزیع بار ترافیک بین چندین سرور برای بهبود عملکرد، قابلیت اطمینان و مقیاسپذیری.
- Direct Tunnel: تونل مستقیم بین دو سرور که ترافیک را بدون واسطه انتقال میدهد.
- TcpListener: گرهای در WaterWall که روی یک پورت گوش میدهد و درخواستهای TCP را دریافت میکند.
- TcpConnector: گرهای در WaterWall که به یک آدرس و پورت مشخص متصل میشود و ترافیک را انتقال میدهد.
- balance-group: ویژگیای در پیکربندی WaterWall که برای ایجاد Load Balancing بین چند گره ورودی استفاده میشود.