【问题标题】:Migrating Memcached client from Memcached-Java-Client to Xmemcached将 Memcached 客户端从 Memcached-Java-Client 迁移到 Xmemcached
【发布时间】:2011-06-08 00:30:56
【问题描述】:

我有一个基于 danga 客户端的旧 memcached 客户端实现,但稍作修改。我想这个客户现在叫Memcached-Java-Client

我手头的实现是旧的、未维护的,而且似乎是伪造的。

我需要将客户端迁移到具有以下约束的较新客户端:

  1. 我需要新的客户端哈希算法与旧的兼容。如果不满足此限制条件,我们将不得不让网站(至少部分)在几个小时内不可用。
  2. 支持各种序列化方法,并允许序列化方法的可扩展性。
  3. 比我现有的客户提高了性能。
  4. 兼容Moxi

当前的实现使用一致的散列算法,它似乎与Xmemcached 使用的一致散列兼容,除了我无法获得旧客户端存储并使用 Xmemcached 客户端获取的键的缓存命中。

我调试了代码,得到了相同的hashcode,但是我觉得server ring不一样,所以整体的hash方式不一样。

这是我用来初始化 xmemcached 客户端的代码:

  final MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));
  builder.setCommandFactory(new BinaryCommandFactory());
  builder.setSessionLocator(new KetamaMemcachedSessionLocator());
  builder.setTranscoder(new WhalinTranscoder());
  memcachedClient = builder.build();

如果我无法让 xmemcached 工作,我也愿意尝试 spymemcached,但我更喜欢后者。

编辑: 我也尝试了 spymemcached,但无法让它与我当前的客户端兼容。 这是我的 spymemcached 客户端初始化代码:

final ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
builder.setProtocol(Protocol.BINARY);
builder.setTranscoder(WhalinTranscoder());
builder.setHashAlg(HashAlgorithm.KETAMA_HASH);
builder.setLocatorType(Locator.CONSISTENT);
final MemcachedClient client = MemcachedClient(builder.build(), AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));

【问题讨论】:

  • 出于好奇,您为什么对 spymemcached 不太感兴趣? moxi 的作者和 spymemcached (me) 的作者大部分时间都坐在同一个房间里,我们做了很多工作。但更重要的是,您的所有要求都是 spymemcached 的目标,而且我们有付费开发人员和开源贡献者也在从事 memcached 本身的工作。
  • 这是一个很好的输入@Dustin。我不知道这个输入。我看到 xmemcached 的作者完成的一些基准测试显示了更好的结果 + 它是多线程的这一事实让我认为它在重负载下会表现得更好。我仍然没有验证这个假设,仍然需要满足我的其他要求。我还想看看哪个 API 更吸引人。
  • @Dustin,spymemcached 一致性哈希算法是否与 danga 兼容?
  • xmemcached 已显示出边际速度提升。当然,它并不慢。这样做的人很晚才开始,并且有一张白纸可以使用,这是一个令人羡慕的职位。我对 Whalin 的客户端做了类似的事情,并且必须提供与它的兼容性,这导致了我的一些模块化。你应该可以把它换进去。但是,我们正在为下一代缩放模型和其他有趣的东西做a lot of work

标签: java memcached


【解决方案1】:

似乎我的旧 danga 客户端与 Xmemcached/Spymemcached 客户端不兼容,原因很简单: danga 客户端对 host:port 字符串进行哈希处理,而后面的客户端对 InetSocketAddress 进行哈希处理,该地址实际上等于 host/IP:port。

由于这个事实,我在迁移到较新的客户端时无法保持兼容。好吧,实际上 Xmemcached 和 Spymemcached 客户端都具有一定的可扩展性,并且确实允许一些支持来实现这一点,但是这样做对我的偏好来说太“hacky”了。

我决定做的是根据基准测试结果迁移我的代码以使用 Xmemcached/Spymemcached 之一。两者都兼容 moxi 的哈希算法。 我最终可能最终只使用客户端 moxi - 取决于它将增加的开销。我最喜欢这个选项,因为它使应用程序配置更加简单。

【讨论】:

    【解决方案2】:

    据我了解,您将遇到与 xmemcached 和 spymemcached 相同的问题。正如我之前在这里提到的-http://bugs.membase.org/browse/MB-1484,您现在使用的一致散列是加权一致散列,而不是其他 2,这就是您缺少一些键的原因。

    【讨论】:

    • 这并不完全准确。不兼容的原因是散列对象的差异 - host:port VS host/ip:port - 请参阅上面的答案。
    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多