Как выдержать большие нагрузки. 3 этапа оптимизации сайта 5баллов.ru
(How to sustain greater loads? The three stages of the ***** web site optimization)
*****@***ru,
ведущий разработчик
*****
В связи с бурным развитием Интернета в последние годы, высокую популярность приобрели веб-сервисы. Многие начинают свой рабочий день с прочтения почты и просмотра новостей, а также различных приколов. В данной статье описано устройство сервисы подобного рода на примере сайта *****, и способы обеспечения стабильной работы при нагрузке в сотни тысяч показов в день.
Определим, что собственно создает нагрузки на серверы. На первом месте стоят запросы к базам данных. Именно их в первую очередь следует оптимизировать для повышения производительности сайта. На втором месте стоят различные скрипты, генерирующие динамический контент. Замыкает список статический контент (картинки, статичные страницы), который отдается веб-сервером, что тоже создает нагрузку на сервер.
Оптимизация сайта ***** под высокие нагрузки состояла из трех этапов. Первый и самый главный – оптимизация запросов к базе данных. Здесь важно изначально правильно спроектировать базу данных и построить индексы. После проектирования базы и построения индексов нужно заполнить таблицы тестовыми данными, причем нужно учесть, что количество записей в таблицах будет постоянно расти, поэтому следует брать количество записей в таблицах с запасом. После того, как таблицы были заполнены тестовыми данными, приступаем к оптимизации индексов, которые были созданы в таблицах на стадии проектирования базы данных. Для этого нужно подготовить список медленных запросов. Медленные запросы – это запросы к базе данных, которые не используют индексы и выполняются больше определенного времени, допустим, 1 секунды. Для анализа запросов используют команду explain[1]. С помощью данной команды можно выяснить, использует или нет индексы запрос, эффективно ли запрос использует индексы (возможно, имеет смысл построить индексы по-другому или использовать составные индексы), сколько записей просмотрит СУБД для того, чтобы выполнить запрос, и много другой полезной информации. Данная операция позволила, пусть и незначительно, но сократить время выполнения запросов до 5% - 10%.
Второй этап – это оптимизация самих скриптов. Сайт написан на языке php. Для написания кода была использована среда разработки Zend Studio 5.2.0. Так как помимо подсветки кода и всплывающих подсказок, что умеют делать почти все редакторы, в Zend Studio есть отладчик кода и профайлер (profiler). С помощью профайлера можно выяснить, сколько времени затрачивается на выполнение какой-либо функции. Так же используя профайлер, несложно выяснить, в каких функциях встречаются медленные запросы к БД и, соответственно, оптимизировать их (см. выше). На крупных сайтах страницы содержат много разной информации, для извлечения которой выполняется несколько запросов (иногда эта цифра доходит до 10), что, соответственно, создает большую нагрузку на сервер. Решением данной проблемы является использование кэширования. На сайте ***** вся страница разделена на блоки, для генерации которых используется отдельный запрос, причем, кэшируется каждый блок отдельно. Это было сделано для того, чтобы в случае изменения информации в одном из блоков, не приходилось извлекать информацию для остальных блоков. В случае изменения информации просто очищается кэш для блока, в котором произошло изменение, и при последующем посещение страницы пользователем он автоматически кэшируется заново. В результате снижается количество выполняемых запросов при генерации страницы, что существенно снижает нагрузку на сервер.
Последний этап – оптимизация отдачи статического контента. Для отдачи статического контента используется разработка нашего соотечественника Игоря Сысоева – nginx. Данный сервер позволяет отдавать статический контент гораздо быстрее, чем это делает сервер apache, так же, nginx использует меньше памяти, чем apache в связке с mod_php.
Даже если нет медленных запросов, при высоких нагрузках наступает такой момент, когда сервер физически не может отдавать и генерировать контент. В данном случае на помощь приходит кластеризация - распределение задач по нескольким серверам.
Проект 5баллов построен по следующей структуре:
2. Серверы баз данных взаимодействуют с back-end и между собой по следующей схеме: mysql1 – сервер, на который происходят запросы на обновление и добавление данных, сервера mysql2 и mysql3 – это репликация (копия) сервера mysql1.
Файловый сервер – это сервер, на котором хранятся файлы и образовательные программы. Т. к. у ***** реализована защита от скачивания рефератов роботами, то рефераты отдаются через back-end, а образовательные программы и картинки отдаются front-end напрямую.В заключении хочется сказать, что данная организация позволяет выдерживать большие нагрузки, которые приходятся на наш сервер в период сессий и вступительных экзаменов в вузы.
Автор с удовольствием ответит на ваши вопросы и выслушает критику в свой адрес по электронной почте.
[1] Подробнее об этой команде: http://dev. /doc/refman/5.0/en/explain. html


