Кластер, тестирование

Thank you for reading this post, don't forget to subscribe!

Про­ве­рять будет ути­ли­той apachebench

Син­так­сис коман­ды следующий

ab [options] [http[s]://]hostname[:port]/path

Самы­ми важ­ны­ми клю­ча­ми для любо­го тести­ро­ва­ния явля­ют­ся ключ n — коли­че­ство запро­сов стра­ни­цы и ключ c — коли­че­ство кон­ку­рент­ных запро­сов. Запу­стим ути­ли­ту с эти­ми ключами.
Осталь­ные ключи:

-n requests     коли­че­ство запро­сов стра­ни­цы.
-c concurrency коли­че­ство кон­ку­рент­ных запро­сов.
-t timelimit    мак­си­маль­ное вре­мя теста
-s timeout     мак­си­маль­ное вре­мя на один запрос. По умол­ча­нию 30 секунд.
-b windowsize   раз­мер TCP буфе­ра в байтах
-B address      адрес для исхо­дя­щих подключений
-p postfile     Файл, содер­жа­щий дан­ные для POST. Не забудь­те так­же уста­но­вить -T
-u putfile      Файл, содер­жа­щий дан­ные для PUT. Не забудь­те так­же уста­но­вить -T
-T content-type HTTP заго­ло­вок для мето­дов POST/PUT. По умол­ча­нию text/plain
-w             Выве­сти резуль­тат в виде HTML.
-C attribute   Доба­вить cookie, напри­мер  'Apache=1234'
-H attribute    доба­вить про­из­воль­ную стро­ку заго­лов­ка, напри­мер 'Accept-Encoding: gzip'
-A attribute    Исполь­зо­вать Basic WWW Authentication, напри­мер -A user pass
-P attribute    Исполь­зо­вать аутен­ти­фи­ка­цию на Proxy, напри­мер -P proxyuser proxypass
-X proxy:port   Ука­зать Proxy сервер
-V              Отоб­ра­зить вер­сию ab
-k              Исполь­зо­вать KeepAlive
-l              Раз­ре­шить изме­ня­е­мую дли­ну доку­мен­та. Исполь­зуй­те для дина­ми­че­ских стра­ниц.
-g filename     Сохра­нить резуль­тат в фор­ма­те gnuplot.
-e filename     Сохра­нить резуль­тат в CSV.
-r              Не пре­кра­щать тест при ошиб­ках пере­да­чи.
-h            Отоб­ра­зить справку
-f protocol    Ука­зать про­то­кол. (SSL3, TLS1, TLS1.1, TLS1.2 или ALL)

Рас­смот­рим вывод резуль­та­та построчно:

Server Software — инфор­ма­ция о frontend сер­ве­ре, пере­да­ная в http head.
Server Hostname — имя тести­ру­е­мо­го хоста.
Server Port — порт под­клю­че­ния.Document Path — отно­си­тель­ный путь без назва­ния хоста.
Document Length — дли­на воз­вра­щен­но­го доку­мен­та.Concurrency Level — коли­че­ство кон­ку­рент­ных запро­сов из клю­ча c.
Time taken for tests — вре­мя, затра­чен­ное на тест.
Complete requests — коли­че­ство выпол­нен­ных запро­сов. Если тест про­шел без обры­вов, зна­че­ние сов­па­да­ет с клю­чом n.
Failed requests — коли­че­ство запро­сов с ошиб­ка­ми. В рам­ках теста ошиб­ки раз­де­ля­ют­ся на четы­ре типа — ошиб­ки соеди­не­ния, ошиб­ки пере­да­чи, ошиб­ки дли­ны воз­вра­щен­ных дан­ных, исклю­че­ния). Про ошиб­ки дли­ны сто­ит доба­вить, что если тести­ру­е­мая стра­ни­ца меня­ет свое содер­жи­мое при обнов­ле­нии, т.е. явля­ет­ся дина­ми­че­ской, добав­ляй­те ключ -l.Write errors — ошиб­ки запи­си. Сюда так­же часто сыпят­ся ошиб­ки Broken pipe.
Non-2xx responses — отве­ты с не 2хх кода­ми. Т.е. оши­боч­ные либо умыш­лен­но, либо в резуль­та­те про­блем на сервере.
Total transferred — общий объ­ем пере­дан­ных данных
HTML transferred — объ­ем пере­дан­ных HTML данных
Requests per second—  сред­нее коли­че­ство обра­бо­тан­ных в секун­ду запросов.
Time per request — сред­нее вре­мя обра­бот­ки запроса.
Time per request — сред­нее вре­мя обра­бот­ки запро­са учи­ты­вая конекурентность.
Transfer rate — ско­рость пере­да­чи дан­ных.Connection Times (ms)  — вре­мя соеди­не­ния в миллисекундах
Столб­цы: min — мини­маль­ное вре­мя, mean[+/-sd] — сред­не­квад­ра­ти­че­ское откло­не­ние, median — сред­нее вре­мя, max — мак­си­маль­ное время.
Стро­ки: connect — вре­мя соеди­не­ния с сер­ве­ром, processing — вре­мя обра­бот­ки запро­са, waiting — пол­ное вре­мя ожи­да­ния, вклю­чая processing и вре­мя ожи­да­ния в оче­ре­ди, total — общее вре­мя выпол­не­ния запроса.
Percentage of the requests served within a certain time (ms) — доля запро­сов, выпол­нен­ных в опре­де­лен­ное вре­мя. В нашем слу­чае   50% всех запро­сов было обра­бо­та­но за 19 мил­ли­се­кунд, а интер­вал до 27 мил­ли­се­кунд выол­ни­лись все 100% запросов.
  50%     19
  66%     20
  75%     20
  80%     20
  90%     24
  95%     25
  98%     26
  99%     27
 100%     27 (longest request)
