我想分享一个非常大的对象,例如在一组机器之间以兆字节甚至几千兆字节的顺序。 该对象将被写入一次,但可能会被多次读取。 也许一种天真的方法是使用像redis这样的ceneteralized存储。但是,它可能会成为单点故障,而太多请求可能会对redis造成DOS攻击。 然后,分布式解决方案更有前途。但是,主要关注的是将结构复制到所有机器上。如果通过主/从技术完成复制,则复制可能会导致主服务器上的流量负载很大,因为对象很大。 因此,更好的解决方案是使用P2P策略复制对象,以减少主服务器上的网络负载。
有没有人知道这个问题的解决方案?
也许有些候选人是:
- Redis
- Memcached
- Voldemort
- Hazelcast
我主要关注的是Java接口,共享大对象,高可用性以及复制的低网络流量。
事先谢谢。
答案 0 :(得分:14)
在NoSQL存储中缓存大型对象通常不是一个好主意,因为它在内存和网络带宽方面很昂贵。我不认为NoSQL解决方案在存储大型对象时会发挥作用。 Redis,memcached和大多数其他键/值存储显然不是为此而设计的。
如果要在NoSQL产品中存储大型对象,则需要将它们剪切成小块,并将这些块存储为独立对象。这是10gen为gridfs保留的方法(它是标准MongoDB发行版的一部分):
请参阅http://docs.mongodb.org/manual/applications/gridfs/
要存储大型对象,我宁愿查看分布式文件系统,例如:
这些系统具有可扩展性,高可用性,并提供文件和对象接口(您可能需要一个对象接口)。您还可以参考以下SO问题来选择分布式文件系统。
Best distributed filesystem for commodity linux storage farm
由您在这些可扩展存储解决方案之上实现缓存。