Архитектура Высоконагруженного Проекта На Примере Веб-Консультанта

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

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



Архитектура высоконагруженного проекта на примере веб-консультанта

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

Для этого мы использовали систему управления проектами и задачами — Redmine, а также поддерживали связь с разработчиками проекта, которые оперативно отвечали на наши вопросы и вносили необходимые изменения в код. Чтобы понять суть поставленной перед нами задачи, давайте разберемся, в чем заключается принцип работы проекта.

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

Менеджеры со своей стороны имеют на выбор два варианта консультирования – через открытую в браузере панель или через любой привычный Jabber-клиент. В свою очередь, посетители сайтов, где установлена система, видят кнопку вызова консультанта, которая загружается с сервера WebConsult (а значит, скорость работы сервиса очень важна).

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

Также значительная часть нагрузки приходится на операторов, которые используют основной метод консультирования – через веб-клиент. При этом от тысяч консультантов, одновременно находящихся онлайн, через определенное количество секунд приходят HTTP-запросы на обновления (новый клиент, сообщение, изменение различных статусов); это также потребляет огромное количество ресурсов на HTTP-серверах и серверах баз данных.



Балансировка


Архитектура высоконагруженного проекта на примере веб-консультанта

Перейдем к рассмотрению построенной нами архитектуры.

Все основано на балансировке на уровне DNS (round-robin), которая передает трафик на два фронта (это удобно и для случаев, когда один из серверов кратковременно недоступен — современные браузеры автоматически передают запрос на второй сервер).

Фронты, в свою очередь, пересылают прокси-трафик с помощью nginx на HTTP-серверы — web1, web2, web3 и так далее.



Виртуализация
Для каждой отдельной задачи мы постарались создать свой OpenVZ-контейнер, чтобы изолировать логические части проекта друг от друга, а также иметь возможность быстро выделить контейнер на отдельный физический сервер.

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



веб-сервер Nginx


Архитектура высоконагруженного проекта на примере веб-консультанта

В целях экономии трафика и оптимизации нагрузки вся передаваемая статика кэшируется с помощью nginx. Предыдущая архитектура использовала NFS для хранения файлов и исходного кода, но от нее было решено отказаться из-за дополнительной нагрузки.

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

NGINX настроен так, что если он не находит изображения локально, он ищет их на других веб-серверах, используя try_files $uri. серверы , и в указанном месте серверы указан перечень веб-серверов.

Кроме того, статические данные синхронизируются с другими серверами несколько раз в день, что делает их доступными локально.



Джаббер
Важная часть проекта WebConsult — работа с клиентами на сайте через Jabber. Openfire используется в качестве XMPP-сервера с рядом самописных модулей, позволяющих интегрироваться с внутренней структурой проекта и передавать сообщения из Jabber в HTTP и обратно.

Для удобства клиентов стояла задача сделать возможным подключение к jabber-серверу не только через прямой домен jabber.consultsystems.ru, но и через основной домен Consultsystems.ru. Для этого необходимо было организовать проксирование портов.

Мы решили заменить ранее использовавшийся rinetd на более продвинутое решение и использовали для этой задачи HAProxy, который перенаправляет порты 5222, 5223 в режиме TCP.

Для разработчиков
Поскольку ВебКонсалт - проект, который постоянно дорабатывается и расширяется, необходимо было придумать решение, которое позволило бы разработчикам видеть внесенные изменения на сервере в собственной «песочнице», чтобы клиенты заметили их только после того, как все будет сделано.

протестировано, и окончательное развертывание завершено.

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

В качестве системы контроля версий был выбран GIT, как привычное и современное решение.

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

проекта.

Также для удобства мы написали небольшой плагин для Redmine, который позволяет авторизованным пользователям выполнять развертывание по нажатию кнопки.



База данных
В качестве сервера базы данных мы выбрали Percona Server, как более производительную версию сервера mysql. Memcached служит для централизованного хранения пользовательских сеансов.

Доступ к нему открыт только в сети по правилам iptables.

Масштабирование
В результате получается структура, которая легко масштабируется по горизонтали за счет добавления новых веб-серверов путем «клонирования» существующего контейнера OpenVZ и перемещения его на новую машину.

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

Также некоторые «тяжелые» функции, для которых сейчас используется MySQL, будут перенесены в NoSQL-решения, такие как Redis, что серьезно разгрузит серверы.

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

Спасибо за внимание, если у вас есть вопросы или предложения, мы будем рады обсудить их в комментариях.

Теги: #Высокопроизводительные системы #высоконагруженные системы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.