McRouter теряет ключ при увеличении - PullRequest
0 голосов
/ 02 июля 2018

Я использую кластер k8s в GKE и использовал их пошаговое руководство по созданию конфигурации McRouter с memcached. Изначально мы использовали хранилища ключей консула, но наш кеш слишком велик и заставляет консула использовать слишком много памяти, поэтому мы решили проверить memcache на его месте. Я раскручиваю демон-демон mcrouter и у меня есть один модуль memcache, и все работает просто отлично. Это когда я добавил несколько тестовых ключей. Они получают и удаляют в порядке. Проблема возникает, когда я оставляю ключи на месте и в масштабе.

Я масштабирую набор состояний memcache и добавляю имя второго сервера в конфигурационную карту для mcrouter. Как только я вижу новый сервер, использующий серверы статистики, я запускаю get, и один из ключей больше не существует. Я подключился к 11211 на исходном модуле memcache, запустил 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 для ограничения только одним модулем, а также переключился на использование официального образа докера вместо того, который использовался в примере с шлемом k8s, и мне не повезло. Независимо от того, что я делаю, я продолжаю получать «не найденный» через mcrouter получить хотя бы одну клавишу после масштабирования, в то время как другие ключи все еще находятся в порядке. Помощь

1 Ответ

0 голосов
/ 13 июля 2018

При использовании PoolRoute маршруты к месту назначения основаны на хеше ключа. Таким образом, когда вы масштабируете набор состояний memcache с новым memcache, ключевой хэш вашего ключа изменяется. Вот почему Mcrouter не может получить ваш ключ, даже если он уже присутствует в вашем кэше.

Давайте посмотрим на вики: 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"
  }
}
...