Основ­ны­ми пока­за­те­ля­ми эффек­тив­но­сти рабо­ты сай­та я бы выде­лил Requests per second, Time per request и не силь­ный раз­рыв в гра­фи­ке доль запро­сов. Важ­но пом­нить, что гео­гра­фи­че­ская уда­лен­ность до сер­ве­ра игра­ет важ­ную роль при ана­ли­зе пока­за­ний, так что если ваш сер­вер рас­по­ла­га­ет­ся в даль­них и не очень стра­нах, не сто­ит рас­стра­и­вать­ся вре­ме­ни выпол­не­ния до 200 мс, глав­ное — отсут­ствие стран­ных пере­ко­сов послед­ней секции.
---------------------------------------

Схема 1

На одном сер­ве­ре будет и apache php mysql 192.168.1.159
со вто­ро­го будем запус­кать про­вер­ку 192.168.1.160
Схе­ма­тич­но будет выгля­деть сле­ду­ю­щим образом:
Запу­стим и проверим:

[root@centos ~]# ab -c 100 -n 1000 http://192.168.1.159/

LA - 73
[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.159/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.159 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsServer Software: Apache
Server Hostname: 192.168.1.159
Server Port: 80Document Path: /
Document Length: 53870 bytesConcurrency Level: 100
Time taken for tests: 189.100 seconds
Complete requests: 1000
Failed requests: 60
(Connect: 0, Receive: 0, Length: 60, Exceptions: 0)
Write errors: 0
Non-2xx responses: 60
Total transferred: 50887576 bytes
HTML transferred: 50668256 bytes
Requests per second: 5.29 [#/sec] (mean)
Time per request: 18910.037 [ms] (mean)
Time per request: 189.100 [ms] (mean, across all concurrent requests)
Transfer rate: 262.80 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 20.1 0 577
Processing: 200 18484 21832.4 8032 111963
Waiting: 189 17814 20919.5 8003 109690
Total: 201 18486 21833.5 8032 111964Percentage of the requests served within a certain time (ms)
50% 8032
66% 10009
75% 14016
80% 24349
90% 53259
95% 72442
98% 78568
99% 101759
100% 111964 (longest request)[/spoiler]

 

Схема 2

 

ана­ло­гич­на пер­вой, но добав­ля­ет­ся nginx

 

LA 60

[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.159/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.159 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsServer Software: nginx
Server Hostname: 192.168.1.159
Server Port: 80Document Path: /
Document Length: 53870 bytesConcurrency Level: 100
Time taken for tests: 213.144 seconds
Complete requests: 1000
Failed requests: 74
(Connect: 0, Receive: 0, Length: 74, Exceptions: 0)
Write errors: 0
Non-2xx responses: 74
Total transferred: 50140798 bytes
HTML transferred: 49923325 bytes
Requests per second: 4.69 [#/sec] (mean)
Time per request: 21314.362 [ms] (mean)
Time per request: 213.144 [ms] (mean, across all concurrent requests)
Transfer rate: 229.73 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 20.6 0 624
Processing: 144 20824 20783.1 11193 88433
Waiting: 144 20342 20344.0 11092 87544
Total: 151 20826 20783.7 11193 88433Percentage of the requests served within a certain time (ms)
50% 11193
66% 16927
75% 21893
80% 33497
90% 60003
95% 69148
98% 81242
99% 83083
100% 88433 (longest request)[/spoiler]

 

Схема 3

 

Запрос будет при­ле­тать на nginx кото­рый будет отда­вать ста­ти­ку и рас­пре­де­лять нагруз­ку меж­ду 2мя бэкен­да­ми, фай­лы будут доступ­ны по nfs

Тушим на 192.168.1.159  nginx  добав­ля­ем 192.168.1.158 и ста­вим nfs:
yum install nfs-utils nfs-utils-lib -y
chkconfig nfs on && chkconfig rpcbind on

на  192.168.1.159 добав­ля­ем в:
[root@centos ~]# cat /etc/exports
/var/www/mid/ 192.168.1.158(rw,sync,no_root_squash,no_subtree_check)
/var/www/mid/ 192.168.1.155(rw,sync,no_root_squash,no_subtree_check)

пере­за­пус­ка­ем:

[root@centos ~]# /etc/init.d/rpcbind restart
Stopping rpcbind: [ OK ]
Starting rpcbind: [ OK ]

[root@centos ~]# /etc/init.d/nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS services: [ OK ]
Shutting down RPC idmapd: [ OK ]
Starting NFS services: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]

что­бы не пере­за­гру­жать мож­но использовать:

mysql> GRANT ALL ON *.* to test@localhost IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.06 sec)

mysql> GRANT ALL ON *.* to test@'%' IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)

 

на 192.168.1.158 так­же ставим

yum install nfs-utils nfs-utils-lib -y

chkconfig nfs on && chkconfig rpcbind on

далее мон­ти­ру­ем уда­лён­ный раз­дел, если дан­ной дирек­то­рии нет, её сле­ду­ет создать:
mkdir -p /var/www/mid/

mount 192.168.1.159:/var/www/mid/ /var/www/mid/

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

пере­за­пус­ка­ем

[root@centos ~]# /etc/init.d/rpcbind restart
Stopping rpcbind: [ OK ]
Starting rpcbind: [ OK ]

[root@centos ~]# /etc/init.d/nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down RPC idmapd: [ OK ]
Starting NFS services: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]

