Статьи

Файловый сервер Python уровня кэша

Около месяца назад я решил переместить аудио трафик (MP3 и т. Д.) Для моего подкаста Talk Python To Me . Я понял, что, когда я использовал Amazon S3 для доставки файлов, и он прекрасно работал с точки зрения доставки, он становился дорогим. Существуют и другие хостинговые платформы, которые позволяют мне раскручивать сервер Linux и доставлять файлы с этого сервера по гораздо более низкой цене.

Но у меня были некоторые оговорки. Прежде всего, я управляю многими серверами, и мысль о том, чтобы поддерживать еще один работающий, меня не привлекала. Во-вторых, аудиопоток Talk Python является буквально источником жизненной силы Talk Python To Me, и я обязан своим слушателям и спонсорам поддерживать его.

С этой целью я создал клиент ( на PyPI ) и сервер (на Python 3 с использованием Flask). У клиента есть свойство: если он когда-либо обнаружит проблему с сервером кэша, он автоматически переключится обратно на обслуживание из исходного местоположения. В моем примере, если на сервере кеша возникнут проблемы, он вернется к обслуживанию файлов непосредственно из S3. Это дало мне достаточно уверенности, чтобы не беспокоиться о зависимости от еще одного слоя / уровня.

Кроме того, сервер очень прост в настройке и построен для автоматической синхронизации с файлами, которые ему нужны для сервера из источника. Например, в моем случае представьте, что веб-сервер пытался обслужить 100_yay_show_one_hundred.mp3, и этот файл существовал в предварительно настроенном месте на Amazon S3. Самый первый запрос к уровню кэширования заставляет сервер кэша получать его от S3, и все последующие запросы на основном веб-сайте обнаруживают присутствие этого файла на уровне кэширования и используют сервер кэширования, а не более дорогой S3.

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

Эта установка обслуживает огромное количество данных без каких-либо сбоев. Когда выпускается новый эпизод подкаста, фактический сетевой трафик достигает около 900 Мбит / с в течение нескольких минут. Тем не менее, загрузка процессора и использование памяти остаются очень низкими, задержка веб-приложения низкая, и все продолжает работать.

Представляем уровень кэша

Я называю свой проект кеш-уровнем. Это, конечно, с открытым исходным кодом на GitHub по адресу:

https://github.com/mikeckennedy/cache-tier

и вы можете получить клиента через pip:

  pip3 install cache-tier

Он построен для Python 3, но должен быть легко преобразован в Python 2, если есть интерес.

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

https://github.com/mikeckennedy/cache-tier/blob/master/docs/setup/setup-cache-tier-server.txt

Создайте новую Ubuntu VM и следуйте инструкциям. Вы будете работать в кратчайшие сроки.

Использование клиента

Код клиента находится на PyPI в качестве уровня кэша. Для начала просто установите pip:

  pip3 install cache-tier

Затем вы используете его следующим образом.

Пример-кэша первого уровня использования

Вызовите verify_file (base_file_name) для проверки кэшированного файла, а также для запуска синхронизации, если это необходимо. Если verify_file возвращает True, то безопасно отправить пользователя (через перенаправление 301) на URL-адрес, созданный build_download_url (base_file_name) .

Настройка сервера

Одним из возможных вариантов развертывания является использование nginx + uWSGI + веб-приложения. Этот документ описывает шаги для настройки этого в Ubuntu:

https://github.com/mikeckennedy/cache-tier/blob/master/docs/setup/setup-cache-tier-server.txt

Вам нужно будет установить несколько настроек. Измените эти две настройки, прежде чем на стороне сервера будет работать правильно:

Файл: ./etc/nginx/sites-available/cache_tier_webapp
Значение: имя_сервера загружается. YOURDOMAIN .com;

Файл: ./config_data/prod.json
Файл: ./config_data/dev.json
Значение: download_base_url : « https://s3.amazonaws.com/ ИМЯ ПОЛЬЗОВАТЕЛЯ / ВЕДРО / FOLDER

(Примечание: Amazon S3 — это всего лишь один из вариантов, подойдет любой общедоступный файловый HTTP-сервер).