راه اندازی یک highavailable system به همراه لود بالانسر

تصور کنید یه وب سایت داریم که محبوب شده و روز به روز بازدیدش بالاتر میره، کم کم با زیاد شدن بازدید ها سرور دیگه توانایی پاسخگویی نداره و اصطلاحا down میشه!

برای مدیریت این حجم درخواست دو راه وجود داره:

۱- سرورمون رو ارتقا بدیم

۲-به جای یه سرور چند تا سرور داشته باشیم

روش اول خیلی ساده پیاده سازی می‌شه، در عوض یکسری محدودیت ها داره. اولین محدودیت اینه که سرور تا یه حدی توانایی ارتقا داره، و دومین مورد اینه که اگر به هر دلیلی ( مثل خرابی ، ارتقا وب سایت و ...) سرور از دسترس خارج بشه عملا سایتمون از دسترس خارج میشه.
توی این پست قصد داریم پیاده سازی روش دوم رو اموزش بدیم.

ببینیم لود بالانسینگ چیه:

لود بالانسر کارش اینه درخواست هایی که برای سایتمون میاد رو تحویل میگیره، و بین دو یا چند سرورمون تقسیم می‌کنه و ساختار سیستم هامون هم به این صورت میشه:

http://www.digitalsanctuary.com/tech-blog/debian/13-steps-to-peace-of-mind.html
http://www.digitalsanctuary.com/tech-blog/debian/13-steps-to-peace-of-mind.html


خب شروع میکنیم به راه اندازی یه وب سرور ساده به‌همراه لود بالانسر:(توزیعی که من در نظر گرفتم اوپن سوزه هستش ولی غیر از دستورات پایه ای مراحل تقریبا مشابه بقیه توزیع هاست)

نصب nginx بعنوان وب سرور:(اینجا قصد نداریم کانفیگ nginx رو توضیح بدیم و فقط قراره در حد اجرای یه صفحه html تنظیمش کنیم)

zypper refresh

zypper install -y nginx

حالا یکسری تنظیمات ساده روی nginx انجام می‌دیم. فایل /etc/nginx/nginx.conf رو باز می‌کنیم:

و بخش سرور رو پیدا می‌کنیم و این تغییرات رو انجام می‌دیم:

listen 80;

server_name _;

همونطور که تو عکس بالا مشخصه دایرکتوری روت srv/www/htdocs هستش(تو توزیع های مختلف متفاوته باید از طریق فایل کانفیگ ببینید کجاس) یه فایل index.html توی این مسیر میسازیم:

touch /srv/www/htdocs/index.html

echo " hello i am SERVER 1" > /srv/www/htdocs/index.html

همین مراحل رو توی سرور دوم انجام بدیدم فقط تو دستور بالا بجای SERVER 1 بزنید SERVER 2 .

برای لود بالانس کردن نرم افزار haproxy رو انتخاب کردیم. همونطور که توی شکل بالا مشخصه لود بالانسر روی سرور سوم نصب میشه و به درخواست هارو به وب سرور ها انتقال می‌ده.

نصب HaProxy

zypper install -y haproxy

تنظیم haproxy:

vi /etc/haproxy/haproxy.cfg

خطوط زیر رو به انتهای فایل کانفیگ اضافه می‌کنیم:

frontend http-in
bind *:80
default_backend webserver
backend webserver
balance roundrobin
server web1 192.168.1.70:80 check
server web2 192.168.1.71:80 check

بخش frontend مربوط به لود بالانسر میشه که مشخص میکنه چه ورودی هایی رو دریافت کنه و به کجا بفرسته:

این اپشن یعنی هر ورودی ای که رو پورت ۸۰ بود رو دریافت کن
bind *:80
حالا ورودی هایی رو که دریافت کردی برای بک اند سرور به این اسم بفرست ( ادرس های ای پی که وارد شده ادرس وب سرورهامونه)
default_backend webservers

بخش backend webserver هم مربوط به سرورهامون میشه که مشخص میکنه چند تا سرور داریم و ادرسشون چیه و با یه اسم دلخواه به frontend معرفی میشه

balance roundrobin

server web1 192.168.1.70:80 check سرور رو معرفی میکنه که کجا قرار داره و چک کن که در حال سرویس دهی هم باشه


حالا سرویس هامونو روی سرور های اول و دوم اجرا می‌کنیم

systemctl start nginx.service

systemctl enable nginx.service

و روی سرور لود بالانسر هم سرویس Haproxy رو اجرا می‌کنیم:

systemctl start haproxy

systemctl enable haproxy


حالا اگر توی Browser ادرس آی پی لودبالانسر رو وارد کنید باید متن hello i am SERVER 1 نمایش داده بشه اگه رفرش کنید میبینید که صفحه عوض میشه به hello i am SERVER 2

