Я приношу извинения заранее, если этот вопрос может (при необходимости) быть несколько широким. Я буду стараться изо всех сил сохранять его в формате допустимого вопроса.
Я в настоящее время настраиваю бэкенд для обслуживания большого объема статических файлов (изображения, чтобы быть конкретным). Полный трафик для конечного продукта, как ожидают, будет крупным, таким образом, масштабируемость и уклонение всех видов узких мест будут необходимостью.
Мое первоначальное заключение состоит в том, что лучший подход к выполнению этого настраивает кластер виртуальных серверов для обрабатывания запросов. Я буду использовать стандартные стратегии выравнивания нагрузки, чтобы удостовериться, что клиентские запросы распределяются одинаково среди узлов в кластере, таким образом, эта часть не является никакой проблемой.
Часть, которая является проблемой, - то, как эффективно хранить сами статические файлы на кластере. Мы ожидаем, что будет присутствовать очень большая сумма (Диапазон терабайта) данных и сохраняем зеркальные копии файлов на каждом узле, просто не опция.
Казалось бы, что меня по существу оставляют с 2 опциями:
1) Используйте центральный файловый сервер, к которому узлы могут выполнить запросы. Мне трудно видеть, как я могу мешать этому серверу стать узким местом, как бы то ни было.
2) Используйте 1) в сочетании с некоторым механизмом кэширования на узле для предотвращения избыточных запросов к файловому серверу.
3) Некоторое другое блестящее решение, которое сохранит мою душу и рендеринг 1) и 2) устаревший.
Какова была бы хорошая стратегия получить этот вид распределения файла, и что программное обеспечение доступно, чтобы сделать так?
Большое спасибо заранее!
A consistent ring hash является классическим решением такого рода проблемы, по крайней мере, алгоритмически. Такие системы, как Swift, memcached, Dynamo, Riak, использовали этот подход для решения данной проблемы.
OpenStack Swift в частности, это хранилище объектов/блобов, использующее последовательный кольцевой хэш для отслеживания и распределения объектов, контейнеров и т.д. Вы можете использовать Swift или что-то вроде него непосредственно для решения вашей проблемы, или построить свое собственное решение с помощью последовательного хэш-кольца. Использование такого решения, как Swift, дает возможность не разрабатывать его самостоятельно, а также включает такие вещи, как защита данных путем репликации, версионирования и т.д.
Если вам не нужно запускать его самостоятельно, а вместо этого вы заинтересованы в услугах хостинга, такие продукты, как Rackspace Cloud Files (на основе Swift) или Amazon S3, обеспечивают хранение и извлечение объектов с помощью CDN (Akamai и CloudFront для Rackspace и Amazon соответственно). CDN значительно повысит эффективность поиска для географически распределенных клиентов
.