Доклад на тему Highload.

Александр Д.
28/02/2018

Тайны хайлоад.

Скандалы, интриги, расследования.

hihload

Что такое Highload?

Highload (хайлоад) - это когда приложение выдерживает/не выдерживает пики допустимой нагрузки. Я бы назвал это нагрузка по горлышко. 

Как возникает высокая нагрузка?

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

Highload можно поделить на 2-типа по возникновению:

  1. Планомерный - когда система каждый месяц собирает все больше и больше пользователей вокруг себя.
  2. Резкий - это когда вашим приложением внезапно начали пользоваться на несколько порядков больше пользователей чем раньше.

Резко нагрузка может возрасти из-за того что ваш функционал стал интересен большому кругу пользователей или на ваш ресурс подключили огромную рекламную кампанию.

Вызвать проблемы с вашим ресурсом может так называемый "Хабраэффект" - когда ссылку на ваш ресурс опубликовали на всем известном it-ресурсе или другом очень посещаемом ресурсе и все резко начали заходить к вам в приложение чтобы "посмотреть" и как правило сайт становится не доступным или открывается очень медленно.

Вы все поймете сами

Тот момент когда вы заходите на сайт, а там либо бесконечный ответ сервера, либо ошибка базы данных или еще что нибудь от сервера - это все признак того что сервер перестал справляться с текущей нагрузкой и наступил момент когда ваше приложение по горлышко забито трафиком. Системы мониторинга, клиент, менеджеры вам сообщат о том что ваше время настало.

Главный герой

Главным героем в такой ситуации является разработчик приложения со всей свитой.

  • Разработчики модулей - для оптимизации кусочков приложения
  • Системный администратор - для конфигурации сервера
  • Тех-поддержка вашего вашего хост-провайдера - помощь со стороны прова. Сеть, железо, анализ
  • Менеджеры - для успокоения клиента. Здрасте у нас тут сайт не работает
  • Добрые люди - кормить, вытирать пот со лба разработчиков

Вот они:

Что делать?

  1. Звонить клиенту и говорить про сложившуюся ситуацию
  2. Писать провайдеру чтобы узнать все ли в порядке с сетью и железом
  3. Рисовать заглушку о том что на сайте кратковременные проблемы (на всякий случай)
  4. Собрать статистику по загрузке отдельных модулей
  5. Разбить модули на статические и динамические. Статику отдаем без обработки - сразу из файла. Динамику кешируем по возможности.
  6. Засучить рукава и вперед работать с тяжелыми кусками приложения
  7. Настраивать сервер под высокие нагрузки, при необходимости нарастить серверное железо

За работу! Делаем хорошо сразу!

Все должно быть просто и независимо

Простые решения разрабатывать очень сложно так как нужно полностью реализовать тз. по приложению.

Простые решения - сложно, долго, дорого, но делать нужно изначально все просто и независимо. Зачастую редко получается собрать все модульно и независимо, но это нужно делать! Независимость модулей дает свободу и скорость монтажа/демонтажа компонентов. Простые модульные решения - это гибко.

Гибкая система не бывает сложной.

Правильно инвестировать время на разработку

Правило 95%

Инвестируйте время только в обеспечение 95% функционала. Остальные 5% отбрасывайте — это частные случаи, которые ведут к усложнению системы.

Примеры из жизни:

  • Некоторые пользователи в соц. сети могут иметь десятки тысяч связей. Если их менее 5%, поставьте ограничение и не решайте эту задачу, пока есть более важные проблемы.
  • Некоторые пользователи грузят видео, которое имеют нестандартную кодировку. Покажите ошибку вместо того, чтобы тратить время на доработку конвертера.
  • Менее 5% пользователей используют браузеры с отключенными куками, ограничениями Javascript и т.п. Отключите возможность просмотра сайта для них и разместите подробные инструкции по обновлению браузера вместо адаптации сайта под них.

Нужно решать только самые важные задачи, так как у разработчика - задач всегда больше чем времени на их решение. Поэтому очень важно уметь расставлять приоритеты, и верно принимать решения на любом уровне.

Архитектура

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

Если фундамент верный и крепкий, то можно построить многоэтажное приложение.

1. Простота

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

Для старта это очень хорошее решение. Экономия сил, денег и времени на поддержку. Можно арендовать мощный сервер чтобы справиться с возрастающей нагрузкой. Но бывает так, что приложение сразу отдается огромной аудитории и сразу ясно что highload с первых дней. Вот тогда делаем то что описано ниже.

2. Миграция базы данных на отдельный сервер

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

Обычно один хит это от 10-ти до 100 (иногда более) запросов в бд.

Разнесение базы данных и вашего бек-енда позволит повысить производительность базы данных, и облегчить работу всех компонентов на бек-енд сервере. 

Если база и бек-енд лежат отдельно, то эти сервера работают независимо и, следовательно, не влияют друг на друга.

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

Даунтайм (время простоя)

Когда вы будите переносить базу данных, то пользователи будут в нее что то писать. Наше приложение работает 24/7 и поэтому каждую секунду работает CRUD

Что делать?

  • Просто и эффективно. Отключить ресурс, и вывесить объявление о плановых работах. Лучше это делать ночью (ели это не порнхаб)
  • Репликация баз данных.

Репликация это механизм для масштабирования базы данных, который позволяет синхронизировать базы данных.

Мастером будет старый сервер, а слейвом новый. После настройки достаточно поменять IP адрес базы в приложении на новый сервер. А далее — выключить старый сервер. 

После того как настроите как перенесете базу, не забудьте настроить конфиги.

3. Разносим веб-сервер и бек-енд

Выделение бек-енд сервера (в нашем случае PHP) позволит повысить производительность вычислительных мощностей.

Сервер PHP обычно называют бекендом. Тогда Nginx будет отдавать файлы статики самостоятельно, а PHP сервер будет занят только обработкой скриптов.

4. Несколько PHP бекендов

Веб сервер и бек-енд разнесли, но нагрузка продолжает зашкаливать. Делаем несколько php бекендов.

5. Кеширование

Простое и эффективное решение - помимо кеша которой используют компоненты приложения, подключить Memcache.

6. Очереди задач для тяжелых вычислений

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

7. Сервер для хранения файлов

Файлов много, обычно их хранят там же где и основное приложение. Для больших сервисов это не правильно. Необходимо загружать файлы на отдельные сервера и отдавать их на отдельном домене. fs-1,fs-2...

8. Рекомендации по разработке

  • Понимание принципов важнее знания инструментов
  • Удаление кода лучше его написания
  • Любое решение имеет плюсы
  • Уровень мышления определяет уровень решений
  • Побочные эффекты требуют изоляции
  • Абстракция управляет сложностью
  • Тесты вселяют уверенность