草庐IT

image - 存储数百万张图像

coder 2023-05-04 原文

我需要为数亿张图像准备存储空间(现在我有 7000 万张,而且这个数字还在增长)。每个图像有大约。 20KB。当然,我可以将它们存储在文件系统中,但我害怕 inode 的数量。我已经测试过 MongoDB 和 Cassandra。两者都有缺点(我的硬盘资源有限):

  • MongoDB - 磁盘空间消耗是原始数据大小的 3 倍
  • Cassandra - 磁盘空间消耗与原始数据的大小相似,但 Cassandra 需要大量可用空间来进行压缩过程

任何人都可以为此类问题提出适当的解决方案吗?

最佳答案

在我的生活中,我使用 S3(包括 Rackspace 云文件)和 MongoDB 完成了视频分发。

大多数人会毫不犹豫地选择 S3,但我发现两者都有其缺点。最大的问题之一是 S3 不是 CDN,它实际上是特定区域内的冗余存储,不会复制到其他 S3 区域,这意味着您需要在 S3 之上使用 cloudfront 之类的东西来 ping 您的图像如果您要在您的网站上获得严重的负载,请使用某种缓存。

S3 还具有其他功能,使其不像 CDN 那样多,而更像是一个存储仓库。话虽如此,对于不常访问的文件,S3 的速度非常快。

这种双层当然会产生复杂性,例如维护。不仅如此,CDN 还可以在 TTL 上工作,尽管现在许多 CDN 都具有边缘清除功能,但它们仍然不是 100% 确保您的文件不可访问的方法。

因此,由于设置和访问(也应该删除的文件的可能访问),这可能很快就会变得非常昂贵。

这是 MongoDB 可以获胜的地方。根据您的情况,MongoDB 在这里实际上可能更便宜,因为您可以在 AWS 上使用一大堆微型实例来实际保存您的信息,为这些实例添加现场实例预留(非常便宜)以及您所需要的一切是单机上的大磁盘。

天啊,您甚至可以使用 S3 来存储图像,然后使用 MongoDB 作为云端替代品。

当您想将图像 ping 到不同的区域时,您只需在该目标区域中创建几个 Spot 实例,然后让 MongoDB 复制它的数据。你也可以对复制做一些很酷的事情,以确保只将来自该区域的频繁访问的文件放置在该区域中。

所以我不会抛弃 MongoDB(甚至是 Cassandra),而是会在两者之间进行经济状况调查。

编辑

作为关于 S3 定价的补充说明,如果您将文件存储在 RR(减少冗余)中,那么价格会减半(大约),这使得 S3 非常便宜,但是,您仍然存在 S3 不是 CDN 的问题。

进一步编辑

因为我真的只是从@cirrus 的回答中继续,我实际上会重新评估你上面已经回答的问题。

例如,Youtube 实际上将他们所有的图像存储在单个计算机上,然后分发,因此他们可以轻松地管理 200m 的缩略图和......嗯......每天从文件系统轻松获得很多 View 。所以我认为你对文件系统的担心被高估了。

至于哪个数据库更好...我不知道,这取决于您的测试。

我的意思是,您的问题的答案取决于您的方案、预算、硬件和资源,即如果您有 AWS 服务器,这将是与专用内部服务器完全不同的答案。

关于image - 存储数百万张图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457784/

有关image - 存储数百万张图像的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  4. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  8. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  9. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  10. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

随机推荐