20
2011 Масштабирование и отказоустойчивость с Nginx Специально для TulaDev.net

Масштабирование и отказоустойчивость с Nginx

Embed Size (px)

DESCRIPTION

Масштабирование Web-приложений (на базе IIS) при помощи HTTP-сервера Nginx. Обеспечение 100% отказоустойчивости.

Citation preview

Page 1: Масштабирование и отказоустойчивость с Nginx

2011

Масштабирование и отказоустойчивость с Nginx

Специально для TulaDev.net

Page 2: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

О чем доклад?

Доклад об Nginx.Nginx – это маленький, но удаленький HTTP-сервер.

Что он умеет:

• обслуживание статических запросов;

• акселерированное проксирование с кэшированием;

• простое распределение нагрузки и отказоустойчивость;

Может работать на:

• FreeBSD 3-7 (i386, amd64);

• Linux 2.2-2.6 (i386); Linux 2.6 (amd64);

• Solaris 9 (i386, sun4u); Solaris 10 (i386, amd64, sun4v);

• MacOS X (ppc, i386);

• Windows XP, Windows Server 2003.

• В общем работает на всем, что движется где есть процессор.На моем WiFi-маршрутизаторе дома, например, работать будет

Page 3: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

О чем доклад?

Разработчик:

• Игорь Сысоев, в настоящий момент работает в Rambler.

• 12 апреля 2011 года выпустил версию 1.0

Насколько популярен (данные netcraft.com, май 2011):

Насколько популярен (данные w3techs.com, май 2011):

«Nginx is used by 7.1% of all the websites whose web server we know».

Для .ru доменов - 47.7%.

http://w3techs.com/technologies/breakdown/ws-nginx/top_level_domain

Developer May 2011 Percent Change

Apache 203,609,890 62.71% 1.58

Microsoft 59,646,778 18.37% -0.46

nginx 23,850,265 7.35% -0.16

Page 4: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

ОМГ, а где же Microsoft?

В докладе я постараюсь показать, что масштабировать любые web-приложения (даже на Microsoft-платформе) при помощи Nginx – это:

• Дешево

• Просто

• Эффективно

• Надежно

Nginx

IIS 1 IIS 2 IIS 3 …

Page 5: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Давайте определим понятия

Масштабирование – это механизм, позволяющий пропорционально увеличивать производительность системы за счет добавления нового оборудования.

Отказоустойчивость – это механизм, позволяющий не терять работоспособности системы при выходе из строя единицы оборудования.

Можно рассматривать эти термины в контексте программ, компьютеров или компьютерных комплексов (кластеров).

Page 6: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Зачем это нужно?

Для того, чтобы понять, зачем я затеял этот доклад, давайте сделаем эксперимент.

Давайте посчитаем, сколько запросов к среднестатистическому сайту делает среднестатистический пользователь.

Возьмем первый попавшийся сайт, например, http://www.tuladev.net/

Page 7: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Зачем это нужно?

Протокол обращений к серверу:№ Запрос Код ответа

1http://tuladev.net/ 2002http://tuladev.net/Scripts/MicrosoftAjax.js 2003http://tuladev.net/Scripts/MicrosoftMVCValidation.js 2004https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.4.4.min.js 2005http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.7/jquery-ui.js 2006http://tuladev.net/Scripts/UploadFile.js 4047http://tuladev.net/Scripts/plugins/jquery.imgareaselect.js 2008http://tuladev.net/Scripts/plugins/jquery.metadata.js 2009http://tuladev.net/Scripts/plugins/fileuploader.js 200

