Thank you for reading this post, don't forget to subscribe!
Проверять будет утилитой apachebench
Синтаксис команды следующий
ab [options] [http[s]://]hostname[:port]/path
Самыми важными ключами для любого тестирования являются ключ n — количество запросов страницы и ключ c — количество конкурентных запросов. Запустим утилиту с этими ключами.
Остальные ключи:
Рассмотрим вывод результата построчно:
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) — время соединения в миллисекундах
Строки: connect — время соединения с сервером, processing — время обработки запроса, waiting — полное время ожидания, включая processing и время ожидания в очереди, total — общее время выполнения запроса.
Схема 1
со второго будем запускать проверку 192.168.1.160
Схематично будет выглядеть следующим образом:
[root@centos ~]# ab -c 100 -n 1000 http://192.168.1.159/
[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
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 ]
чтобы не перезагружать можно использовать:
1 2 |
<strong>exportfs <span class="re5">-a </span></strong> |
1 |
1 |
Также необходимо в настройках сайта указать в качество хоста для подключения 192.168.1.159 и для нашего пользователя test разрешить удалённый доступ(пароль test): |
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/
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
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 ]
чтобы не перезагружать можно использовать:
1 2 |
<strong>exportfs <span class="re5">-a </span></strong><span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
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/
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
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
Запросы сначала отправляются бэкенду с наименьшим количеством активных подключений (но с учетом весов):
1 2 3 4 5 6 |
upstream backend { <b>least_conn;</b> server backend1.somesite.com; server backend2.somesite.com; } |
# Если количество активных соединений одинаково, то дополнительно используется метод round-robin
Hash и IP hash
При помощи этого метода можно создать своего рода постоянные соединения между клиентами и бэкендами.
Для каждого запроса Nginx вычисляет хэш, который состоит из текста, переменных веб-сервера или их комбинации, а затем сопоставляет его с бэкендами:
1 2 3 4 5 6 7 |
upstream backend { <b>hash $scheme$request_uri;</b> server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; } |
# Для вычисления хэша используется схема (http или https) и полный URL
IP hash работает только с HTTP, это предопределенный вариант, в котором хэш вычисляется по IP-адресу клиента:
1 2 3 4 5 6 7 |
upstream backend { <b>ip_hash;</b> server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; } |
# Если адрес клиента IPv4, то для хэша используется первые три октета, если IPv6, то весь адрес
Веса бэкендов
Если в стеке определенные бэкенды мощнее, чем другие, то пригодятся веса:
1 2 3 4 5 6 |
upstream backend { server backend1.somesite.com <b>weight=10;</b> server backend2.somesite.com <b>weight=5;</b> server backend3.somesite.com; <b>server 192.0.0.1 backup;</b> } |
# По умолчанию веса равны 1
В этом примере из каждых 16 запросов первый бэкенд будет обрабатывать 10, второй 5, а третий 1. При этом бэкап-сервер будет получать запросы только если три основных бэкенда недоступны.
Мониторинг
Если Nginx считает, что бэкенд сервер недоступен, то временно перестает слать на него запросы. За это отвечает две директивы:
- max_fails — задает количество неудачных попыток подключений, после которых бэкенд определенное время считается недоступным;
- fail_timeout — время, в течение которого сервер считается недоступным.
Параметры выглядят так:
1 2 3 4 5 |
upstream backend { server backend1.somesite.com; server backend2.somesite.com <b>max_fails=3 fail_timeout=30s;</b> server backend3.somesite.com <b>max_fails=2;</b> } |
# Параметры по умолчанию: 1 попытка, 10 секунд таймаута
[/spoiler]
Проверим:
la 30 и 45 в соответствии с весами:
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
или
1 2 |
<strong>exportfs <span class="re5">-a </span></strong> |
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0
чтобы после перезагрузки автоматически монтировался удалённый раздел
1 |
<strong><span class="re5"> </span></strong> |
на 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/
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
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
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/
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
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/
1 |
<span class="re5">не забываем добавлять запись в</span><strong><span class="re5"> /etc/fstab</span></strong> |
192.168.1.159:/var/www/mid/ /var/www/mid/ nfs defaults 0 0
чтобы после перезагрузки автоматически монтировался удалённый раздел
и создаём virtualhost для nginx со следующим содержимым:
cat /etc/nginx/conf.d/test.t.conf
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]
state устанавливаем BACKUP и понижаем приоритет до 90
priority 90
/etc/init.d/keepalived restart
Stopping keepalived: [FAILED]
Starting keepalived: [ OK ]
[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
[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 результаты следующие:
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]
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
Проверим:
LA не выше 20 на бэкендах
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]