【问题标题】:Distributed caching for large objects大型对象的分布式缓存
【发布时间】:2013-01-12 01:25:25
【问题描述】:

我想分享一个非常大的对象,例如在一组机器之间以兆字节甚至几千兆字节为单位。 该对象将被写入一次,但可能会被多次读取。 也许一种天真的方法是使用像redis 这样的集中式存储。但是,它可能会成为单点故障,过多的请求可能会对 redis 造成 DOS 攻击。 然后,分布式解决方案更有希望。但是,主要问题是将结构复制到所有机器上。如果复制是通过主/从技术完成的,那么复制可能会导致主服务器上的流量负载很大,因为对象很大。 因此,更好的解决方案是使用 P2P 策略来复制对象,以减少主服务器上的网络负载。

有没有人知道这个问题的解决方案? 也许有些候选人是:
- Redis
- Memcached
- Voldemort
- Hazelcast

我主要关心的是 Java 接口、共享大对象、高可用性以及用于复制的低网络流量。

先谢谢了。

【问题讨论】:

    标签: memcached redis distributed-caching hazelcast voldemort


    【解决方案1】:

    在 NoSQL 存储中缓存大对象通常不是一个好主意,因为它在内存和网络带宽方面很昂贵。我不认为 N​​oSQL 解决方案在存储大型对象方面表现出色。 Redis、memcached 和大多数其他键/值存储显然不是为此而设计的。

    如果你想在 NoSQL 产品中存储大对象,你需要将它们切成小块,并将这些块作为独立的对象存储。这是 10gen 为 gridfs 保留的方法(它是标准 MongoDB 发行版的一部分):

    http://docs.mongodb.org/manual/applications/gridfs/

    要存储大对象,我宁愿看分布式文件系统,例如:

    这些系统可扩展、高度可用,并提供文件和对象接口(您可能需要对象接口)。也可以参考下面的SO question来选择分布式文件系统。

    Best distributed filesystem for commodity linux storage farm

    由您在这些可扩展的存储解决方案之上实施缓存。

    【讨论】:

    • +1 以获得非常好的答案。你能告诉我一个“大物体”到底有多大吗?如果我的对象大小约为 200k,是否也会被认为太大而无法存储在 NoSQL(基于文档)数据库中?
    • 如果您确保套接字缓冲区足够大,200k 可能就可以了。当对象不适合以太网数据包(1.5k)时存在第一个性能差距,而当它不适合套接字缓冲区(通常高达 256k)时存在第二个性能差距
    • 感谢您的及时回复。我不是网络专家,一定会与我的 netops 团队核实这些信息,即以太网数据包大小和socket buffer size
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2014-03-25
    • 2012-05-13
    • 2011-04-10
    • 2012-03-15
    相关资源
    最近更新 更多