Обмен мультимедиа между несколькими серверами django(VMs)
мы развернули сервер django (nginx/gunicorn/django), но для масштабирования сервера запущено несколько экземпляров одного и того же приложения django.
вот диаграмма (архитектура)
каждый синий прямоугольник - это виртуальная машина.
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, чтобы виртуальная машина позаботилась о синхронизации файлов с другими виртуальными машинами.