2009-12-25 3 views
50

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

Однако я не уверен, как реализовать такой масштабируемый компонент хранения изображений в моем приложении. Я уже думал о разных решениях, но из-за отсутствия опыта, я с нетерпением жду ваших предложений. Помимо изображений, метаданные также должны быть сведены. Вот мои первые мысли:

  1. Используйте (распределенный) файловую систему как HDFS и подготовить специальные вебсервер как «файловой системы клиентов», чтобы сохранить загруженные изображения и запросы на обслуживание. Метаданные изображения сохраняются в дополнительной базе данных, включая информацию о пути к файлу для каждого изображения.

  2. Используйте ориентированную на BigTable систему, такую ​​как HBase, поверх HDFS и сохраняйте изображения и метаданные вместе. Опять же, веб-серверы моста загружают изображения и запросы.

  3. Используйте полностью доступную схему, такую ​​как CouchDB для хранения как изображений, так и метаданных. Кроме того, используйте базу данных для загрузки и доставки через HTTP-интерфейс RESTful API. (Дополнительный вопрос: CouchDB действительно сохраняет blobs через Base64. Может ли он, однако, возвращать данные в виде изображения/jpeg и т. Д.)?

ответ

39

Мы использовали CouchDB для этого, сохраняя изображения как «Приложение». Но через год многодюжинные файлы базы данных CouchDB GB оказались головной болью. Например, репликация CouchDB все еще имеет проблемы, если вы используете ее с очень большими размерами документа.

Итак, мы просто переписали наше программное обеспечение, чтобы использовать CouchDB для получения информации об изображении и Amazon S3 для хранения фактического изображения. Код можно получить по адресу: http://github.com/hudora/huImages

Возможно, вам захочется создать на вашем сайте службу хранения данных, совместимую с Amazon S3. Это держит вас гибким и оставляет опцию amazon, не требуя при этом внешних сервисов. Walruss кажется самым популярным и масштабируемым клон S3.

Я также призываю вас заглянуть в дизайн Livejournal с отличным Open Source MogileFS и Perlbal предложениями. This combination, вероятно, самая известная настройка сервисов изображения.

Также flickr Architecture может быть источником вдохновения, хотя они не предлагают программное обеспечение с открытым исходным кодом для общественности, как это делает Livejournal.

+0

Не могли бы вы подробнее рассказать о том, как вы внедрили хранилище изображений. Особенно интересно, как вы делали авторизацию. –

+0

Авторизация была только недопустимыми URL-адресами. – max

+0

Я имею в виду, с одной стороны, вы должны добавить изображения в хранилище изображений, и эта функция должна быть доступна для определенного пользователя, который должен быть аутентифицирован. С другой стороны, чтение должно быть доступно для всех, чтобы изображения могли отображаться пользователю. –

3

Вы считаете, что Amazon Web Services? S3 - это веб-хранилище файлов, а SimpleDB - хранилище атрибутов key->. Оба они обладают высокой степенью масштабируемости. Это дороже, чем поддержка ваших собственных серверов и настроек (при условии, что вы собираетесь делать это самостоятельно, а не нанимать людей), но вы встаете и бежите гораздо быстрее.

Редактировать: Я беру это назад - его более дорогое в долгосрочной перспективе на больших объемах, но для малого объема он превосходит первоначальную стоимость покупки оборудования.

S3: http://aws.amazon.com/s3/ (вы можете хранить свои файлы изображения здесь, и для выполнения, может быть, есть тайник изображения на сервере, или, может быть, нет)

SimpleDB: http://aws.amazon.com/simpledb/ (метаданные могли бы пойти здесь: отображение ID изображения в любой данные, которые вы хотите сохранить)

