我正在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至少获得一个键,而其他键仍然可以正常工作,从而不断得到“未找到”。帮助吗?
答案 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"
}
}