Twitter – twemproxy – memcached – Повторная попытка не работает должным образом

Простая настройка:

  • 1 узел, на котором запущен twemproxy (vcache: 22122)
  • 2 узла, выполняющие memcached (vcache-1, vcache-2), и прослушивание 11211

У меня есть следующая конфигурация twemproxy:

default: auto_eject_hosts: true distribution: ketama hash: fnv1a_64 listen: 0.0.0.0:22122 server_failure_limit: 1 server_retry_timeout: 600000 # 600sec, 10m timeout: 100 servers: - vcache-1:11211:1 - vcache-2:11211:1 

Узел twemproxy может разрешать все имена хостов. В рамках тестирования я снял vcache-2. Теоретически для каждой попытки взаимодействия с vcache: 22122, twemproxy свяжется с сервером из пула, чтобы облегчить попытку. Однако, если один из узлов кэша отключен, тогда twemproxy должен «автоматически извлечь» его из пула, поэтому последующие запросы не будут терпеть неудачу.

Это зависит от уровня приложения, чтобы определить, был ли неудачный интерфейс попыткой с помощью vcache: 22122 был вызван проблемой инфраструктуры, и если да, попробуйте еще раз. Однако я нахожу, что при повторном запуске используется тот же самый неудавшийся сервер, поэтому вместо последующих попыток, передаваемых известному хорошему узлу кеша (в данном случае vcache-1), они все еще передаются на выталкиваемый узел кеша (vcache -2).

Вот фрагмент кода PHP, который пытается повторить попытку:

 .... // $this is a Memcached object with vcache:22122 in the server list $retryCount = 0; do { $status = $this->set($key, $value, $expiry); if (Memcached::RES_SUCCESS === $this->getResultCode()) { return true; } } while (++$retryCount < 3); return false; 

— Обновить —

Ссылка на проблему, открытую в Github, для получения дополнительной информации: № 427

Я не вижу ничего плохого в вашей конфигурации. Как вы знаете, важны настройки:

 default: auto_eject_hosts: true server_failure_limit: 1 

В документации указывается, что таймауты подключения могут быть проблемой.

Опираясь только на тайм-ауты на стороне клиента, имеет отрицательный эффект от первоначального запроса, имеющего тайм-аут на клиенте для прокси-соединения, но все еще ожидающий и выдающийся на прокси-сервере для подключения к серверу. Это дополнительно усугубляется, когда клиент повторяет первоначальный запрос.

Является ли ваш PHP-скрипт закрытием соединения и повторной попыткой, прежде чем twemproxy не выполнил свою первую попытку и удалил сервер из пула? Возможно, добавление значения timeout в twemproxy ниже таймаута соединения, используемого в PHP, решает проблему.

Из вашего обсуждения на Github, хотя это звучит как поддержка healthcheck и, возможно, автоматический выброс, нестабильны в twemproxy. Если вы строите против старых пакетов, вам может быть лучше найти пакет, который был стабильным в течение некоторого времени. Подходит ли mcrouter (с интересной статьей )?

Чтобы эта функция работала, пожалуйста, объединитесь с этим репо / филиалом

https://github.com/charsyam/twemproxy/tree/feature/heartbeat

иметь эту конкретную фиксацию

https://github.com/charsyam/twemproxy/commit/4d49d2ecd9e1d60f18e665570e4ad1a2ba9b65b1

вот PR

https://github.com/twitter/twemproxy/pull/428

после этого перекомпилируйте его