我目前正在为基于Web的应用程序设计一个架构,该应用程序还应提供某种图像存储。用户将能够将照片作为服务的关键功能之一。同样,查看这些图像将是主要用法之一(通过Web)。

但是,我不确定如何在应用程序中实现此类可扩展的图像存储组件。我已经考虑过不同的解决方案,但是由于缺少经验,我期待听到您的建议。除了图像外,还必须包含元数据。这是我最初的想法:

  1. 使用(分布式)文件系统之类的HDFS,并准备专用的Web服务器作为“文件系统客户端”,以保存上传的图像和服务请求。图像元数据保存在附加数据库中,包括每个图像的filepath信息。

  2. 在HDF上使用HBASE等面向型的系统,并一起保存图像和元数据。再次,Web服务器桥接图像上传和请求。

  3. 使用CouchDB(例如CouchDB)的完整示意性数据库来存储图像和元数据。此外,使用基于HTTP的Restful API使用数据库本身进行上传和熟悉度。 (其他问题:CouchDB确实可以通过base64节省斑点。但是,它可以以图像/jpeg等的形式返回数据)吗?)?

有帮助吗?

解决方案

我们一直在使用couchdb为此,将图像作为“附件”保存。但是一年后,多授予的GB CouchDB数据库文件被证明是头痛。例如,如果您使用的文档尺寸很大,则CouchDB复制仍然存在问题。

因此,我们只需重写我们的软件以将CouchDB用于图像信息,而Amazon S3进行实际图像存储。该代码可在 http://github.com/hudora/huimages

您可能需要在现场为您的项目设置Amazon S3兼容存储服务。这可以使您保持灵活性,并留下亚马逊选项,而无需目前需要外部服务。 沃尔鲁斯 似乎成为最受欢迎,最可扩展的S3克隆。

我还敦促您通过其出色的开源来研究LiveJournal的设计 mogilefsperlbal 产品。 这个组合 可能是最著名的图像服务设置。

也是 Flickr架构 尽管他们没有像LiveJournal一样向公众提供开源软件,但可以是一个灵感。

其他提示

“其他问题:CouchDB确实通过Base64节省了斑点。”

couchdb做 不是 将斑点保存为base64,将它们存储为直二进制。在检索JSON文档时 ?attachments=true 我们确实将盘二进制转换为base64,以便将其安全地添加到JSON中,但这只是演示级别的内容。

独立的附件.

CouchDB将其存储的内容类型提供附件,实际上很可能是服务器HTML,CSS和GIF/PNG/JPEG附件直接到浏览器上。

附件可以流式传输,在Couchdb 1.1中,甚至支持范围标头(用于媒体流和/或恢复中断下载)。

利用 海藻-FS (以前称为Weed-Fs),这是Facebook Haystack Paper的实施。

Seaweed-Fs非常灵活,并划定了基础知识。它的创建是为了存储数十亿张图像并快速提供服务。

您是否考虑过亚马逊网络服务? S3是基于Web的文件存储,SimpleDB是键 - >属性存储。两者都是性能且高度可扩展的。它比维护自己的服务器和设置要贵(假设您会自己做而不是雇用人员),但是您可以更快地开始运行。

编辑:我收回了这一点 - 从长远来看,它更昂贵,但对于低卷而言,它比购买硬件的初始成本超过了。

S3: http://aws.amazon.com/s3/ (您可以在这里存储图像文件,并且可以在服务器上使用图像缓存,或者可能没有)

SimpledB: http://aws.amazon.com/simpledb/ (元数据可以去这里:图像ID映射到您要存储的任何数据)

编辑2:我什至不知道这一点,但是有一个新的Web服务,称为Amazon CloudFront(http://aws.amazon.com/cloudfront/)。它是用于快速的Web内容交付,并且与S3很好地集成在一起。有点像Akamai的图像。您可以使用此而不是图像缓存。

我们使用mogilefs。我们是小规模用户,少于8TB和约5000万个文件。几年前,我们从Amazon S3中的存储转换,以更好地控制文件名和性能。

它不是最漂亮的软件,但它非常“测试”,基本上所有用户都以相同的方式使用它。

也许看看Facebook Haystack的描述

干草堆中的针头:有效存放数十亿张照片

作为Cloudant的一部分,我不想推产品。...但是BigCouch在我的科学应用程序堆栈中解决了这个问题(物理 - 与Cloudant无关,与利润无关!)。它将CocuHDB设计的简单性与单服务器CouchDB中缺少的自动脱毛和可扩展性结合在一起。我通常使用它来存储少量的大文件(多GB)和大量的小文件(100MB或更少)。我当时正在使用S3,但是GET成本实际上开始增加了反复访问的小文件。

好的,如果所有AWS的东西都无法正常工作,这里有几个想法。

至于(3),如果将二进制数据放入数据库中,则将出现相同的数据。使它成为JPEG的原因是数据的格式,而不是数据库所认为的。是什么使客户端(Web浏览器)认为它是jpeg时是您设置的 Content-type 标题到 image/jpeg. 。您还可以将其设置为其他内容(不推荐),例如文本,这就是浏览器尝试解释它的方式。

对于磁盘存储,我喜欢CouchDB的简单性,但是HDFS肯定会起作用。这是有关CouchDB提供图像内容的帖子的链接: http://japhr.blogspot.com/2009/04/render-couchdb-images-images-via-sinatra.html

编辑:这是有关在linux/apache下从磁盘上使用的磁场与在磁盘中使用的有用讨论的链接。

我一直在尝试使用Python View Server中的CouchDB视图服务器可用的一些_update功能。

我所做的一件非常酷的事情是图像上传的更新功能,以便我可以使用PIL来创建缩略图和其他相关图像,并在将它们推到CouchDB时将其附加到文档上。

如果您需要图像操作并想减少需要跟上的代码和基础架构的数量,这可能会很有用。

我已经在卡桑德拉(Cassandra)的顶部写了图像店。我们有很多写作,并且随机读取读/写很低。对于高读/写比例,我建议您(GRIDFS)。

这是使用PHP Laravel将BLOB图像存储在CouchDB中的示例。在此示例中,我根据用户要求存储三个图像。

在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);

...

与您可以存储单个图像相同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top