prosta konfiguracja:Twitter - twemproxy - memcached - nie ponowić próbę działa zgodnie z oczekiwaniami
- 1 węzeł działa twemproxy (VCache: 22122)
- 2 węzły działające memcached (sterownik Vcache-1 VCache-2) zarówno słuchanie na 11211
mam następujący twemproxy config:
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 węzeł może rozwiąż wszystkie hosty. W ramach testów zdjąłem vcache-2. W teorii przy każdej próbie połączenia się z vcache: 22122, twemproxy skontaktuje się z serwerem z puli, aby ułatwić próbę. Jeśli jednak jeden z węzłów pamięci podręcznej jest wyłączony, to twemproxy ma "automatycznie wyrzucać" go z puli, więc kolejne żądania nie zawiodą.
To od warstwy aplikacji zależy, czy nieudana próba połączenia z vcache: 22122 była spowodowana problemem infrastruktury, a jeśli tak, spróbuj ponownie. Jednak widzę, że przy ponownym użyciu, używany jest ten sam serwer, który się nie udał, więc zamiast kolejnych prób przekazanych do znanego dobrego węzła pamięci podręcznej (w tym przypadku vcache-1), nadal są one przekazywane do wyrzuconego węzła pamięci podręcznej (vcache) -2).
Oto fragment kodu php, który próbuje się powtórzenie:
....
// $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;
- Update -
Link do kwestia otwarta Github o więcej informacji: Issue #427
Próbowałem różnych permutacji. Rozbroiłem memcached object, dodałem uśpienie, a następnie przywróciłem obiekt. Ale wciąż nie ma szczęścia. Jestem pewien, że poprawiłem ustawienie limitu czasu, ale nie jest to w OP, muszę sprawdzić moje notatki. Zaktualizuję. –
Zaktualizowałem config w OP, mam timeout ustawiony na 100 (ms). Który powinien minąć co najmniej trzecią próbę. –