存储可以通过调用 url 呈现的二进制数据的理想位置
Posted
技术标签:
【中文标题】存储可以通过调用 url 呈现的二进制数据的理想位置【英文标题】:Ideal place to store Binary data that can be rendered by calling a url 【发布时间】:2012-01-11 13:57:08 【问题描述】:我正在寻找一个理想的(性能有效且可维护的)存储二进制数据的地方。就我而言,这些是图像。我必须进行一些图像处理、缩放图像并存储在可以通过 RESTful 服务访问的合适位置。
根据我目前的研究,我有几个选择,例如:
-
MongoDB、GridFS 等 NoSql 解决方案
在目录层次结构中的文件系统中存储为文件,然后使用 Web 服务器通过 url 访问图像
Apache Jackrabbit 文档存储库
存储在缓存中,例如 Memcache、Squid 代理
您有什么想法,您会选择哪一个,为什么会有用,或者有更好的方法吗?
【问题讨论】:
【参考方案1】:在另一个选项中将图像作为 blob 存储在 RDBMS 中,您会立即获得关于完整性、安全性等的一些保证(如果在数据库上正确设置)、存储额外的元数据、使用 SQL 管理集合等。
【讨论】:
应该注意的是,在放入系统的文件量非常高的应用程序中,这并不总是一种选择。 Blob 存储为完整文件而不是分块,因此行值可能会变得非常大,并使数据库备份呈指数级增长。在使用此选项之前,应始终考虑复制注意事项和输入量。【参考方案2】:刚刚开始使用 GridFS 来完成您所描述的工作。
根据我目前的经验,GridFS 的主要优势在于它不需要单独的文件存储系统。我们的整个持久性层已经放入 Mongo,因此下一步逻辑步骤是将我们的文件系统也存储在那里。扁平的命名空间非常棒,并允许您使用丰富的查询语言来根据您想要附加到文件的任何元数据来获取文件。在我们的应用中,我们使用了嵌入所有所有权信息的“appdata”对象,确保
使用 NoSQL 文件存储(尤其是 GridFS)要考虑的另一件事是,它将与您的其他数据一起分片和扩展。如果您将整个数据库键值存储在 mongo 服务器中,那么最终,如果您必须使用更多机器扩展服务器集群,您的文件系统将随之增长。
由于二进制数据本身被分割成块,它会让人感觉有点“黑匣子”,这让那些习惯于基于经典目录的文件系统的人感到害怕。这在 RockMongo 等管理程序的帮助下得到缓解。
总而言之,在 GridFS 中存储图像就像插入文档本身一样简单,所有主要语言的大多数驱动程序都会为您处理一切。在我们的环境中,我们在端点上传图像并使用 PIL 执行调整大小。然后从另一个端点的 mongo 获取图像,该端点仅输出数据并将其模拟为 jpeg。
祝你好运!
编辑:
为了给你一个使用 GridFS 上传简单文件的例子,这里是 Python 库 PyMongo 中最简单的方法。
from pymongo import Connection
import gridfs
binary_data = 'Hello, world!'
db = Connection().test_db
fs = gridfs.GridFS(db)
#the filename kwarg sets the filename in the mongo doc, but you can pass anything in
#and make custom key-values too.
file_id = fs.put(binary_data, filename='helloworld.txt',anykey="foo")
output = fs.get(file_id).read()
print output
>>>Hello, world!
您还可以根据需要查询您的自定义值,如果您希望查询基于与您的应用程序相关的自定义信息,这将非常有用。
try:
file = fs.get_last_version('anykey':'foo')
return file.read()
catch gridfs.errors.NoFile:
return None
这些只是一些简单的例子,许多其他语言(php、Ruby 等)的驱动程序都有同源。
【讨论】:
感谢分享,非常感谢。您是否认为从磁盘 I/O 读取成本更高,或者只是将所有数据放在一个位置是 mogo 的原因以及它目前的性能如何? 文件 IO 时间并没有真正影响我们的决定,尽管作为参考,获取时间与 sql 中的标准索引查询相当。由于文件量非常大,拥有一个可以水平分片的大命名空间的吸引力是主要原因。使用 GridFS 使得目录结构不再是问题,并且可以使用 API 驱动程序获取和插入文件。它在 RESTful 应用程序中运行良好,其中 url 请求确定响应。【参考方案3】:我会选择jackrabbit 和它的REST framework sling http://sling.apache.org
Sling 允许您通过 REST 调用或 webdav 上传/下载文件,而底层的 jackrabbit 存储库为您提供高性能存储,可以将文件存储在树形结构中(如果您愿意,也可以是平面结构)。
jackrabbit 和 sling 都支持事件机制,您可以在上传后异步处理图像,即创建缩略图。
http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html 的手册描述了如何使用 sling 提供的 REST 接口来操作数据。
【讨论】:
以上是关于存储可以通过调用 url 呈现的二进制数据的理想位置的主要内容,如果未能解决你的问题,请参考以下文章