Наша команда занимается удаленным администрированием серверов и не так давно к нам обратились представители сервиса ВебКонсалт с задачей построить легко масштабируемую серверную архитектуру, способную выдерживать большие нагрузки.
Мы решили, что, возможно, это будет интересно пользователям Хабрахабра, так или иначе связанным с администрированием проектов 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-запросов и вместо этого поддерживать постоянное соединение с сервером — работа в этом направлении уже ведется.
Спасибо за внимание, если у вас есть вопросы или предложения, мы будем рады обсудить их в комментариях.
Теги: #Высокопроизводительные системы #высоконагруженные системы
-
Список Все В Календаре Google
19 Oct, 24 -
Карты Ovi 3D
19 Oct, 24 -
Задайте Вопрос Водителю Марсохода
19 Oct, 24 -
Пасхальные Яйца
19 Oct, 24