sql >> Base de Datos >  >> NoSQL >> Redis

¿Hay alguna manera de hacer que una clave específica se ubique en una instancia redis específica en modo de clúster?

Puedes, pero no es trivial. En primer lugar, Redis usa llaves en la clave para determinar la parte fragmentada de la misma, por lo que puede decidir modificar una clave y enviarla a un fragmento arbitrario.

Ahora, necesitas dos cosas:

  1. Un mapa de qué fragmento o intervalo de ranuras reside en qué instancia de redis.

  2. Una forma de saber qué cadena se asigna a qué ranura, para que pueda forzar una "cadena de fragmentos" en su clave para enrutarla a un fragmento específico.

El primero es fácil:CLUSTER SLOTS te dará ese mapa, solo analízalo.

El segundo es más complicado, pero afortunadamente ya he hecho este trabajo. Creé una tabla de la asignación de cadena alfanumérica más corta posible para cada una de las 16384 ranuras en el clúster de Redis. Está en C pero puedes convertirlo fácilmente a lo que sea. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Entonces su algoritmo sería, dada una clave y un nodo deseado:

  1. Mire el mapa de ranuras y tome los rangos de ranuras que residen en ese nodo.

  2. Seleccione una ranura dentro del rango de ese nodo.

  3. Busque en la tabla de fragmentación la entrada de ese espacio.

  4. Golpea esa cuerda con llaves en la tecla. p.ej. convertir foo a foo{e4x} .

¡Y eso es! Cualquier comando que utilice esta clave se enrutará a ese fragmento.

Versión de pseudo-python:

# Build this table from CLUSTER SLOTS or CLUSTER NODES
slots = {
   '127.0.0.1:7000': [(0, 1045),(2000,2100)]
   ...
 }

# Build this table from the C example:
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]

def retarget_key(key, node):
    ranges = slots[node] 

    sharding_key = shading_table[ranges[0][0]]
    return '%s{%s}' % (key, sharding_key)