Простая настройка:
У меня есть следующий конфиг 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
вот пиар
https://github.com/twitter/twemproxy/pull/428
после этого перекомпилируй