Pregunta

reivindicación Predis tenga Client-side sharding (apoyo a hashing consistente de teclas). http://github.com/nrk/predis

I puede hacer sharding usando conexión a una serie de perfiles (nodos) pero no es hashing consistente. Cuando agrego otro nodo de la piscina, algunas de las claves no se puede encontrar. Alguien tiene alguna experiencia en esto?

Uso php 5.2 (y php versión de redis 5,2).

¿Fue útil?

Solución

El sitio oficial Redis dice "Redis apoya sharding del lado del cliente a través de hash consistente. Actualmente no hay apoyo para la tolerancia a fallos, ni añadir o racimos eliminar al tiempo de ejecución."

Por lo que entiendo por el momento este tipo de intercambio no es tolerante a fallos, y se perderán todas las claves almacenadas en un nodo que ha fallado. Igualmente si se agrega un nuevo nodo, ahora se perderá una parte del espacio de claves (como se almacenarán en las teclas del nodo incorrecto). Normalmente, en un sistema de hash consistente, cuando un nuevo nodo se une que copia todas las llaves que ahora se asignan a la misma desde sus vecinos. No hay apoyo en el servidor Redis para hacer esto.

Así que el hash consistente bien funciona si está utilizando Redis como caché, donde los datos se almacenan en realidad detrás de Redis, pero por el momento no espera a sus datos no van a faltar.

ACTUALIZACIÓN: Es posible implementar sharding real a través de una biblioteca hash consistente llamado ketama .

Otros consejos

La solución es utilizar sharding virtual. No sé obras marco Predis pero predigo que utiliza algún tipo de matriz - es probable que lo llena de información acerca de cada fragmento en el arranque.

Supongamos que va a tener máximo de 10 fragmentos (este número debe ser probable que se alcance). A continuación, cree gama sharding que los puntos a sólo 3 servidores reales. En el futuro, cuando va a agregar nuevos nodos, se le migrar los datos relacionados con las nuevas fragmento y la cartografía de cambio. Este enfoque conserva la forma cambiante de la función hash.

mapeo inicial:

0 => 0 //node #0
1 => 0
2 => 0
3 => 1 //node #1
4 => 1
5 => 1
6 => 2 //node #2
7 => 2
8 => 2
9 => 2

Cuando se agrega un nuevo nodo solo cambio de mapeo:

0 => 0
1 => 0
2 => 3 // new node #3
3 => 1
4 => 1
5 => 3 // new node #3
7 => 2
8 => 2
9 => 3 // new node #3

lo que tiene que mover datos con h (x) = 9 o 5 o 2 a nodo # 3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top