Настройка nginx для отдачи популярных файлов с SSD
Друзья, ломаю голову над несколько не тривиальной задачей.
Суть: есть файлообменник. Storage-серверы укомплектованы SSD-дисками. Есть план складывать на SSD часто запрашиваемые файлы и отдавать их с них. Подсчетом популярности файлов, копированием и удалением уже не популярных (размеры SSD, увы, ограничены) будет заниматься скрипт в автоматическом режиме.
Проблема — если скрипт сработал и удалил файл в момент того, когда его кто-то скачивает, соединение оборвется с ошибкой.
Наведите на мысль, как реализовать механизм временных локов активных файлов на удаление, либо, может быть, есть какой-то магический способ заставить nginx искать файл в другом location'е (с HDD) при его исчезновении из текущего места? Последнее, конечно, звучит больше как сказка, но мало ли…
>Проблема — если скрипт сработал и удалил файл в момент того, когда его кто-то скачивает, соединение оборвется с ошибкой.
Не оборвется так как в Linux файл будет обращаться через открытый дескриптор файла. Легко проверить, если поставить слушать файл и потом его удалить (речь про ext системы), так вот плеер будет спокойно играть дальше трек, и только при повторном обращении выдаст ошибку о том что файл не найден.
Не знал.
Тогда ламерский вопрос. А где файл хранится в момент отдачи? Например, объем диска 100Gb. Скачивается файл 3Gb. Я удаляю этот файл и заполняю диск другими файлами на все 100Gb.
На винте как был так и будет. В момент удаления файл помечается как удаленный, и вроде держится системой в резерве пока что-то читает файл. Только после того как дескриптор закрыли вы сможете переписать то место где он хранился.
Наведите на мысль, как реализовать механизм временных локов активных файлов на удаление, либо, может быть, есть какой-то магический способ заставить nginx искать файл в другом location'е (с HDD) при его исчезновении из текущего места?
Думаю тут магии никакой не надо будет. Пользуйтесь символическими ссылками. К примеру ссылки лежат в одной папке, а вот куда ведет ссылка, на HDD винт или на SSD уже вам решать надо будет, просто переписав ссылку, переключение будет практически мгновенно происходить.
Не совсем красивый вариант, зато будет быстрым и автономным.
Суть в том, что нужно два nginx.
nginx1 делает proxy_cache и складывает файлики на ssd по мере необходимости
nginx2 отдает файлики первому с hdd
После наполнения кэша у вас постоянно будут наиболее актуальные фаила в кэше, менее актуальные будут из него временами вылетать.
Для вашего варианта, можно сделать с try files и rewrite на тот локейшн который отдает с hdd
Вариант интересный, спасибо!
Однако смущает тот факт, что в этот кэш будут падать также и те файлы, что были лишь однажды запрошены. Мне более интересен вариант, когда на SSD складываются именно популярные файлы. Хотя, сам по себе лаг, необходимый на анализ логов, тоже смущает.
Я подумаю. Ваш вариант красив, т.к. не требует ничего, кроме nginx.
Рекомендую по вопросам настройки nginx обращаться непосредственно в официальный список рассылки. Там максимальная концентрация весьма компетентных в данном вопросе людей, в т.ч. и сам автор часто отвечает. Получите максимально верный вариант.
Вы уверены, что соединение оборвется с ошибкой? Если Линукс, то он открытые файлы (например, видео) после удаления продолжают работать (проигрываться, до закрытия файла, видимо), насколько помню. Так что, возможно, проблемы просто нет.
nginc.conf
Включам кеш
proxy_cache_path /mnt/tmp/cash levels=1:2 keys_zone=cache:1m max_size=200M;
proxy_temp_path /mnt/tmp 1 2;
соответственно прописываешь в локейшене что и как кешировать