我正在寻找存储大量二进制数据(图像,视频,文档等)的最佳(或至少足够好)方式。解决方案必须是可扩展的,并且在X数据量之后不会卡住。
我希望有一个地方例如MySQL数据库,其中保存所有数据。当其中一个Web前端需要它(根据请求)它可以从数据库中获取它并永久缓存它以供以后使用。
从此我可以在http://dev.mysql.com/doc/refman/5.0/en/table-size-limit.html上看到MySQL表不能存储超过4TB的每个表。是否有更合适的东西,比如nosql数据库,或者最好将所有内容存储在一台服务器上的文件中并将其传播到所有Web前端?
答案 0 :(得分:4)
您通常不希望在关系数据库中存储大型文件 - 这不是它们的设计目标。我还建议不要使用NoSQL解决方案,因为它们通常也不是为此而设计的,尽管有一些例外(见下文)。
您的最后一个想法是,将文件存储在文件系统上(请注意,这是文件系统 设计用于的;)很可能是正确的方法。根据您的可扩展性要求,这可能有点困难,但您可能希望采用以下方法之一:
SAN。 SAN在网络中提供冗余,高可用性的存储解决方案。可以将多个服务器连接到SAN提供的存储,并在彼此之间共享文件。请注意,此解决方案通常面向企业,并且可靠地实施起来相当昂贵(您至少需要物理硬件以及RAID控制器和大量磁盘)。
CDN。内容分发网络是一个远程的全球分布式系统,用于通过Internet向最终用户提供文件。您通常将文件放在服务器上的某个位置,然后将其复制到CDN以进行实际分发。 CDN的工作方式是,如果它没有用户请求的文件,它将自动尝试从您的服务器获取它;一旦它有一个文件的副本,它会将文件缓存一段时间。如果您通常受到带宽成本或同时提供大量文件的处理开销的限制,那将非常有用。
云产品(Amazon S3,Rackspace云文件)。这些类似于CDN,但与您现有的云基础架构配合良好,如果您正在使用它。您向云API发出请求以存储您的文件,然后它可以通过Internet获得,就像使用CDN一样。主要区别在于您必须手动发出任何存储请求(创建,删除或更新)。
如果您提供的文件数量很少,您也可以使用内部解决方案。将文件存储在两个或三个服务器上(可能有一组更大的服务器,如果空间成为问题,则使用哈希计算进行分片)。为前端服务器构建一个小API,以便从存储服务器请求文件,如果一个服务器不可用,则返回备用服务器。
我几乎忘记的一个解决方案(虽然我从未用过研究目的)是Riak的Luwak项目。 Luwak是Riak的扩展,它是一个高效的分布式键/值存储,通过将大文件分成一致大小的段,然后将这些段存储在树结构中以便快速访问,从而提供大型文件支持。可能需要考虑一下,因为它为您提供了我在上一段中免费提到的冗余,分片和API。
答案 1 :(得分:2)
我在一个相当大的网站上担任(志愿者)开发人员 - 我们在14000张图片中有2GB图像[显然远不及“世界纪录”],以及150MB数据库的数据库。图像文件存储为单独的文件而不是数据库对象,部分原因是我们为不同的用法调整图像大小 - 缩略图,中图像和大图像是从存储的图像(可能大于我们用于“大”的尺寸)创建的。现场)。
虽然可以在SQL数据库中存储“blob”(二进制大对象),但我认为这不是最佳解决方案。在数据库中存储引用,以便您可以为实际存储的文件创建路径/文件名组合[并且可能隐藏某些脚本背后的实际图像 - php,jsp,ruby或您喜欢的任何内容]将是更好的解决方案。