10http://tuladev.net/Scripts/plugins/FileUploader2.js 20011http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js 20012http://jquery-ui.googlecode.com/svn/.../jquery.bgiframe-2.1.2.js 20013http://ajax.googleapis.com/ajax/libs/.../jquery-ui-i18n.min.js 20014http://yandex.st/jquery-ui/1.7.2/i18n/ui.datepicker-ru.js 20015http://connect.facebook.net/en_US/all.js#xfbml=1 20016http://userapi.com/js/api/openapi.js?26 20017http://ajax.googleapis.com/ajax/libs/jqueryui/.../jquery-ui.css 20018http://ajax.microsoft.com/ajax/jquery.ui/1.8.7/.../jquery-ui.css 20019http://tuladev.net/Content/css/imgareaselect-default.css 20020http://tuladev.net/Content/Site.css?v=5 20021http://api-maps.yandex.ru/.../index.xml?key=AGXKrk0BAAAAz3owU... 20022http://mc.yandex.ru/metrika/watch.js 20023http://vkontakte.ru/js/api/xd_connection.js?2 20024http://tuladev.net/Scripts/UploadFile.js 40425http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.7/jquery-ui.js 20026http://tuladev.net/Content/Images/Gerb.png 20027http://tuladev.net/Content/Images/Ineta.png 20028http://tuladev.net/Content/images/LogOnControllerImg.png 20029http://tuladev.net/Content/images/MenuBackGround.png 20030http://api-maps.yandex.ru/1.1.19/_YMaps.css 20031http://api-maps.yandex.ru/1.1.19/_YMaps.js 20032http://api-maps.yandex.ru/1.1.19/xml/data.xml?v=1.54.1 20033http://tuladev.net/Home/Show?userID=8 20034http://tuladev.net/Content/Images/Codemasters.png 20035http://cdn.userecho.com/js/widget-1.4.gz.js 20036http://mc.yandex.ru/.../2989519?&cnt-class=0&rn=286126%... 20037http://tuladev.net/Content/images/FooterBackGround.png 20038http://tuladev.net/Content/images/GoldSponsors.png 20039http://tuladev.net/Content/images/SilverSponsors.png 20040http://tuladev.net/Content/images/BronzeSponsors.png 20041http://tuladev.net/Content/images/Title.png 20042http://ajax.microsoft.com/ajax/.../ui-bg_flat_75_ffffff_40x100.png 20043http://ajax.microsoft.com/.../ui-bg_highlight-soft_15_cc0000_1x10... 20044http://ajax.microsoft.com/ajax/.../ui-icons_ffffff_256x240.png 200

45http://cdn.userecho.com/.../0J7RgdGC0LDQstC40YLRjCDQvtGC0LfRi9Cy 200

№ Запрос Код ответа

1 http://tuladev.net/ 200

2 http://tuladev.net/Scripts/MicrosoftAjax.js 200

3 http://tuladev.net/Scripts/MicrosoftMVCValidation.js 200

4 https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.4.4.min.js 200

5 http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.7/jquery-ui.js 200

6 http://tuladev.net/Scripts/UploadFile.js 404

7 http://tuladev.net/Scripts/plugins/jquery.imgareaselect.js 200

8 http://tuladev.net/Scripts/plugins/jquery.metadata.js 200

9 http://tuladev.net/Scripts/plugins/fileuploader.js 200

10 http://tuladev.net/Scripts/plugins/FileUploader2.js 200

11 http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js

200

12 http://jquery-ui.googlecode.com/svn/.../jquery.bgiframe-2.1.2.js 200

… … …

Page 8: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Зачем это нужно?

Давайте немного детальнее разберем, что это за запросы:

• 45 запросов при загрузке одной страницы!

• 22 запроса к домену tuladev.net

• 21 запрос к статическим файлам

• 2 несуществующих файла (404 ответ)

• 1 запрос к ASP странице

• 95% запросов для обработки не требуют никакой сложной логики. С обработкой таких запросов вполне мог бы справиться один из первых HTTP-серверов в истории человечества.

Page 9: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Зачем это нужно?

Оперируя понятиями .NET, C#, ASP мы с вами сможем оптимизировать лишь 5% всех запросов, обрабатываемых сервером для того, чтобы отобразить пользователю главную страницу этого среднестатистического сайта.

Чтобы оптимизировать остальные 95% нам нужно разбираться уже не столько в .NET, сколько в настройках и производительности web-сервера.

Этот вопрос лежит скорее в области системного администрирования, но я думаю, что мы с вами разберемся.

Page 10: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

А есть ли проблема?

Так может быть нет ничего страшного в этих запросах к статическим файлам?

Может быть это всего лишь «песок» и он не оказывает существенного влияния на скорость загрузки страницы.

Чтобы ответить на этот вопрос давайте вспомним, что быстрее скопировать: 1 файл в 1 Mb или 1000 в 1 Kb?

Мелкие файлы всегда медленнее передавать из-за наличия накладных расходов.