Редактировать 2: Я даже не знал об этом, но есть новая веб-служба Amazon CloudFront (http://aws.amazon.com/cloudfront/). Он предназначен для быстрой доставки веб-контента, и он хорошо интегрируется с S3. Вид как Akamai для ваших изображений. Вы можете использовать это вместо кэша изображений.

+0

Спасибо за эту идею, я уже это рассмотрел. Однако это образовательный проект, и мы не можем использовать внешние услуги, особенно мы не можем тратить на них деньги. К сожалению, ни S3, ни SimpleDB не являются для нас опцией. –

+0

Ох. Может быть, в этом вопросе. – danben

+0

Поскольку вы не можете тратить деньги, каковы ваши аппаратные ограничения? – danben

1

Хорошо, если все, что AWS не будет работать, вот несколько мыслей.

Что касается (3), если вы помещаете двоичные данные в базу данных, то те же данные будут выдаваться. Что делает его jpeg - это формат данных, а не то, что думает база данных. Что делает клиент (веб-браузер), считает его jpeg, когда вы устанавливаете заголовок Content-type на image/jpeg. Вы также можете установить его на что-то другое (не рекомендуется), например текст, и именно так браузер попытается его интерпретировать.

Для хранения на дисках мне нравится CouchDB для его простоты, но HDFS, безусловно, будет работать.Вот ссылка на сообщение об обслуживании содержимого изображения из CouchDB: http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html

Редактировать: вот ссылка на полезную дискуссию о кешировании изображений в memcached и обслуживании их с диска под Linux/apache.

+3

вы сказали «вот ссылка на полезное обсуждение ...» отсутствует ссылка? –

1

Я экспериментировал с некоторыми функциями _update, доступными серверам просмотра CouchDB на моем сервере представления Python.

Одна из самых классных вещей, которые я делал, - это функция обновления для загрузки изображений, чтобы я мог использовать PIL для создания эскизов и других связанных изображений и прикрепления их к документу, когда они попадают в CouchDB.

Это может быть полезно, если вам нужна обработка изображений, и вы хотите сократить количество кода и инфраструктуры, которые вам нужны, чтобы не отставать.

1

я написал магазин изображение поверх Кассандры. У нас много, и записи и случайные чтения читают/пишут. Для высокого отношения чтения/записи я предлагаю вам mongodb (GridFs).

+0

Это очень интересно! Я пишу то же самое сейчас. Но я не могу представить, как этот метод хранения будет хорош или нет. Вы все еще используете этот метод? Сколько контента вы храните? – dizpers

+3

4 PB сейчас, я сейчас переезжаю в хауп. – iddqd

+0

@iddqd приятно иметь продолжение! Вау. – CppLearner

3

Мы используем MogileFS. Мы небольшие пользователи с объемом менее 8 ТБ и около 50 миллионов файлов. Несколько лет назад мы переключились с хранения в Amazon S3, чтобы лучше контролировать имена файлов и производительность.

Это не самое прекрасное программное обеспечение, но оно очень «полевое», и в основном все пользователи используют его так же, как и вы.

+2

Насколько я понимаю, MogileFS лучше подходит для этой задачи, а затем распределяет базы данных (хранение файлов там не очень естественно) и лучше подходит, например, HDFS (что хорошо для больших файлов, срезы могут храниться на разных узлах, что выгодно для локализации данных MapReduce). Изображения представляют собой небольшие файлы, которые не нуждаются в разрезе, и MogileFS выглядит так эффективно, потому что он был написан для этой цели (для LiveJournal.com). –

2

Как часть Cloudant, я не хочу толкать продукт .... но BigCouch решает эту проблему в стеке научных приложений (физика - не имеет никакого отношения к Cloudant и, конечно, не имеет ничего общего с прибылью!) , Он женится на простоте дизайна CocuhDB с автоматическим масштабированием и масштабируемостью, отсутствующим в односерверном CouchDB. Обычно я использую его для хранения меньшего количества большого файла (multi-GB) и большого количества небольших файлов (100 МБ или меньше). Я использовал S3, но затраты на получение на самом деле начинают складываться для небольших файлов, которые многократно доступны.

+0

Вы считали, что используете кеш http поверх couchdb для кэширования изображений, таких как Akamai или Varnish? – onejigtwojig

+1

'Я использовал S3, но затраты на получение фактически начинают складываться для небольших файлов, к которым неоднократно обращаются.' По умолчанию Amazon S3 не устанавливает заголовки истечения срока действия кэша для изображений, и это само может быть в какой-то степени в счете , Вы должны подумать о том, чтобы настроить его самостоятельно. –

11

"Дополнительный вопрос: CouchDB действительно сохраняет blobs через Base64."

CouchDB делает не сохранить сгустки как Base64, они хранятся в виде прямым двоичного файла. При получении документа в формате JSON с ?attachments=true мы преобразовать двоичный файл на диске в Base64 для того, чтобы добавить его безопасно JSON, но это просто уровень презентации вещь.

См Standalone Attachments.

CouchDB служит вложения с типом содержимого они хранятся с, возможно, на самом деле часто, к серверу HTML, CSS и вложения GIF/PNG/JPEG непосредственно браузеры.

Вложения могут транслироваться, а в CouchDB 1.1 поддерживают заголовок Range (для потоковой передачи мультимедиа и/или возобновления прерванной загрузки).

+1

На момент написания вопроса они были действительно сохранены как Base64. –

+5

CouchDB никогда не хранил вложения как Base64. Что может вас ввести в заблуждение, так это возможность попросить CouchDB вернуть вложения в JSON вашего документа. Для этого необходимо обернуть их в Base64. На диске это всегда были настоящие байты. –

+0

Да, мой комментарий был вводящим в заблуждение. Я не имел в виду основной механизм хранения, но доступ к приложениям можно было получить через API. –

8

Использование Seaweed-FS (используется под названием Weed-FS), реализация бумаги сена в Facebook.

Seaweed-FS очень гибкий и ухоженный вплоть до основ. Он был создан, чтобы хранить миллиарды изображений и быстро их обслуживать.

+1

Здравствуйте. У нас есть 1 сервер с эскизами '~ 3m'. В пиковое время он обрабатывает запросы «12k» в секунду. Все в порядке, так что это хорошая идея попробовать weed-fs –

-1

Вот пример, чтобы сохранить изображение 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); 

... 

такой же, как вы можете хранить одиночное изображение.

Смежные вопросы