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

تصور کنید یه وب سایت داریم که محبوب شده و روز به روز بازدیدش بالاتر میره، کم کم با زیاد شدن بازدید ها سرور دیگه توانایی پاسخگویی نداره و اصطلاحا down میشه! برای مدیریت این حجم درخواست دو راه وجود داره:۱- سرورمون رو ارتقا بدیم۲-به جای یه سرور چند تا سرور داشته باشیمروش اول خیلی ساده پیاده سازی می‌شه، در عوض یکسری محدودیت ها داره. اولین محدودیت اینه که سرور تا یه حدی توانایی ارتقا داره، و دومین مورد اینه که اگر به هر دلیلی ( مثل خرابی ، ارتقا وب سایت و ...) سرور از دسترس خارج بشه عملا سایتمون از دسترس خارج میشه.توی این پست قصد داریم پیاده سازی روش دوم رو اموزش بدیم.ببینیم لود بالانسینگ چیه:لود بالانسر کارش اینه درخواست هایی که برای سایتمون میاد رو تحویل میگیره، و بین دو یا چند سرورمون تقسیم می‌کنه و ساختار سیستم هامون هم به این صورت میشه:http://www.digitalsanctuary.com/tech-blog/debian/13-steps-to-peace-of-mind.htmlخب شروع میکنیم به راه اندازی یه وب سرور ساده به‌همراه لود بالانسر:(توزیعی که من در نظر گرفتم اوپن سوزه هستش ولی غیر از دستورات پایه ای مراحل تقریبا مشابه بقیه توزیع هاست)نصب nginx بعنوان وب سرور:(اینجا قصد نداریم کانفیگ nginx رو توضیح بدیم و فقط قراره در حد اجرای یه صفحه html تنظیمش کنیم)zypper refreshzypper install -y nginxحالا یکسری تنظیمات ساده روی nginx انجام می‌دیم. فایل /etc/nginx/nginx.conf رو باز می‌کنیم:و بخش سرور رو پیدا می‌کنیم و این تغییرات رو انجام می‌دیم:listen 80;server_name _;همونطور که تو عکس بالا مشخصه دایرکتوری روت srv/www/htdocs هستش(تو توزیع های مختلف متفاوته باید از طریق فایل کانفیگ ببینید کجاس) یه فایل index.html توی این مسیر میسازیم:touch /srv/www/htdocs/index.htmlecho " hello i am SERVER 1" > /srv/www/htdocs/index.htmlهمین مراحل رو توی سرور دوم انجام بدیدم فقط تو دستور بالا بجای SERVER 1 بزنید SERVER 2 .برای لود بالانس کردن نرم افزار haproxy رو انتخاب کردیم. همونطور که توی شکل بالا مشخصه لود بالانسر روی سرور سوم نصب میشه و به درخواست هارو به وب سرور ها انتقال می‌ده.نصب HaProxyzypper install -y haproxyتنظیم haproxy:vi /etc/haproxy/haproxy.cfgخطوط زیر رو به انتهای فایل کانفیگ اضافه می‌کنیم:frontend http-in bind *:80 default_backend webserverbackend 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.servicesystemctl enable nginx.serviceو روی سرور لود بالانسر هم سرویس Haproxy رو اجرا می‌کنیم:systemctl start haproxysystemctl enable haproxyحالا اگر توی Browser ادرس آی پی لودبالانسر رو وارد کنید باید متن hello i am SERVER 1 نمایش داده بشه اگه رفرش کنید میبینید که صفحه عوض میشه به hello i am SERVER 2[طبیعیه که سرور ها و لود بالانسر باید تو یه شبکه باشن تا بتونن با هم ارتباط برقرار کنن]شاید تا اینجا برای شما هم سوال شده باشه اگه لود بالانسر به مشکل بخوره چی؟ اینجاست که Highavailability نقششو ایفا می‌کنه.به این صورت که یه لود بالانسر دیگه به عنوان بک اپ تنظیم می‌کنیم و در صورتی که اولی از کار افتاد دومیه دست بکار میشه.پس باید یه لودبالانسر دیگه روی سرور چهارم نصب میکنیم (کانفیگ ها هیچ تغییری نمیکنه)https://www.digitalocean.com/community/tutorials/what-is-high-availabilityبرای Highavailability از نرم افزار Keepalive استفاده میکنیمروش کار این دست نرم افزار ها به این صورته که یه ای پی مجازی میسازه (اینجا ۱۹۲.۱۶۸.۱.۷۳ ) و درخواست ها برای این ادرس ای پی مجازی فرستاده میشه.سرور Master به درخواست ها جواب میده . به محض اینکه این سرور از دسترس خارج بشه سرور Backup به درخواست های ای پی مجازی جواب میده نرم افزار Keepalive رو روی سرور لود بالانسر اول نصب می‌کنیم و اون رو بعنوان Master در نظر می‌گیریمzypper install keepalivedکافیگ ها سرور Master vi /etc/keepalived/keepalaived.confscript chk_haproxy { #یه اسکریپت بهش میدیم که لود بالانسر رو مانیتور کنه و اگه جواب نداد یعنی سرور از دسترس خارج شده و سرور بعدی باید جایگزین بشهscript “killall -0 haproxy”interval 2weight 2}vrrp_instance VRRP1 { state MASTER# ادرس کارت شبکه ای که قراره باهاش کار کنیمinterface eth1# مربوط به پروتکل مورد استفاده نرم افزاره و باید رو دوتا سیستم یکسان باشه تا همدیگرو شناسایی کننvirtual_router_id 41# سیستم مستر از اولویت بالاتری برخوردارهpriority 200advert_int 1authentication { یوزر پس برای امنیتauth_type PASSauth_pass 1066}virtual_ipaddress { ادرس ای پی مجازی 192.168.1.73/24}track_script{ اسکریپتی که بالا تعریف کردیم رو تست میکنهChk_haproxy}کانفیگ Keepalived روی سرور لودبالانسر دوم به عنوان سرور Backupvi /etc/keepalived/keepalived.confscript chk_haproxy {script “killall -0 haproxy”interval 2weight 2}vrrp_instance VRRP1 {state BACKUPinterface eth1virtual_router_id 41priority 100advert_int 1authentication {auth_type PASSauth_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 به پورت ۸۰۸۰ تغییر پیدا میکنه.مجموعه این تحقیقات و ازمایش هایی که در ادامه مستند می‌کنم در شرکت پردازش هوشمند ترگمان مجری سامانه های ترجمه ماشینی ترگمان و ترجمیار انجام شده است.