我试图寻找创建大文件可扩展存储的最佳解决方案。 文件大小可从1-2兆和高达500-600千兆字节不等。
我已经找到关于Hadoop的一些信息和它的HDFS,但它看起来有点复杂,因为我不需要任何的Map / Reduce作业等多种功能。 现在,我想使用MongoDB的,它是作为GridFS的文件存储解决方案。
而现在的问题:
- 当我试图同时写几个文件与GridFS的会发生什么。 会不会有对读/写操作的任何锁? (我会用它只能作为文件存储)
- 从GridFS的文件在内存中缓存以及它如何影响读写性能比较?
- 也许有,可以更有效地解决我的问题的一些其他解决办法?
谢谢。
我只能回答MongoDB的在这里,我不会假装我很了解HDFS和其他类似技术。
该GridFS的实现完全是司机本身客户端。 这意味着没有特殊的加载或内本身的MongoDB服务文件的上下文的理解,有效的MongoDB本身甚至不知道它们是文件( http://docs.mongodb.org/manual/applications/gridfs/ )。
这意味着,查询的任何部分files
或chunks
集合将导致相同的过程,因为它会为任何其他查询,因此它加载它需要的数据到您的工作组( http://en.wikipedia.org/wiki / Working_set一个给定的时间范围内通过的MongoDB需要)它代表一组数据(或在该时刻的所有加载的数据),以保持最佳性能。 它通过寻呼入RAM(以及技术上的OS一样)来实现的。
考虑到另外一点是,这是驱动程序实现的。 这意味着,规格可以改变,但是,我不认为它。 所有司机将允许您查询一组从文档files
收集只容纳元数据让您端菜文件本身从文件chunks
集合与单个查询。
不过这不是最重要的事情,你要提供服务的文件本身,包括它的数据; 这意味着你将被加载files
的收集和随后chunks
收集到您的工作组。
考虑到这一点,我们已经碰到的第一个障碍:
从GridFS的文件在内存中缓存以及它如何影响读写性能比较?
小文件读取性能可真棒,直接从RAM; 写操作会一样好。
对于大文件,并非如此。 大多数计算机不会有600 GB的RAM,这是有可能的,其实也很正常,容纳单个文件的600 GB的分区上的单个mongod
实例。 这将创建因为该文件有问题,为了提供服务,需要适应您的工作集但它是不可能比你更大的RAM; 在这一点上,你可以有页抖动( http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29 ),其中服务器是断裂24/7试图加载该文件刚刚页面。 这里的写是没有更好的为好。
解决这个问题的唯一方法是开始把一个文件跨多个碎片:\
。
注:一个更多的考虑的是一个默认的平均大小chunks
“块”为256KB,所以这是一个很大的一个600GB的文件的文件。 此设置在大多数司机可操作。
当我试图同时写几个文件与GridFS的会发生什么。 会不会有对读/写操作的任何锁? (我会用它只能作为文件存储)
GridFS的,暂时只有一个规范使用相同的锁上没有任何区别,读取和写在数据库级(2.2+)锁或在全球范围内(预2.2)。 这两个不互相干扰为好,即你怎么能保证被写入到文件的读一致性?
这争的可能性是存在的根据是说您的方案细节,交通,并发写入/读取和许多其他的事情,我们没有关于想法的数量。
也许有,可以更有效地解决我的问题的一些其他解决办法?
我个人发现,S3(如@mluggy说)以简化冗余格式最存储元数据的一部分仅仅约内MongoDB的文件,就像使用GridFS的,但没有大块的收集,让S3处理所有分配,备份其他的东西给你。
希望我已经明确,希望它帮助。
编辑:不像我无意中说,MongoDB中没有一个集合级别的锁,它是一个数据库级锁。
你有没有考虑元数据保存到MongoDB的,写的实际文件到Amazon S3? 两者都有出色的车手,而后者是高度冗余的,云/ CDN就绪文件存储。 我想给它一个镜头。
我会回答前两个开始:
- 还有就是GridFS的写入时,是写锁定。 无锁的读取。
- 这些文件不会缓存在内存中,当你询问他们,但他们的元数据。
GridFS的可能不是你的问题的最佳解决方案。 写锁可以成为一种痛苦的事情,当你处理这种类型的情况,特别是对大文件。 还有其他的数据库,在那里,可以解决这个问题你。 HDFS是一个不错的选择,但正如你所说,这是非常复杂的。 我会建议考虑像了Riak或Amazon的S3存储机制。 他们更注重周围的人所储存的文件,并且不与主要缺点结束。 S3和了Riak都具有卓越的管理设施,并能处理大文件。 虽然用了Riak,我终于知道了,你不得不做一些文件分块存储超过100MB的文件。 尽管如此,它通常是做了分块巨大的文件的大小一定程度上的最佳做法。 有很多不好的东西在传送文件时,DBS-从网络超时,可以发生,缓冲区溢出等。无论哪种方式,您的解决方案将需要大批文档大小相当数量的调谐。