ИМ
Dec. 11, 2018, 5:56 p.m.

django и celery на разных серверах

django, celery

Доброго времени суток. Интересует такой вопрос как разнести приложение django и приложение celery на разные сервера.
Тоесть имею:
2 сервера в одной локальной сети web-server и storage. web-server у меня выполняет роль собственно веб-сервера с приложением, а storage выполняет роль хранилища для видео-контента. Сейчас у меня на web-server крутится приложение, celery+redis+ffmpeg(связка для конвертирования видео-контента). storage же сейчас выполнят только роль хранилища.
Хочу распределить нагрузку на 2 сервера чтобы операция конвертирования велась не на web-server а на storage.
Каким образом это все можно организовать?

3

Do you like it? Share on social networks!

9
Evgenii Legotckoi
  • Dec. 11, 2018, 6:03 p.m.

Добрый день.

Я пока с такой задачей не сталкивался, но когда столкнусь, то первое, что сделаю, то просто подниму оба инстанса приложения на обоих серверах. Если весь бэкенд написан в одном приложении web+celery.

И просто разнесу нагрузку с помощью nginx. Для команд конвертирования должны быть в данном случае отдельные вьюшки сделаны, а nginx будет отправлять запросы конвертирования в сторону сервера storage. Но это если у вас бэкенд web приложения отвечает за старт конвертирования и т.д.

Запросы в данном случае правильно будет через nginx маршрутизировать.

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

    Илья Чичак
    • Dec. 11, 2018, 6:18 p.m.

    У вас не получится передать нормально сообщение в целери на другом сервере. Даже если будет один и тот же проект на разных хостах. Как вариант - вынести логику обработки в отдельное приложение, его разместить на втором сервере и снабдить каким-нибудь API. И заставить первое приложение отсылать запрос на второй сервер для запуска какой-либо обработки.

      Evgenii Legotckoi
      • Dec. 11, 2018, 6:25 p.m.
      • (edited)

      Теоретически, можно просто через nginx слать все запросы, касающиеся загрузки, конвертации и работы с celery в сторону storage сервера.

      Это должно работать, если не смешивать одно с другим на одном сервере. Фактически одно приложение и будет получаться.

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

        Илья Чичак
        • Dec. 11, 2018, 7:56 p.m.
        • (edited)
        • The answer was marked as a solution.

        Я тут подумал:

        Допустим, мы разворачиваем один и тот же проект на двух тачках. На одной из них запускаем redis, rabbitmq. при этом рэбита мы запускаем в сетевом режиме: https://www.rabbitmq.com/networking.html (только при условии, что тачка с рэбитом не светит наружу, иначе дыра в безопасности). оба проекта смотрят на рэббита на второй машине. celery workers запускаются на второй машине.

        впринципе должно работать=)

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

          Evgenii Legotckoi
          • Dec. 11, 2018, 8:26 p.m.

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

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

            Да, так все работает. Спасибо вам.
            Еще маленький вопросик по проекту на 2 серверах: Если мысль их синхронизировать средствами rsync или же монтировать средствами nfs с первого сервера на второй?

              Илья Чичак
              • Dec. 11, 2018, 10:01 p.m.
              • (edited)

              Имеете в виду, чтобы код проекта размазывался по обоим серверам?

              Если да, то категорически не советую.

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

              Вариант с NFS - дополнительная нагрузка на сеть. (Правда это всего лишь попытка отговорить=))

              В целом, есть ряд проблем и возможных проблем :

              1. В будущем возможно возникновение дополнительных настроек специфичных для конкретного сервера
              2. В настоящем - все равно требуется перезапуск сервиса или какой там у вас способ запуска проекта используется=)

              Варианты решения проблемы:

              1. Написать на основном сервере bash скрипт, который будет разворачивать проект, а потом ходить по ssh на второй и делать то же самое=)
              2. Почитать про различные системы деплоя, типа ansible (правда там есть свои ограничения, тонкости и нюансы)

              для баш скрипта - все крайне просто:

              1. git pull
              2. pip install -r requirements.txt
              3. sudo service nginx restart
              4. sudo service gunicorn restart
              5. sudo service celery_worker_restart
              6. ssh server2
              7. повторить

              =)

              НАПИСАНИЕ СКРИПТОВ НА BASH

              ФУНКЦИИ BASH В СКРИПТАХ

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

                Илья Чичак
                • Dec. 11, 2018, 10:02 p.m.
                • (edited)

                кстати, списки странно рендерятся из маркдауна=) там с красивым супом случайно перебор не случился?=)

                а, не, сам дурак=) меня почему-то переклинило, что список делается через

                1. 1)
                , а не
                1. 1.

                  Нет. тут все проще, и никаких скриптов думаю не нужно. Там где у меня запускается redis+celery+ffmpeg нужно всего лишь одно приложение для конвертации которое статическое. Весь проект туда не обязательно шмалять.

                    Comments

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    • Last comments
                    • AK
                      April 1, 2025, 11:41 a.m.
                      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                    • Evgenii Legotckoi
                      March 9, 2025, 9:02 p.m.
                      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                    • VP
                      March 9, 2025, 4:14 p.m.
                      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                    • ИМ
                      Nov. 22, 2024, 9:51 p.m.
                      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    • Evgenii Legotckoi
                      Oct. 31, 2024, 11:37 p.m.
                      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup