Масштабируемое Хранилище Изображений
в настоящее время я разрабатываю архитектуру для веб-приложения, которое также должно обеспечивать какое-то хранилище изображений. Пользователи смогут загружать фотографии в качестве одной из ключевых функций сервиса. Также просмотр этих изображений будет одним из основных способов использования (через интернет).
однако я не уверен, как реализовать такой масштабируемый компонент хранения изображений в моем приложении. Я уже думал о различных решениях, но из-за отсутствия опыта, я с нетерпением жду услышать свои предложения. Помимо изображений, также должны быть сохранены метаданные.
Вот мои первоначальные мысли:
используйте (распределенную) файловую систему, такую как HDFS, и подготовьте выделенные веб-серверы в качестве "клиентов файловой системы" для сохранения загруженных изображений и запросов на обслуживание. Метаданные изображения сохраняются в дополнительной базе данных, включая информацию о пути к файлу для каждого изображения.
используйте BigTable-ориентированную систему как HBase поверх HDFS и сохраните изображения и метаданные вместе. Опять же, веб-серверы связывают загрузку изображений и запросы.
использовать базу данных абсолютно схемы как в CouchDB для хранения изображений и метаданных. Кроме того, используйте саму базу данных для загрузки и доставки с помощью API RESTful на основе HTTP. (Дополнительный вопрос: CouchDB, могут ли сохранить BLOB-объектов с помощью алгоритма base64. Может ли он, однако, возвращать данные в виде изображения / jpeg и т. д.)?
11 ответов:
мы использовали CouchDB для этого, сохраняя изображения в качестве "вложения". Но через год несколько десятков ГБ файлов базы данных CouchDB оказались головной болью. Например, репликация CouchDB все еще имеет проблемы, если вы используете ее с очень большими размерами документов.
поэтому мы просто переписали наше программное обеспечение, чтобы использовать CouchDB для информации об изображениях и Amazon S3 для фактического хранения изображений. Код доступен по адресу http://github.com/hudora/huImages
вы можете требуется настроить сервис хранения данных, совместимый с Amazon S3, на месте для вашего проекта. Это позволяет вам быть гибким и оставляет возможность amazon, не требуя внешних услуг на данный момент. Walruss кажется, стал самым популярным и масштабируемым клоном S3.
Я также призываю вас изучить дизайн Livejournal с их отличным открытым исходным кодом MogileFS и Perlbal предложения. эта комбинация Это, пожалуй, самый известный образ сервировочная установка.
и архитектура flickr может быть вдохновение, хотя они не предлагают программное обеспечение с открытым исходным кодом для общественности, как это делает Livejournal.
" дополнительный вопрос: CouchDB сохраняет большие двоичные объекты через Base64."
CouchDB делает не сохранить blobs как Base64, они хранятся как прямой двоичный файл. При получении документа JSON с помощью
?attachments=trueмы преобразуем двоичный файл на диске в Base64, чтобы безопасно добавить его в JSON, но это просто вещь уровня презентации.посмотреть Автономные Вложения.
CouchDB обслуживает вложения с типом контента, с которым они хранятся, это возможно, на самом деле общие, для сервера HTML, CSS и GIF/PNG/JPEG вложения непосредственно в браузеры.
вложения могут передаваться потоком и, в CouchDB 1.1, даже поддерживать заголовок диапазона (для потоковой передачи мультимедиа и/или возобновления прерванной загрузки).
использовать Seaweed-FS (раньше назывался Weed-FS), реализация бумаги сена Facebook.
Seaweed-FS очень гибко и урезано до основ. Он был создан для хранения миллиардов изображений и быстрого их обслуживания.
вы рассматривали Amazon Web Services? S3-это веб-хранилище файлов, а SimpleDB-хранилище ключей - >атрибутов. Оба являются производительными и масштабируемыми. Это дороже, чем поддерживать свои собственные серверы и настройки (предполагая, что вы собираетесь сделать это самостоятельно, а не нанимать людей), но вы встаете и работаете гораздо быстрее.
Edit: я беру это обратно - его дороже в долгосрочной перспективе при больших объемах, но для малого объема он бьет начальную стоимость покупки аппаратура.
S3:http://aws.amazon.com/s3/ (Вы можете хранить свои файлы изображений здесь, и для производительности, возможно, есть кэш изображений на вашем сервере, а может и нет)
SimpleDB:http://aws.amazon.com/simpledb/ (метаданные могут идти сюда: отображение идентификатора изображения на любые данные, которые вы хотите сохранить)
Edit 2: я даже не знал об этом, но есть новый веб-сервис под названием Amazon CloudFront (http://aws.amazon.com/cloudfront/). он предназначен для быстрой доставки веб-контента, и он хорошо интегрируется с S3. Вроде как Akamai для ваших изображений. Вы можете использовать это вместо кэша изображений.
мы используем MogileFS. Мы мелкомасштабные пользователи с менее чем 8 ТБ и около 50 миллионов файлов. Мы перешли от хранения в Amazon S3 несколько лет назад, чтобы лучше контролировать имена файлов и производительность.
Это не самое красивое программное обеспечение, но оно очень "проверено на местах", и в основном все пользователи используют его так же, как и вы.
может быть, взгляните на описание Facebook hayStack
иголка в стоге сена: эффективное хранение миллиарды фотографий
как часть Cloudant, я не хочу толкать продукт.... но BigCouch решает эту проблему в моем стеке научных приложений (физика-ничего общего с Cloudant и, конечно же, ничего общего с прибылью!). Он сочетается с простотой дизайна CocuhDB с автоматическим сегментированием и масштабируемостью, которые отсутствуют в односерверном CouchDB. Я обычно использую его для хранения меньшего количества больших файлов (несколько ГБ) и большого количества небольших файлов (100 Мб или меньше). Я использовал S3, но получить расходы на самом деле начать складывать для небольших файлов, которые повторно доступны.
ок, если все, что AWS вещи не будет работать, вот несколько мыслей.
что касается (3), Если вы помещаете двоичные данные в базу данных, те же данные будут выходить. Что делает его jpeg-это формат данных, а не то, что думает база данных. Что заставляет клиента (веб-браузер) думать, что его jpeg-это когда вы устанавливаете до
image/jpeg. Вы также можете установить его на что-то другое (не рекомендуется) как текст, а вот как браузер будет пытаться интерпретировать его.для хранения на диске мне нравится CouchDB за его простоту, но HDFS, безусловно, будет работать. Вот ссылка на сообщение о предоставлении содержимого изображения из CouchDB:http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html
Edit: вот ссылка на полезную дискуссию о кэшировании изображений в memcached vs, обслуживающих их с диска под linux / apache.
я экспериментировал с некоторыми функциями _update, доступными для серверов просмотра CouchDB на моем сервере просмотра Python.
одна действительно классная вещь, которую я сделал, - это функция обновления для загрузки изображений, чтобы я мог использовать PIL для создания эскизов и других связанных изображений и прикреплять их к документу, когда они нажимаются на CouchDB.
Это может быть полезно, если вам нужны манипуляции с изображениями и вы хотите сократить количество кода и инфраструктуры, которые вам нужны поддерживать.
Я написал магазин изображений на вершине Кассандры . У нас много и пишет, и случайные чтения чтения/записи низки. Для высокого коэффициента чтения / записи я предлагаю вам mongodb (GridFs).
вот пример для хранения blob-изображения в CouchDB с помощью PHP Laravel. В этом примере я сохраняю три изображения на основе требований пользователя.
установка соединения в CouchDB.
$connection = DB::connection('your database name'); /*region Fetching the Uers Uploaded Images*/ $FirstImage = base64_encode(file_get_contents(Input::file('FirstImageInput'))); $SecondImage =base64_encode(file_get_contents(Input::file('SecondImageInput'))); $ThirdImage = base64_encode(file_get_contents(Input::file('ThirdImageInput'))); list($id, $rev) = $connection->putDocument(array( 'name' => $name, 'location' => $location, 'phone' => $phone, 'website' => $website, "_attachments" =>[ 'FirstImage.png' => [ 'content_type' => "image/png", 'data' => $FirstImage ], 'SecondImage.png' => [ 'content_type' => "image/png", 'data' => $SecondImage ], 'ThirdImage.png' => [ 'content_type' => "image/png", 'data' => $ThirdImage ] ], ), $id, $rev); ...так же, как вы можете хранить одно изображение.
Comments