что­бы не пере­за­гру­жать мож­но использовать:

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

про­ве­ря­ем:
[root@centos ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos-LogVol00
976M 250M 676M 27% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 190M 27M 154M 15% /boot
/dev/mapper/vg_centos-LogVol03
976M 1.3M 924M 1% /tmp
/dev/mapper/vg_centos-LogVol01
2.0G 648M 1.3G 35% /usr
/dev/mapper/vg_centos-LogVol02
976M 149M 776M 17% /var
192.168.1.159:/var/www/mid/
976M 196M 730M 22% /var/www/mid/

 

на 192.168.1.155  ста­вим nginx nfs и настра­и­ва­ем балансировку:

yum install nfs-utils nfs-utils-lib -y

chkconfig nfs on && chkconfig rpcbind on

mkdir -p /var/www/mid/

mount 192.168.1.159:/var/www/mid/ /var/www/mid/

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

/etc/init.d/rpcbind start
/etc/init.d/nfs start

 

настра­и­ва­ем nginx сле­ду­ю­щим обра­зом, добав­ля­ем в /etc/nginx/nginx.conf

в сек­цию http
upstream backend {
server 192.168.1.158 weight=10;
server 192.168.1.159 weight=5;
}

мы выбра­ли метод балан­си­ров­ки Round-robin и изме­ни­ли веса

так­же меня­ем location
location / {
proxy_pass http://backend;
}

 

Выбор метода балансировки nginx

[spoiler]

Round-robin

Веб-сер­вер по умол­ча­нию рас­пре­де­ля­ет запро­сы рав­но­мер­но меж­ду бэкен­да­ми (но с уче­том весов). Этот стан­дарт­ный метод в Nginx, так что дирек­ти­ва вклю­че­ния отсутствует.

least_conn

Запро­сы сна­ча­ла отправ­ля­ют­ся бэкен­ду с наи­мень­шим коли­че­ством актив­ных под­клю­че­ний (но с уче­том весов):

# Если коли­че­ство актив­ных соеди­не­ний оди­на­ко­во, то допол­ни­тель­но исполь­зу­ет­ся метод round-robin

Hash и IP hash

При помо­щи это­го мето­да мож­но создать сво­е­го рода посто­ян­ные соеди­не­ния меж­ду кли­ен­та­ми и бэкендами.

Для каж­до­го запро­са Nginx вычис­ля­ет хэш, кото­рый состо­ит из тек­ста, пере­мен­ных веб-сер­ве­ра или их ком­би­на­ции, а затем сопо­став­ля­ет его с бэкендами:

# Для вычис­ле­ния хэша исполь­зу­ет­ся схе­ма (http или https) и пол­ный URL

IP hash рабо­та­ет толь­ко с HTTP, это пред­опре­де­лен­ный вари­ант, в кото­ром хэш вычис­ля­ет­ся по IP-адре­су клиента:

# Если адрес кли­ен­та IPv4, то для хэша исполь­зу­ет­ся пер­вые три окте­та, если IPv6, то весь адрес

 

Веса бэкен­дов

Если в сте­ке опре­де­лен­ные бэкен­ды мощ­нее, чем дру­гие, то при­го­дят­ся веса:

# По умол­ча­нию веса рав­ны 1

В этом при­ме­ре из каж­дых 16 запро­сов пер­вый бэкенд будет обра­ба­ты­вать 10, вто­рой 5, а тре­тий 1. При этом бэкап-сер­вер будет полу­чать запро­сы толь­ко если три основ­ных бэкен­да недоступны.

Мони­то­ринг

Если Nginx счи­та­ет, что бэкенд сер­вер недо­сту­пен, то вре­мен­но пере­ста­ет слать на него запро­сы. За это отве­ча­ет две директивы:

  • max_fails — зада­ет коли­че­ство неудач­ных попы­ток под­клю­че­ний, после кото­рых бэкенд опре­де­лен­ное вре­мя счи­та­ет­ся недоступным;
  • fail_timeout — вре­мя, в тече­ние кото­ро­го сер­вер счи­та­ет­ся недоступным.

Пара­мет­ры выгля­дят так:

# Пара­мет­ры по умол­ча­нию: 1 попыт­ка, 10 секунд таймаута

[/spoiler]

 

Про­ве­рим:

la 30 и 45 в соот­вет­ствии с весами:

[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.155/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.155 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsServer Software: nginx
Server Hostname: 192.168.1.155
Server Port: 80Document Path: /
Document Length: 53921 bytesConcurrency Level: 100
Time taken for tests: 108.383 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 54142000 bytes
HTML transferred: 53921000 bytes
Requests per second: 9.23 [#/sec] (mean)
Time per request: 10838.281 [ms] (mean)
Time per request: 108.383 [ms] (mean, across all concurrent requests)
Transfer rate: 487.84 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.4 0 60
Processing: 147 10606 13970.9 6733 91958
Waiting: 146 10604 13970.7 6731 91957
Total: 148 10607 13971.1 6733 91959Percentage of the requests served within a certain time (ms)
50% 6733
66% 8913
75% 10731
80% 11884
90% 27123
95% 43427
98% 63028
99% 66353
100% 91959 (longest request)[/spoiler]

Схема 4

всё тоже самое но добав­ля­ем ещё один бэкенд 192.168.1.157

на 192.168.1.159 даём доступ по nfs
nano /etc/exports

/var/www/mid/ 192.168.1.157(rw,sync,no_root_squash,no_subtree_check)

далее обя­за­тель­но нуж­но пере­за­гру­зить nfs ина­че ката­лог не будет монтироваться
/etc/init.d/nfs restart
или

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

на 192.168.1.157 ста­вим nfs

yum install nfs-utils nfs-utils-lib -y

chkconfig nfs on && chkconfig rpcbind on

далее мон­ти­ру­ем уда­лён­ный раз­дел, если дан­ной дирек­то­рии нет, её сле­ду­ет создать:
mkdir -p /var/www/mid/

mount 192.168.1.159:/var/www/mid/ /var/www/mid/

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел


/etc/init.d/rpcbind start
/etc/init.d/nfs start

 

далее на 192.168.1.155 пра­вим кон­фиг nginx  /etc/nginx/nginx.conf а имен­но добав­ля­ем новый бэкенд 192.168.1.157 и убе­ра­ем весы

upstream backend {
server 192.168.1.158;
server 192.168.1.159;
server 192.168.1.157;
}

сохра­ня­ем­ся и пере­за­пус­ка­ем nginx

Про­ве­рим:

LA на каж­дом не пре­вы­шал 21

[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.155/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.155 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsServer Software: nginx
Server Hostname: 192.168.1.155
Server Port: 80Document Path: /
Document Length: 53921 bytesConcurrency Level: 100
Time taken for tests: 64.278 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 54142000 bytes
HTML transferred: 53921000 bytes
Requests per second: 15.56 [#/sec] (mean)
Time per request: 6427.772 [ms] (mean)
Time per request: 64.278 [ms] (mean, across all concurrent requests)
Transfer rate: 822.57 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.7 0 13
Processing: 179 6242 2999.2 6099 26581
Waiting: 177 6238 2999.1 6098 26580
Total: 186 6243 2999.0 6100 26581Percentage of the requests served within a certain time (ms)
50% 6100
66% 6692
75% 6887
80% 7017
90% 7924
95% 10429
98% 17245
99% 20737
100% 26581 (longest request)[/spoiler]

 

Схема 5

Добав­ля­ем ещё один бэкенд 192.168.1.156, но выно­сим сер­вер на кото­ром базы дан­ных и фай­лы 192.168.1.159

настра­и­ва­ем NFS на 192.168.1.159

[root@centos 192.168.1.159]# cat /etc/exports
/var/www/mid/ 192.168.1.154(rw,sync,no_root_squash,no_subtree_check)
/var/www/mid/ 192.168.1.155(rw,sync,no_root_squash,no_subtree_check)
/var/www/mid/ 192.168.1.156(rw,sync,no_root_squash,no_subtree_check)
/var/www/mid/ 192.168.1.157(rw,sync,no_root_squash,no_subtree_check)
/var/www/mid/ 192.168.1.158(rw,sync,no_root_squash,no_subtree_check)

ста­вим nfs на новый бэкенд 192.168.1.156

yum install nfs-utils nfs-utils-lib -y

chkconfig nfs on && chkconfig rpcbind on

mkdir -p /var/www/mid/

mount 192.168.1.159:/var/www/mid/ /var/www/mid/

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

/etc/init.d/rpcbind start
/etc/init.d/nfs start

 

настра­и­ва­ем nginx на 192.168.1.155 сле­ду­ю­щим обра­зом, добав­ля­ем в /etc/nginx/nginx.conf

в сек­цию http добав­ля­ем наш новый бэкенд 192.168.1.156 и уда­ля­ем ста­рый 192.168.1.159
upstream backend {
server 192.168.1.156;
server 192.168.1.157;
server 192.168.1.158;
}

пере­за­пус­ка­ем nginx

 

настра­и­ва­ем вто­рой сер­вер с nginx 192.168.1.154 настрой­ки иден­тич­ны пер­во­му 192.168.1.155

 

Так­же нам необ­хо­ди­мо что­бы ста­ти­ка обра­ба­ты­ва­лась на уровне nginx 192.168.1.155 и 192.168.1.154
для это­го мон­ти­ру­ем домаш­нюю дирек­то­рию/var/www/mid/

mkdir -p /var/www/mid/

mount 192.168.1.159:/var/www/mid/ /var/www/mid/

192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0

что­бы после пере­за­груз­ки авто­ма­ти­че­ски мон­ти­ро­вал­ся уда­лён­ный раздел

и созда­ём virtualhost для nginx со сле­ду­ю­щим содержимым:
cat /etc/nginx/conf.d/test.t.conf

[spoiler]server {
listen 80;
server_name 192.168.1.153;
access_log /var/www/test.t.nginx.access.log combined;
error_log /var/www/test.t.nginx.error.log error;
client_max_body_size 40m;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 4;
gzip_min_length 1024;
gzip_types text/css text/plain text/json text/x-js text/javascript text/xml application/json application/x-javascript application/xml application/xml+rss application/javascript;
gzip_vary on;
gzip_http_version 1.0;
gzip_disable msie6;
location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|swf|js|html|htm|)$ {
root /var/www/mid/site/test.t;}location / {
proxy_pass http://backend;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
}
}[/spoiler]

в моём слу­чае в server_name  я ука­зал IP адрес так как про­ве­ряю рабо­ту без исполь­зо­ва­ния домен­ных имён.

 

Далее ста­вим keepalived и зада­ём вир­ту­аль­ный IP адрес 192.168.1.153 кото­рый будет пла­вать меж­ду дан­ны­ми балансировщиками

при­сту­пим, для 2х сер­ве­ров уста­нов­ка одинаковая:

yum -y install keepalived
добав­ля­ем в автозагрузку
chkconfig keepalived on

Вклю­ча­ем марш­ру­ти­за­цию паке­тов на обо­их балансерах

nano /etc/sysctl.conf

net.ipv4.ip_forward=1

sysctl -p

Созда­ём бэкап конфига:
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.c bakup
редак­ти­ру­ем конфиг:

nano /etc/keepalived/keepalived.conf

[spoiler]! Configuration File for keepalived

global_defs {
notification_email {
mid@test.t
}
notification_email_from Andrey@test.t
smtp_server localhost
smtp_connect_timeout 30
! Имен­ное обо­зна­че­ние дан­но­го сервера
router_id centos1
}

! Ука­зы­ва­ем VRRP istance (экзем­пляр). Напри­мер даем ему имя VI_1
vrrp_instance VI_1 {
!Ста­тус сер­ве­ра в VRRP instance. Может быть MASTER или BACKUP
state MASTER
!Ука­зы­ва­ем интер­фейс к кото­ро­му будет при­вя­зан VRRP instance
interface eth0
!Ука­зы­ва­ем про­из­воль­но зна­че­ние в интер­ва­ле от 1 до 255, для того что­бы одна­знач­но опре­де­лить instance сре­ди других,
!кото­рые могут быть запу­ще­ны на хосте. Дол­жен быть оди­на­ков на всех хостах в instance.
virtual_router_id 51
! При­о­ри­тет хоста. Тот хост, кото­рый име­ет боль­ший при­о­ри­тет,  будет являть­ся MASTER. По-умол­ча­нию зна­че­ние рав­но 100.
priority 100
! Ука­зы­ва­ем вре­мя в секун­дах меж­ду VRRP запро­са­ми меж­ду хоста­ми в instance. ! По-умол­ча­нию 1 секунда.
advert_int 4
!Метод аутен­ти­фи­ка­ции. AH - ipsec Authentication Header PASS - пароль в откры­том виде.  AH более без­опа­сен и реко­мен­ду­ет­ся исполь­зо­вать его,
!но в неко­то­рых реа­ли­за­ци­ях keepalived AH метод может не рабо­тать, тогда необ­хо­ди­мо исполь­зо­вать PASS.
authentication {
auth_type PASS
auth_pass 1111
}

! Указ­ва­ем общий вир­ту­аль­ный ip-адрес для чле­нов VRRP instance. Можем ука­зать како­му интер­фей­су он будет назна­чен, а так же с
! помо­щью дирек­ти­вы "label" ука­зать для него описание.

virtual_ipaddress {
192.168.1.153 dev eth0 label eth0:vip
}
}

[/spoiler]

для  Backup-балан­се­ра кон­фиг точ­но такой же  за исклю­че­ни­ем сле­ду­ю­щих пара­мет­ров:
state 
уста­нав­ли­ва­ем BACKUP и пони­жа­ем при­о­ри­тет до 90 
state BACKUP
priority 90
далее пере­за­пус­ка­ем keepalived
/etc/init.d/keepalived restart
Stopping keepalived: [FAILED]
Starting keepalived: [ OK ]
Далее пере­за­гру­жа­ем­ся и проверяем:
[spoiler]
[root@centos 192.168.1.155]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:F5:22:AE
inet addr:192.168.1.155 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fef5:22ae/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:134 errors:0 dropped:0 overruns:0 frame:0
TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:15433 (15.0 KiB) TX bytes:12901 (12.5 KiB)eth0:vip Link encap:Ethernet HWaddr 08:00:27:F5:22:AE
inet addr:192.168.1.153 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)[/spoiler]

Как видим, всё ок, вир­ту­аль­ный ip адрес добавился.

Про­ве­рим:

Обра­ща­ем­ся по вир­ту­аль­но­му IP 192.168.1.153

LA не пре­вы­ша­ло 20

[spoiler]

[root@centos ~]# ab -c 100 -n 1000 http://192.168.1.153/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.1.153 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software: nginx
Server Hostname: 192.168.1.153
Server Port: 80

Document Path: /
Document Length: 53921 bytes

Concurrency Level: 100
Time taken for tests: 85.580 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 54165000 bytes
HTML transferred: 53921000 bytes
Requests per second: 11.68 [#/sec] (mean)
Time per request: 8558.019 [ms] (mean)
Time per request: 85.580 [ms] (mean, across all concurrent requests)
Transfer rate: 618.08 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 5.5 0 102
Processing: 154 7420 13642.7 451 64499
Waiting: 153 7412 13637.3 450 64498
Total: 154 7421 13643.4 458 64499

Percentage of the requests served within a certain time (ms)
50% 458
66% 4554
75% 8673
80% 11425
90% 22301
95% 41629
98% 60846
99% 62930
100% 64499 (longest request)

[/spoiler]

 

При  смене мето­да балан­си­ров­ки у nginx на least_conn резуль­та­ты сле­ду­ю­щие:

[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.153/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.153 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requestsServer Software: nginx
Server Hostname: 192.168.1.153
Server Port: 80Document Path: /
Document Length: 53921 bytesConcurrency Level: 100
Time taken for tests: 68.133 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 54165000 bytes
HTML transferred: 53921000 bytes
Requests per second: 14.68 [#/sec] (mean)
Time per request: 6813.284 [ms] (mean)
Time per request: 68.133 [ms] (mean, across all concurrent requests)
Transfer rate: 776.36 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.6 0 39
Processing: 185 6636 2955.7 6555 25220
Waiting: 184 6631 2955.0 6552 25218
Total: 192 6637 2955.5 6555 25220Percentage of the requests served within a certain time (ms)
50% 6555
66% 6679
75% 6779
80% 6858
90% 7286
95% 12572
98% 18007
99% 20427
100% 25220 (longest request)[/spoiler]

Схема 6

В дан­ной схе­ме в каче­стве балан­си­ров­щи­ка будет высту­пать haproxy а на бэкен­дах обра­бот­кой будут зани­мать­ся apache и nginx

Уста­но­вим на 192.168.1.156 192.168.1.157 192.168.1.158 nginx, apache пере­ве­дём на порт 8080 nginx на 80

yum -y install nginx

пра­вим кон­фиг apache
grep 8080 /etc/httpd/conf/httpd.conf
Listen 8080
ServerName www.example.com:8080
NameVirtualHost *:8080

так­же пра­вим virtualhost сайта
grep 8080 /etc/httpd/conf.d/test.t.conf
<VirtualHost *:8080>

virtualhost nginx будет выгля­деть сле­ду­ю­щим образом:

[spoiler]cat /etc/nginx/conf.d/test.t.conf

server {
listen 80;
server_name test.t www.test.t;
access_log /var/www/mid/logs/test.t.nginx.access.log combined;
error_log /var/www/mid/logs/test.t.nginx.error.log error;
client_max_body_size 40m;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 4;
gzip_min_length 1024;
gzip_types text/css text/plain text/json text/x-js text/javascript text/xml application/json application/x-javascript application/xml application/xml+rss application/javascript;
gzip_vary on;
gzip_http_version 1.0;
gzip_disable msie6;
location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|swf|js|html|htm|)$ {
root /var/www/mid/site/test.t;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
}
}

[/spoiler]
Теперь при­сту­пим к балан­си­ров­щи­кам, уста­но­вим haproxy на 192.168.1.155  192.168.1.154
yum -y install haproxy
созда­дим бэкап конфига
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
кон­фиг будет иметь сле­ду­ю­щий вид:

[spoiler]

global

log /dev/log local0

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

stats socket /var/lib/haproxy/stats

defaults
mode http
log global
option httplog
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

frontend front
bind *:80
default_backend backend_servers

backend backend_servers
balance roundrobin
server backend1 192.168.1.156:80
server backend2 192.168.1.157:80
server backend3 192.168.1.158:80

listen stats
bind :80
stats enable
stats uri /haproxy_stats
stats auth admin:password

[/spoiler]
добав­ля­ем в автозагрузку:
chkconfig haproxy on

Про­ве­рим:

LA не выше 20 на бэкендах

[spoiler][root@centos ~]# ab -c 100 -n 1000 http://192.168.1.153/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.153 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:
Server Hostname: 192.168.1.153
Server Port: 80

Document Path: /
Document Length: 107 bytes

Concurrency Level: 100
Time taken for tests: 33.654 seconds
Complete requests: 1000
Failed requests: 493
(Connect: 0, Receive: 0, Length: 493, Exceptions: 0)
Write errors: 0
Non-2xx responses: 507
Total transferred: 26799490 bytes
HTML transferred: 26637302 bytes
Requests per second: 29.71 [#/sec] (mean)
Time per request: 3365.387 [ms] (mean)
Time per request: 33.654 [ms] (mean, across all concurrent requests)
Transfer rate: 777.66 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 6.0 0 79
Processing: 0 3222 4088.2 16 19768
Waiting: 0 3219 4085.7 15 19767
Total: 0 3224 4087.4 36 19768

Percentage of the requests served within a certain time (ms)
50% 36
66% 4971
75% 5881
80% 6337
90% 8006
95% 11401
98% 15294
99% 17968
100% 19768 (longest request)

[/spoiler]