Red de Respuestas Legales - Derecho empresarial - partición de datos de redis: hash consistente y partición de ranura virtual

partición de datos de redis: hash consistente y partición de ranura virtual

1. Partición del área de nodos:

Utilice datos específicos, como claves de Redis o ID de usuario, y luego utilice la fórmula: hash(clave)%N para calcular el hash en función de el valor N del número de nodos, que se utiliza para determinar a qué nodo se asignan los datos.

El problema con esta solución es:

Cuando el número de nodos cambia, el hash debe se volverá a calcular, lo que provocará que los datos se vuelvan a migrar.

2. Algoritmo hash consistente

La idea de implementación del algoritmo hash consistente es asignar un token a cada nodo en el sistema, que van desde 0 ~ 2 ^ 32. Estos tokens constituyen un anillo hash al leer y escribir datos para realizar operaciones de búsqueda de nodos, primero calcule el valor hash según la clave y luego busque el primer nodo token mayor que o. igual al hash en el sentido de las agujas del reloj.

Beneficios:

La mayor ventaja de este método es que al agregar o eliminar nodos, solo afecta a los dos nodos adyacentes en el anillo hash y no tiene impacto en otros nodos.

Pregunta:

3. Algoritmo de ranura virtual

Utilice una función hash con buena dispersión para asignar todos los datos a las ranuras (ranuras) en el rango de 0 ~ 16383 (2 ^ 14) La cantidad de ranuras es generalmente mucho mayor que la cantidad de instancias.

Las ranuras son la unidad básica de gestión y migración de datos del clúster. Las ranuras a gran escala tienen como objetivo facilitar la división de datos y la expansión del clúster.

Cada instancia asignará una parte del rango de ranuras.

Características:

1 Desacople la relación entre datos y nodos, simplificando la dificultad de expansión y bloqueo

2. El nodo en sí mantiene la relación de mapeo de la ranura y no requiere que el cliente o el servicio proxy mantenga los metadatos. la partición de la ranura.

3. Admite consultas de mapeo entre nodos, ranuras y claves para el enrutamiento de datos, escena de luz retráctil en línea.

HashTags (entrevista)

Mset k1 v1 k2 v2 k3 v3

Mediante la fragmentación, los datos se pueden dividir razonablemente en En un nodo diferente, esto habría sido algo bueno. Pero a veces queremos operar negocios relacionados de manera atómica. Para dar un ejemplo simple

Ejecutamos MSET en un solo nodo (m significa múltiple, configuramos múltiples claves y valores para redis a la vez. Requerimos todas las claves dadas). deben configurarse al mismo tiempo y no puede haber una situación en la que algunas claves específicas se actualicen y otras claves especificadas no se actualicen. Sin embargo, en un entorno de clúster, aún podemos ejecutar el comando MSET, pero su operación ya no es una operación atómica. Algunas claves especificadas se actualizarán, mientras que otras claves especificadas no cambiarán. Esto se debe a que se pueden asignar varias claves. una máquina diferente.

Por lo tanto, habrá una contradicción aquí: las claves deben estar dispersas en diferentes máquinas tanto como sea posible, y algunas claves relacionadas deben asignarse a la misma máquina.

Esto también es algo que se pregunta fácilmente durante las entrevistas. ¿Cómo solucionarlo?

Del análisis anterior, aprendimos que la fragmentación es en realidad un proceso de hash. La clave se procesa y luego se divide en diferentes máquinas. Entonces, para resolver este problema, debemos considerar cómo hacer que los valores hash de las claves asociadas sean iguales. No es realista si todas las claves son iguales, entonces, ¿cómo solucionarlo? El concepto de HashTag se introduce en Redis, que permite que el algoritmo de distribución de datos se calcule en función de una determinada parte de la clave y luego permite que las claves relacionadas caigan en el mismo fragmento de datos;

Para dar un ejemplo simple, si se almacena la información del usuario,

redis:store:1001, redis:store:1002

luego a través del hashtag,

redis:{store } :1001, redis:{store}:1002; significa

Cuando una clave contiene {}, no se aplicará hash a toda la clave, sino que solo se aplicará hash a la cadena incluida en {}.