Page 11: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Тестовое окружение

Oracle VM VirtualBox

3 виртуальные машины, соединенные сетью 1 Gbps:

• Windows Server 2003 (1Gb) – работает IIS 6.0192.168.250.1:80 – IIS

• Debian Linux (nginx) (256 Mb) – работает Nginx 1.0.1192.168.250.2:80 – Apache192.168.250.3:80 – Nginx192.168.250.4:80 – Nginx

• Debian Linux (benchmark) (256 Mb) для запуска “ab”IP не важен

Page 12: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Давайте посмотрим

Проведем 1-й эксперимент:

Маленький HTML файл, ~150 байт.

Посмотрим, с какой скоростью его будет отдавать:

• Apache• IIS• Nginx

В качестве тестирующего приложения буду использовать утилиту ApacheBench

http://httpd.apache.org/docs/2.0/programs/ab.html

Page 13: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Давайте посмотрим

Проведем 2-й эксперимент:

Большой EXE файл, ~1 Mбайт.

Посмотрим, с какой скоростью его будет отдавать:

• Apache• IIS• Nginx

В качестве тестирующего приложения буду использовать утилиту ApacheBench

http://httpd.apache.org/docs/2.0/programs/ab.html

Page 14: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Откуда такая разница?

Коренная причина в особенностях web-серверов.

• IIS – это вообще-то Application server.

• Nginx – это HTTP-сервер. Он изначально создавался именнодля целей быстрой обработки запросов.

Игорь Сысоев называет причиной такой разницы то, что nginx использует вызов sendfile (для не Linux платформ используются другие механизмы).

Читаем, что такое sendfile:

«системный вызов, который выполняет передачу файла за одно обращение», при этом «не происходит переключение контекста между пользовательским режимом и режимом ядра, а это весьма "дорогостоящая" операция».

Page 15: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Что позволяет Nginx

Масштабирование

Nginx позволяет скрывать за собой сотни серверов, которые будут иметь единую точку входа. Распределять между ними запросы практически по достаточно широкому набору возможных правил.

Отключение любого из серверов бэкэнда не повлияет на работоспособности системы (естественно пропорционально просядет производительность)

Но отключение сервера с Nginx роняет всю систему.Как быть?

Page 16: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Что позволяет Nginx

Отказоустойчивость

Nginx сам является единой точкой отказа. Чтобы обеспечить близкую к 100% отказоустойчивость нужно воспользоваться дополнительным механизмом.

CARP позволяет сделать так, что несколько машин могут обслуживать запросы к одному IP. Выход из строя любой из них не нарушает работоспособности системы.

На практике 2-х машин хватит, чтобы обеспечить очень близкую к 100% отказоустойчивость.

Page 17: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

И снова, а где Microsoft?

Nginx – это не панацея.

Он не умеет выполнять приложения .NET (хотя умеет, например, perl)

Это всего лишь маленький легкий HTTP-сервер, который умеет здорово отдавать статические файлы.

Но кроме этого его можно использовать для проксирования других Web-серверов.

Вот тут и вступает в игру IIS.

Связка Nginx+IIS гораздо мощнее отдельного IIS или отдельного Nginx.

Page 18: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Как смасштабировать IIS

Известные мне способы

• DNS round robin

• Nginx proxy_pass

• Common Address Redundancy Protocol (CARP)

• Microsoft Azure (неявная реализация)

• Microsoft Network Load Balancing (NLB)

• Microsoft Application Request Routing (ARR)

Page 19: Масштабирование и отказоустойчивость с Nginx

For TulaDev.net \ 2011

Где Nginx не поможет

• Для обработки 1-го запроса не хватает мощности 1-го сервера. (Если нужно склеить несколько разных блоков, то Nginx умеет SSI ).

• Поток входящих запросов не могут обработать все доступные бэкенды. (Здравствуй, 504 Gateway time out).

• Поток входящих запросов таков, что не справляется Nginx. Тут нужно применять DNS round robin.

• По каким-то причинам нет возможности использовать Unix-систему. (Несмотря на то, что Nginx работает в Windows, производительность и надежность там будет не та).

Page 20: Масштабирование и отказоустойчивость с Nginx

На этом все

Почитать об Nginx: http://sysoev.ru/nginx/Задать мне вопрос: [email protected]