McRouter失去了扩大规模的关键

时间:2018-07-02 19:19:35

标签: memcached high-availability google-kubernetes-engine

我正在GKE中运行k8s集群,并使用了将McRouter设置与memcached组合在一起的演练。最初,我们使用consul密钥库,但我们的缓存太大,导致consul使用过多的内存,因此我们决定在该位置测试memcache。我启动了mcrouter守护程序集,并拥有一个单独的内存缓存容器,并且一切正常。这是我添加一些测试键的时间。他们得到并删除确定。问题出在我将键留在原地并按比例缩放时。

我扩大了内存缓存状态集并将第二个服务器名称添加到mccrouter的configmap中。一旦看到使用统计服务器的新服务器,我就运行get命令,其中一个键不再存在。我已经在原始Memcache Pod上远程登录到11211并运行get并可以检索相同的密钥。 configmap中提供的配置如下:

  {
    "pools": {
      "A": {
        "servers": [
          "memcached-0.memcached.default.svc.cluster.local:11211",
          "memcached-1.memcached.default.svc.cluster.local:11211"
        ]
      }
    },
    "route": "PoolRoute|A"
  }

我也转而使用有状态集让mcrouter只能使用一个pod,并且还切换到使用正式的docker镜像,而不是k8s示例Helm Chart中的镜像,并且没有运气。无论我做什么,在缩放后,我都会通过mcrouter至少获得一个键,而其他键仍然可以正常工作,从而不断得到“未找到”。帮助吗?

1 个答案:

答案 0 :(得分:0)

使用PoolRoute,到目的地的路由基于密钥哈希。     因此,当您使用新的内存缓存扩展内存缓存状态集时,密钥的密钥哈希会发生变化。因此,即使Mcrouter缓存中已经存在密钥,它也无法获取您的密钥。

我们来看看Wiki:https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles

也许这种配置可以帮助您:

{
  "pools": {
    "A": {
      "servers": [
          "memcached-0.memcached.default.svc.cluster.local:11211",
          "memcached-1.memcached.default.svc.cluster.local:11211"
      ]
    },
    "fallback": {
      "servers": [
        "memcached-fallback.memcached.default.svc.cluster.local:11211"
      ]
    }
  },
  "route": {
    "type": "FailoverRoute",
    "normal": {
      "type": "PoolRoute",
      "pool": "A"
    },
    "failover": "PoolRoute|fallback"
  }
}