Обмен мультимедиа между несколькими серверами django(VMs)

мы развернули сервер django (nginx/gunicorn/django), но для масштабирования сервера запущено несколько экземпляров одного и того же приложения django.

вот диаграмма (архитектура)

enter image description here

каждый синий прямоугольник - это виртуальная машина.

HAProxy отправляет все запросы к example.com/admin на сервер 3. Остальные запросы распределяются между сервером 1 и сервером 2 (баланс нагрузки)

Старая проблема:

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

мы решили эту проблему, отправляя все запросы к example.com/media/* на сервер 3, а nginx с сервера 3 обслуживает все статические файлы и медиа.

Проблема прямо сейчас

мы также используем sorl-thumbnail.

когда приходит запрос на example.com/, sorl-thumbnail пытается получить доступ к медиафайлу, но он не существует на этой машине, потому что находится на Server3.

теперь все запросы к этой машине (сервер 1 или 2) получают 404 для этого медиа файла.

Одно решение, которое приходит на ум, это сделать общий раздел между всеми 3 машинами и использовать его как медиа. Другим решением является синхронизация всех медиа папок после каждой загрузки, но у этого решения есть проблема, а именно, у нас почти 2000 запросов в секунду, и иногда синхронизация может быть недостаточно быстрой, и sorl-thumbnail создает запись в базе данных пустого файла и происходит 404.

заранее спасибо и извините за длинный вопрос

Для сохранения и обслуживания загруженных пользователем файлов следует использовать объектное хранилище. django-storages делает реализацию очень простой.

Если вы не хотите использовать s3 или эквивалент, вы можете разместить свое собственное хранилище объектов на месте, совместимое с S3, с помощью minio.

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

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

Вернуться на верх