[طبیعیه که سرور ها و لود بالانسر باید تو یه شبکه باشن تا بتونن با هم ارتباط برقرار کنن]


شاید تا اینجا برای شما هم سوال شده باشه اگه لود بالانسر به مشکل بخوره چی؟ اینجاست که Highavailability نقششو ایفا می‌کنه.

به این صورت که یه لود بالانسر دیگه به عنوان بک اپ تنظیم می‌کنیم و در صورتی که اولی از کار افتاد دومیه دست بکار میشه.

پس باید یه لودبالانسر دیگه روی سرور چهارم نصب میکنیم (کانفیگ ها هیچ تغییری نمیکنه)

https://www.digitalocean.com/community/tutorials/what-is-high-availability
https://www.digitalocean.com/community/tutorials/what-is-high-availability


برای Highavailability از نرم افزار Keepalive استفاده میکنیم

روش کار این دست نرم افزار ها به این صورته که یه ای پی مجازی میسازه (اینجا ۱۹۲.۱۶۸.۱.۷۳ ) و درخواست ها برای این ادرس ای پی مجازی فرستاده میشه.

سرور Master به درخواست ها جواب میده . به محض اینکه این سرور از دسترس خارج بشه سرور Backup به درخواست های ای پی مجازی جواب میده

نرم افزار Keepalive رو روی سرور لود بالانسر اول نصب می‌کنیم و اون رو بعنوان Master در نظر می‌گیریم

zypper install keepalived

کافیگ ها سرور Master

vi /etc/keepalived/keepalaived.conf


script chk_haproxy { #یه اسکریپت بهش میدیم که لود بالانسر رو مانیتور کنه و اگه جواب نداد یعنی سرور از
دسترس خارج شده و سرور بعدی باید جایگزین بشه
script “killall -0 haproxy”
interval 2
weight 2
}
vrrp_instance VRRP1 {
state MASTER
# ادرس کارت شبکه ای که قراره باهاش کار کنیم
interface eth1
# مربوط به پروتکل مورد استفاده نرم افزاره و باید رو دوتا سیستم یکسان باشه تا همدیگرو شناسایی کنن
virtual_router_id 41
# سیستم مستر از اولویت بالاتری برخورداره
priority 200
advert_int 1
authentication { یوزر پس برای امنیت
auth_type PASS
auth_pass 1066
}
virtual_ipaddress { ادرس ای پی مجازی
192.168.1.73/24
}
track_script{ اسکریپتی که بالا تعریف کردیم رو تست میکنه
Chk_haproxy
}

کانفیگ Keepalived روی سرور لودبالانسر دوم به عنوان سرور Backup

vi /etc/keepalived/keepalived.conf

script chk_haproxy {
script “killall -0 haproxy”
interval 2
weight 2
}
vrrp_instance VRRP1 {
state BACKUP
interface eth1
virtual_router_id 41
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1066
}
virtual_ipaddress {
192.168.1.73/24
}
track_script{
Chk_haproxy
}

حالا دیگه فقط یه ای پی داریم، اگر ای پی رو توی Browser وارد کنیم صفحه سایت لود میشه. برای تست هم میتونید سرور اصلی رو ریستارت کنید و ببینید که سایت همچنان در دسترسه :)

(دقت داشته باشید High Available کردن دیتا بیس ها بخاطر تغییرات لحظه به لحظه داده ها فرایند های پیچیده تری رو نیازمنده که توی این پست قصد نداریم در موردش بحث کنیم)

سیستمی که بالا توضیح داده شد اصطلاحا Active/Passive گفته میشه و همیشه یه لود بالانسر غیر فعال و در حالت اماده به کاره اگر بخوایم هر دوتا لود بالانسر همزمان کار کنن باید حالت active/passive رو به active/active تبدیل کنیم.(آموزش حالت Active/Active رو توی یه پست جداگانه میزارم)

لزوما لازم نیست که سرور های لود بالانسر جداگانه باشن و برای کاهش هزینه میشه از وب سرور ها برای نصب Haproxy و Keepalived استفاده کرد فقط باید پورت Nginx رو از ۸۰ به ۸۰۸۰ تغییر بدیم چون قراره Haproxy به پورت ۸۰ جواب بده و تنظیمات Haproxy هم برای معرفی Backend به پورت ۸۰۸۰ تغییر پیدا میکنه.

مجموعه این تحقیقات و ازمایش هایی که در ادامه مستند می‌کنم در شرکت پردازش هوشمند ترگمان مجری سامانه های ترجمه ماشینی ترگمان و ترجمیار انجام شده است.