现在,我已经阅读了这些可能与这个问题有关的问题:可扩展的图像存储,大规模图像存储,https://serverfault.com/q/95444。
在我问我的问题之前,我发现了以下几点:
1. Facebook 使用Haystack(开源世界的 CLOSED-SOURCE)
,非常高效。它是一种文件系统存储形式,专为速度
和大型元数据管理而设计。
2. 任何操作系统在目录中都有一个文件限制,
当超过这个限制时,可能会开始执行极差。3. 大多数 NoSQL 开发人员发现使用CouchDB / CouchBase Server
处理图像很容易,因为它将图像作为附件处理,粘贴到文档(数据库中的记录)。但是,这仍然是文件系统存储。4、HDFS、NFS、ZFS,都是可以轻松处理大型文件的文件系统
分布式数据。然而,在像 facebook 这样的应用程序中,他们无能为力5. 任何适当形式的缓存对于高度依赖图像的应用程序
都非常重要6. 一些 PHP 开发人员(大多数)在创建文件夹和子文件夹时使用 MySQL 来保存图像元数据(匹配元信息)在文件系统上。每个图像将具有与数据库中的元数据相关的随机散列名称,以实现在文件系统上的快速定位
在理解了这些陈述和更多其他陈述之后,我开始意识到在文件系统上保留数十亿不断增长的图像非常昂贵。如果有人使用云存储之类Amazon S3
的,它会因为高图像流量以及来自您的应用程序的存储而扼杀业务。
我已经评估了CouchBase Server的使用,将图像作为附件进行管理。然而,对于一个图像增长的应用程序,这也是一个文件系统存储,我想知道如果成百上千的人同时访问图像,Couch base 会如何表现。我可以使用Cloudant/Big Couch它具有自动分片/负载平衡。要点仍然是,NoSQL 解决方案还将图像保存在文件系统上,并且当以高并发率请求图像时,这可能会导致整个服务下降(图像可能很重)。
我的想法
我正在考虑将我的图像管理为SVG
格式。这是因为,我认为我可以将此 SVG 数据视为存储中的文本。现在,大多数 NoSQL 数据库对文档(记录)大小的大小限制至少不大于 4MB(不确定)。这带来了一个问题,因为 SVG 文件甚至可以达到 6-10MB,具体取决于图像。所以,我认为我不能将 Couch 基础服务器用于 SVG 存储。此外,应用程序的性质是,图像数据不断增长并且从不存档/从不删除:并且沙发库不适用于此类数据(高度持久且不变的数据)。
这让我回到了以良好的文本压缩而闻名的 RDBMS(尤其是 Oracle)。如果我获得 SVG 数据及其元数据并将其存储为BLOB
在 Oracle 数据库中,我觉得这可行。我听说 Oracle 表甚至可以增长到 TB,可能带有分区或某种碎片。但重点是,对于一个包含文本的 20GB 的 oracle 表,我认为这将是很多数据。
现在,我的问题来自上述所有发现:
1. 为什么开发人员一直选择文件系统存储图像而不是 SVG,在我(可能是幼稚的)想法中,SVG 可以作为文本处理,因此可以压缩,加密,消化,拆分,易于存储等?
2. 当应用程序将图像完全作为 SVG 工作,将 SVG 提供给浏览器而不是实际的图像文件时,会有什么复杂性?
3. 从技术上讲,这对 Web 服务器造成更大的内存干扰:提供从文件系统(.png、.jpg、.gif)读取的图像并将图像作为 SVG(可能来自数据库或来自中间层)提供服务,尤其是在重负载下, Facebook 的一个示例场景?
4. 在不同的“缩放”或分辨率下渲染时,SVG 似乎并没有降低质量,为什么仍然没有开发人员在图像动态应用程序中大量使用 SVG?我的意思是,在从 PNG、JPG 或 GIF 转换为 GIF 时是否有任何已知的质量损失SVG
?
5. 我对使用像 Oracle/MySQL Cluster 这样的 RDBMS 来存储高度持久的元数据以及持久的 SVG 数据的看法是不是很幼稚?
请突出显示,并就大型图像存储格式提出您的建议。谢谢
编辑/更新
有像Image Magick这样的工具提供了用于操作图像的命令行选项。我需要的最重要的想法可能是:CouchBase Server(是否single server
能够version 2.0
以“用户体验可接受的性能”或“社交网络规模”提供图像?)