php caching memcached twemproxy

php - Twitter-twemproxy-memcached-Reintentar no funciona como se esperaba



caching (2)

No puedo ver nada malo en tu configuración. Como saben, los ajustes importantes están en su lugar:

default: auto_eject_hosts: true server_failure_limit: 1

La documentación sugiere que los tiempos de espera de conexión pueden ser un problema.

Confiar solo en los tiempos de espera del lado del cliente tiene el efecto adverso de que la solicitud original haya agotado el tiempo en la conexión del proxy al cliente, pero aún está pendiente y pendiente en la conexión del proxy al servidor. Esto se exacerba aún más cuando el cliente reintenta la solicitud original.

¿Está su script PHP cerrando la conexión y volviendo a intentarlo antes de que twemproxy haya fallado en su primer intento y haya eliminado el servidor del grupo? Quizás agregar un valor de timeout en el twemproxy más bajo que el tiempo de espera de conexión usado en PHP resuelva el problema.

De su discusión sobre Github, aunque parezca que el soporte para el chequeo de salud, y quizás la expulsión automática, no es estable en twemproxy. Si está compilando con paquetes viejos, es mejor que encuentre un paquete que haya permanecido estable durante algún tiempo. ¿Es mcrouter (con un artículo interesante ) adecuado?

Configuración simple:

  • 1 nodo ejecutando twemproxy (vcache: 22122)
  • 2 nodos ejecutando memcached (vcache-1, vcache-2) ambos escuchando en 11211

Tengo la siguiente configuración de 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

El nodo twemproxy puede resolver todos los nombres de host. Como parte de las pruebas eliminé vcache-2. En teoría, para cada intento de interfaz con vcache: 22122, twemproxy se pondrá en contacto con un servidor del grupo para facilitar el intento. Sin embargo, si uno de los nodos del caché está inactivo, entonces se supone que twemproxy lo "expulsará automáticamente" del grupo, por lo que las solicitudes posteriores no fallarán.

Depende de la capa de la aplicación determinar si un intento de interfaz fallido con vcache: 22122 se debió a un problema de infraestructura, y si es así, vuelva a intentarlo. Sin embargo, estoy encontrando que en el reintento, se está utilizando el mismo servidor fallido, por lo que en lugar de los intentos posteriores que se pasan a un nodo de caché en buen estado (en este caso vcache-1), todavía se están pasando al nodo de caché expulsado (vcache -2).

Aquí está el fragmento de código de PHP que intenta el reintento:

.... // $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;

- Actualización -

Enlace a Issue abierto en Github para más información: Issue # 427