نحوه استفاده از HAProxy برای تعادل بار بر روی سرور مجازی اوبونتو(قسمت دوم)

اطلاعیه خودکار این مقاله ؛ این پست در ۱۰ سال پیش نوشته و منتشر شده است و اکنون شاید قوانین و ابزار ها تغییر پیدا کرده باشد. اگر میدانید این نوشته هنوز به کارتان می آید ،به خواندن ادامه دهید.

روش درج کوکی

در این روش همه پاسخ ها از HAPROXY به مشتری شامل یک Set-Cookie خواهد بود: هدر با نام یک سرور backened به عنوان ارزش کوکی آن.بنابراین به جلو راندن کلاینت (مرورگر وب) شامل این کوکی با تمام درخواست هایش خواهد بود و Haproxy درخواست را به سرور backend درست مبتنی بر ارزش کوکی هدایت خواهد کرد.
برای این روش شما نیاز به افزودن دستور cookie و اصلاح دستور server تحت listen دارید.
cookie SRVNAME insert
server lamp1 10.0.0.1:80 cookie S1 check
server lamp2 10.0.0.2:80 cookie S2 check

این باعث می شود haproxy یک مجموعه کوکی را اضافه کند :هدر با نام کوکی srvname ارزش خود را به عنوان s1 و s2 مبتنی بر اینکه کدام backend درخواست را پاسخ داده، دارا می باشد.هنگامی که این اضافه شد سرویس را رستارت کنید.
service haproxy restart

و از curl برای بررسی اینکه این چگونه کار می کند استفاده کنید.
> curl -i http://1.1.1.1/session.php
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:11:22 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Set-Cookie: PHPSESSID=l9haakejnvnat7jtju64hmuab5; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 143
Connection: close
Content-Type: text/plain
Set-Cookie: SRVNAME=S1; path=/

This is the first time you’re visiting this server
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.X.X
Array
(
)

این اولین درخواست ساخته شده ماست که با lamp1 پاسخ داده شد که ما می توانیم از

/=Set-Cookie :SRVNAME=S1; path  ببینیم. حالا ، به تقلید آنچه یک مرورگر وب برای درخواست بعدی انجام می دهد، ما این کوکی ها را با استفاده از پارامتر curl -cookie-به درخواست اضافه می کنیم.

> curl -i http://1.1.1.1/session.php –cookie “PHPSESSID=l9haakejnvnat7jtju64hmuab5;SRVNAME=S1;”
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:11:45 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 183
Connection: close
Content-Type: text/plain

Your number of visits: 1
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.87.127
Array
(
[PHPSESSID] => l9haakejnvnat7jtju64hmuab5
[SRVNAME] => S1
)

> curl -i http://1.1.1.1/session.php –cookie “PHPSESSID=l9haakejnvnat7jtju64hmuab5;SRVNAME=S1;”
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:11:45 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 183
Connection: close
Content-Type: text/plain

Your number of visits: 2
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.87.127
Array
(
[PHPSESSID] => l9haakejnvnat7jtju64hmuab5
[SRVNAME] => S1
)

هر دو این دستورات ، توسط Lmp1 پاسخ داده می شود و نشست به درستی برقرار می شود. این روش اگر stickiness را بر روی تمام فایلهای وب سرورتان می خواهید، مفید است .

 

 

روش پیشوند کوکی

از طرف دیگر ، اگر شما stickiness را فقط برای کوکی های مشخص می خواهید یا نمی خواهید کوکی جداگانه برای نشست stickiness داشته باشید، گزینه prefix برای شماست.
برای بکار بردن این روش ، از دستور cookie زیر استفاده کنید.
cookie PHPSESSID prefix

PHPSESSID می تواند با نام کوکی خودتان جایگزین شود.دستور server طبق پیکربندی قبلی باقی می ماند.

حالا بگذارید ببینیم این چگونه کار می کند:
> curl -i http://1.1.1.1/session.php
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:36:27 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Set-Cookie: PHPSESSID=S1~6l2pou1iqea4mnhenhkm787o56; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 143
Content-Type: text/plain

This is the first time you’re visiting this server
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.X.X
Array
(
)

توجه داشته باشید چگونه server با کوکی s1 به کوکی نشست پیشوند می شود.حالا ، بیایید دو درخواست دیگر بااین کوکی را ارسال کنیم.

