2011-01-17 16 views
10

hipotéticamente - si tengo varios servidores memcached como esto:servidores memcached múltiples cuestionar

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1 
    "10.1.1.2", //web2 
    "10.1.1.3", //web3 
); 
$memcache = new Memcache(); 
foreach($MEMCACHE_SERVERS as $server){ 
    $memcache->addServer ($server); 
} 

Y luego establecer los datos de la siguiente manera:

$huge_data_for_frong_page = 'some data blah blah blah'; 
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page); 

Y luego recuperar datos de esta manera:

$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page"); 

Cuando quisiera recuperar estos datos de los servidores de memcached - ¿cómo sabría el cliente memcached de php qué servidor consultar para estos datos? ¿O el cliente memcached va a consultar todos los servidores de memcached?

+0

Gracias por preguntar esto. Entonces, en general, parece que más escribir/leer es el objetivo y no la redundancia. Estoy buscando redundancia y al menos confirma lo que pensaba. – Till

+0

[Esta pregunta] (http://stackoverflow.com/questions/4038094/using-multiple-memcache-servers-in-a-pool/4038108#4038108) no es exactamente igual, pero mi respuesta allí debe responder pregunta también. –

+0

gracias ... ¿Sabe si el cliente de Memcached equilibra las solicitudes de escritura automáticamente? o va al primer servidor hasta que se llena y luego al segundo hasta que se llena el segundo y el tercero, etc. – Stann

Respuesta

13

Bueno, podrías escribir libros sobre eso, pero el principio básico es que hay algunos enfoques diferentes.

El enfoque más común y sensato para el almacenamiento en caché es la fragmentación. Lo que significa que los datos se sotran solo en un servidor y se usa algún método para determinar en qué servidor se encuentra. Por lo tanto, se puede obtener desde este mismo servidor y solo se trata de un servidor.

Obviamente, esto funciona bien en entornos de clave/valor como memcached.

Una práctica común es tomar un hash criptográfico de la clave. Calcule este hash MOD número de servidores y el resultado es el servidor que almacenará y obtendrá los datos.

Este procedimiento produce un equilibrio más o menos igual.

Cómo se hace exactamente en memcached no sé pero cierto tipo de hash seguro.

Pero tenga en cuenta que esta tecnología no está muy disponible. Entonces, si un servidor falla, las entradas desaparecen. Entonces, obviamente, solo puedes usar esto para propósitos de almacenamiento en caché.

Otras técnicas, donde, por ejemplo, es necesaria una alta disponibilidad de recursos, que tardan en calcularse y se calientan automáticamente en el contexto, implican la replicación.

La forma más común en los entornos de almacenamiento en caché es la replicación maestro-maestra con la resolución de conflictos de la última marca de tiempo. Lo que básicamente significa que cada servidor obtiene los datos de everyserver que aún no están en el servidor local (esto se hace usando registros de replicación y compensaciones de bytes). Si hay un conflicto, se utiliza la última versión (se ignora el ligero desfase temporal entre servidores).

Pero en otros entornos donde, por ejemplo, solo se escribe muy poco pero se lee mucho, a menudo hay una cascada en la que solo participan uno o pocos servidores maestros y el resto es pura replicación de lectura.

Pero estas configuraciones son muy raras porque la fragmentación descrita como bove ofrece el mejor rendimiento y en entornos de almacenamiento en caché la pérdida de datos es mayormente tolerable. por lo que también es el predeterminado para memcached.

+0

He estado buscando respuesta a esta pregunta por un tiempo. Gracias por tan buena respuesta. Respondió a todas mis preocupaciones. –

0

Hace algunos días estaba buscando una solución para optimizar el escalamiento de nuestros servidores de memcached y encontré esta respuesta. A partir de experiencias que habíamos hecho, la solución descrita con generar un hash y un número MOD de servidores para encontrar el servidor de destino, no es la mejor.

Si sube o baja la escala de la cantidad de servidores, es probable que se produzca el mismo escenario al descargar el caché. La mayoría de los valores hash obtienen otro servidor y, por lo tanto, no habrá un resultado de la memoria caché para la primera solicitud.

La mejor solución para usar en tales escenarios es el hash consistente. Con el hash consistente, cada servidor obtiene un hashrange fijo. Entonces, si ahora sube o baja la cantidad de servidores, solo los hashes en este hashrange en particular cambiarán a otro servidor. Todos los demás algoritmos quedan para sus servidores y solo se regenerará una pequeña parte.

Para PHP hay una biblioteca llamada 'flexihash' que hace el hash consistente para usted.

En nuestro Blog, puede encontrar un ejemplo de cómo usarlo con su propio cliente de caché. El artículo está en alemán, pero el código fuente debe ser explicado por sí mismo.