> curl -i http://1.1.1.1/session.php –cookie “PHPSESSID=S1~6l2pou1iqea4mnhenhkm787o56;”
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:36:45 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 163
Content-Type: text/plain

Your number of visits: 1
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.X.X
Array
(
[PHPSESSID] => 6l2pou1iqea4mnhenhkm787o56
)

> curl -i http://1.1.1.1/session.php –cookie “PHPSESSID=S1~6l2pou1iqea4mnhenhkm787o56;”
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2013 13:36:54 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 163
Content-Type: text/plain

Your number of visits: 2
Server IP: 10.0.0.1
Client IP: 10.0.0.100
X-Forwarded-for: 117.213.X.X
Array
(
[PHPSESSID] => 6l2pou1iqea4mnhenhkm787o56
)

ما می توانیم به وضوح ببینیم که هر دو درخواست پاسخ داده شده توسط LAMP1 و نشست ، کاملا کار می کند.

پیکربندی ورود برای HAProxy

هنگامی که ما پیکربندی HAProxy را آغاز می کنیم ،  یک خط log 127.0.0.1 local0 notice را اضافه می کنیم که پیغام های syslog را به آدرس آی پی لوکال هاست ارسال می کند.اما به صورت پیش فرض ، rsyslog بر روی ابونتو بر روی هیچ آدرسی listen نیست . بنابراین ما باید آن را هم برای انجام اینکار مهیا کنیم.

فایل پیکربندی rsyslog را ویرایش کنید.
nano /etc/rsyslog.conf

خط های زیر را اضافه /ویرایش/کامنت کنید
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514

حالا rsyslog بر روی پورت UDP 514 بر روی آدرس ۱۲۷٫۰٫۰٫۱ کار خواهد کرد اما تمام پیغام های HAProxy به /var/log/syslog خواهد رفت. بنابراین ما باید آنها را جدا کنیم.

یک قانون برای لاگ های HAProxy ایجاد کنید
nano /etc/rsyslog.d/haproxy.conf

خط زیر را به آن اضافه کنید
if ($programname == ‘haproxy’) then -/var/log/haproxy.log

حالا سرویس rsyslog را رستارت کنید
service rsyslog restart

این تمام پیغام های HAProxy را می نویسد و دسترسی لاگ ها را به /var/log/haproxy.log فراهم می کند.

 

Keepalives در HAProxy

تحت دستور listen ما از option httpclose استفاده کردیم که یک هدر Connection: close را اضافه می کند. این می گوید کلاینت (مرورگر وب)اتصال را پس از دریافت پاسخ ببندد.
اگر شما می خواهید keep-alives را بر روی HAProxy فعال کنید خط option httpclose را جایگزین کنید.

option http-server-close
timeout http-keep-alive 3000

وقفه keep-alive را عاقلانه تنظیم کنید به طوری که چند اتصال همه منابع لود بالانسر را تخلیه نکند .

 

تست Keepalives

Keepalives می تواند با به کار بردن curl توسط ارسال درخواست های متعدد بصورت همزمان، تست شود. خروجی های غیرضروری در مثال زیر حذف خواهند شد .
> curl -v http://1.1.1.1/index.html http://1.1.1.1/index.html
* About to connect() to 1.1.1.1 port 80 (#0)
* Trying 1.1.1.1… connected
> GET /index.html HTTP/1.1
> User-Agent: curl/7.23.1 (x86_64-pc-win32) libcurl/7.23.1 OpenSSL/0.9.8r zlib/1.2.5
> Host: 1.1.1.1
> Accept: */*
>
……[Output omitted]………
* Connection #0 to host 1.1.1.1 left intact
* Re-using existing connection! (#0) with host 1.1.1.1
* Connected to 1.1.1.1 (1.1.1.1) port 80 (#0)
> GET /index.html HTTP/1.1
> User-Agent: curl/7.23.1 (x86_64-pc-win32) libcurl/7.23.1 OpenSSL/0.9.8r zlib/1.2.5
> Host: 1.1.1.1
> Accept: */*
>
…….[Output Omitted]………
* Connection #0 to host 1.1.1.1 left intact
* Closing connection #0

در این خروجی ، ما باید به خط Re-using existing connection! (#0) with host 1.1.1.1 نگاه کنیم ، که نشان می دهد که curl از اتصال مشابه برای ایجاد درخواست های بعدی استفاده می کند.

 

منبع

ترجمه شده توسط : آرزو رنجبرپور

لینک کوتاه مطلب :

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*