Cómo implementar un bloqueo distribuido y disponibilidad con Redis

  En el escenario de desarrollo real, podemos encontrar diferentes necesidades de los clientes acceso exclusivo a un recurso compartido, que es al mismo tiempo permitir que un solo cliente que opera los recursos compartidos, con el fin de lograr este propósito, por lo general una cerradura distribuido para resolver las actuales implementaciones de bloqueo distribuidos populares tienen una base de datos, Memcached, Redis, sistema de archivos, ZooKeeper, porque Redis alto rendimiento, fácil de implementar ampliamente utilizado, por lo que hoy les daré el siguiente en acción, la forma de aplicar un bloqueo distribuido con Redis .

En primer lugar, un sistema fiable, necesidades bloqueo distribuidos altamente disponibles para cumplir con los siguientes

Excluyentes entre sí: en cualquier momento, sólo un cliente tiene una cerradura no puede ser adquirida a múltiples clientes

Seguridad: El bloqueo sólo se llevará a cabo por el cliente bloqueo borrada y no puede ser eliminado por otros clientes

Callejón sin salida: Obtener un cliente bloqueo está desactivado por alguna razón, no pudo liberar el bloqueo, otros clientes no serán capaces de adquirir el bloqueo, la necesidad de mecanismos para evitar este tipo de problemas

Alta disponibilidad: Como parte del nodo se cae, el cliente puede todavía conseguir un desbloqueo o bloqueo

 

En segundo lugar, implementado utilizando un único nodo de bloqueo distribuido Redis

Redis consigue utilizando un bloqueo único nodo distribuida es la forma más común, aunque no se consideran altamente disponible, pero simple, de bajo coste y es utilizado por muchas pequeñas y medianas empresas.

  Muchos artículo en línea, dijo setnx consigue utilizando un bloqueo distribuido, pero comando setnx no puede establecer su tiempo de caducidad atómica propia cerradura, lo que significa que no se puede establecer su setnx tiempo de caducidad al ejecutar el comando, entonces no será un callejón sin salida, como por ejemplo: Cliente un completo fin simplemente ejecuta setnx, esta vez al cliente un colgó, no cerradura completa para establecer el tiempo de expiración, esta vez produce un punto muerto, todos los clientes ya no pueden obtener el bloqueo. la situación generalmente utilizan la escritura Lua para lograr (porque la ejecución del script Lua Redis es atómica), de hecho, a partir de los comandos set versión 2.6.12 Redis puede sustituir el comando setnx, Dime qué red establecemos los parámetros del comando

valor tecla SET [segundos EX] [milisegundos PX] [NX | XX]

parámetros:

EX segundos: ajustar el tiempo de expiración para los segundos segundos de bonos. Valor tecla SET EX segundo efecto es equivalente al segundo valor de clave SETEX.

PX milisegundos: un tiempo de milisegundos milisegundos caducidad de la clave de configuración. Establecer el valor PX efecto equivalente a la milésima de segundo valor de clave PSETEX milisegundo.

NX: sólo cuando el enlace está ausente, peces operación de tecla set. Valor tecla SET NX efecto equivalente al valor de la clave SETNX.

XX: sólo cuando clave ya existe, peces operación de tecla set.

Por ejemplo: 30.000 este rol valor de la clave comando SET NX PX es sólo cuando no existe esta clave será establecer el valor de la clave (el papel de la opción de NX), el tiempo de espera se establece (PX acción opcional) 30.000 milisegundos

Luego tomamos un comando set o PX EX y NX parámetros puede satisfacer la exclusividad mutua (bloqueo) se ha mencionado anteriormente, el punto muerto (vencen) dos requisitos.

Entonces, ¿cómo cumplir con los requisitos de seguridad de la misma?

Por ejemplo: El cliente A para conseguir bloqueado y definido una fecha de caducidad para el 10S bloqueo, pero debido a alguna razón, el tiempo de ejecución Una supera los 10S cliente, caso cerraduras simples, el cliente B para obtener el bloqueo, entonces el cliente A en este punto acaba de terminar eliminando los bloqueos, pero esta vez para eliminar el cliente B más el bloqueo, la forma de evitar que esto suceda situación insegura?

Opción uno:

Podemos hacer un hilo para obtener un bloqueo para abrir un hilo de utilidad, sirve para bloquear propia "renovación".

Cuando pasó 9S, el cliente A no se ha realizado, este hilo de utilidad tiempo ejecutará expirará del sistema y bloquear "la renovación" 10S, 9S hilo primera daemon se inicia la ejecución, ejecución, una vez cada 9 segundos.

Cuando finalice la tarea cliente A, se apagará hilo de utilidad explícita.

Si el cliente repente el tiempo de inactividad debido a los hilos A y los hilos demonio en el mismo proceso, un hilo de utilidad se detendrá. Este bloqueo para un tiempo de espera cuando nadie le dio renovado, se libera automáticamente.

Opción dos:

También se pueden establecer en el valor conjunto de valores encerrados en un único identifica el identificador de bloqueo para agregar el bloqueo, el bloqueo elimina cuando el juicio no se añade su propio bloqueo que, si no no se eliminan.

Nota: Esto implica un nuevo problema, no se añade su propio juicio y cerraduras de liberación son dos operaciones independientes, no atómica, por lo que tenemos que utilizar Lua secuencia de comandos para ejecutar el juicio y liberar el bloqueo.

En tercer lugar, mejorar la cerradura distribuido alta disponibilidad Redis

En aplicaciones de gran tamaño, servicios generales Redis se agrupan, la replicación maestro-esclavo, Cluster, etc., debido a la Esclavo Maestro síncrona o asíncrona, por lo que habrá cliente un bloqueo en el Maestro, esta vez hacia abajo Maestro, Esclavo no se ha completado la sincronización de bloqueo, se convierte en esclavo Maestro, el cliente B puede operación de bloqueo ha completado, la forma de resolver este problema?

Oficial da algoritmo Redlock, lo que significa más o menos de la siguiente manera:

En una versión distribuida del algoritmo donde suponemos que tenemos N Redis Maestro linfáticos, que son completamente independientes, no tenemos ninguna copia u otro algoritmo de coordinación distribuida implícita (si estás en este programa clúster puede Redis Cluster no aplicable, ranura Redis Cluster porque el hash se basa (ranura hash) asignado a la forma, evidentes algoritmos de coordinación distribuida en diferentes nodos).

Ponemos N se establece en 5, por lo que necesitamos para funcionar cinco nodos maestros en diferentes equipos o máquinas virtuales para asegurar que son en la mayoría de los casos no hacia abajo al mismo tiempo. Un cliente tiene que hacer lo siguiente para obtener el bloqueo:

1, adquiere la hora actual (en milisegundos).

2, con la misma clave y vueltas valor aleatorio (identifica de forma exclusiva el cliente) solicita un bloqueo en N nodos, en este paso, el cliente solicita un bloqueo en cada maestro, y tienen un tiempo de liberación total de la fase de bloqueo mucho menor que el tiempo de espera. Por ejemplo, si el tiempo automático de liberación del bloqueo es de 10 segundos, que cada nodo de bloqueo de solicitud de tiempo de espera puede estar en el rango de 5-50 ms, esto puede prevenir el bloqueo de un cliente demasiado tiempo en un nodo maestro de derribo, si un nodo maestro no está disponible, debemos tratar el próximo nodo maestro tan pronto como sea posible.

3, cliente de computación segundo paso que da para obtener un bloqueo, sólo cuando el cliente obtiene con éxito un bloqueo en la mayor parte del nodo maestro (en este caso tres), y el tiempo total no pasó más de tiempo de liberación de bloqueo, este que es la adquisición de bloqueo un éxito.

4, si la adquisición de bloqueo tiene éxito, ahora es el momento de bloqueo libera automáticamente antes de la primera vez, menos de desbloqueo consume para obtener un bloqueo.

5, si la adquisición de bloqueo fracasó, ya sea porque no bloqueo para tener éxito, más de la mitad (N / 2 + 1), o porque el total el tiempo transcurrido excede el tiempo de liberación de bloqueo, el cliente será para liberar el bloqueo en cada nodo maestro, incluso él cree que los que no tuvo éxito cerradura.

Aunque RedLock algoritmo puede resolver el problema de la cerradura de alta disponibilidad distribuida ReDiS un solo punto, pero si hay un accidente de reiniciar el nodo de clúster se produce, o no habrá bloqueo de los problemas de seguridad. Escena problemas específicos son los siguientes:

Supongamos que un total de A, B, C, D, E, 5ª Redis nodos contempla siguiente secuencia de eventos:

1, un Cliente bloqueado con éxito A, B, C, adquirir correctamente el bloqueo (pero no con llave D y E)

2, el reinicio del accidente el nodo C, pero el cliente 1 en el C no se añaden abajo bloqueo persistente, falta

3, el nodo C después de la reanudación, el cliente 2 encerrados C, D, E, adquirir correctamente el bloqueo

De esta manera, el cliente 1 y el cliente 2 mientras que el acceso a la cerradura (por el mismo enlace). Para este escenario, la solución es muy simple, es hacer que retarden la reanudación después de un accidente Redis, y este retraso es más largo que el tiempo de caducidad de bloqueo muy bien. Después de esta y otras reinicio nodo, cerraduras en todos los nodos han sido ineficaces. No hubo ningún caso de dos cliente obtiene el mismo enlace más apareció.

En circunstancias especiales para lograr bloqueo distribuido racimo corto Redis con más para ser considerado, especialmente en el caso de más servidores, necesitan más pruebas.

Por último, una variedad de códigos de idioma Redlock algoritmo, amigos interesados ​​pueden estudio profundo sigue:

Redlock-py (implementación de Python):

https://github.com/SPSCommerce/redlock-py

Redlock-PHP (PHP aplicación):

https://github.com/ronnylt/redlock-php

PHPRedisMutex (PHP aplicación más completa):

https://github.com/php-lock/lock#phpredismutex

Redsync.go (Ir realización):

https://github.com/hjr265/redsync.go

Redisson (aplicación Java):

https://github.com/redisson/redisson

Redis :: DistLock (Perl realización):

https://github.com/sbertrang/redis-distlock

Redlock-CPP (C ++ de lograr):

https://github.com/jacket-code/redlock-cpp

Redlock-cs (C # / aplicación NET.):

https://github.com/kidfashion/redlock-cs

node-redlock (NodeJS 实现). Incluye soporte para la extensión de bloqueo:

https://github.com/mike-marcacci/node-redlock

Resumen: La necesidad de elegir por Redis bloqueo distribuye de acuerdo a su situación real es en la forma de un clúster independiente o de alta disponibilidad

En tercer lugar, el hecho de Redis disponibilidad de bloqueo distribuido

  El programa anterior se construye específicamente para Redis bloqueo distribuidos Redis racimos, de hecho, es posible que acaba de ser una caja de negro ReDiS enlace desde el interior en el interruptor principal y la biblioteca principal adquirida desde el nodo para el programa no existía, programar sólo un negocio.

Así que si usted quiere lograr lo anterior bloqueo distribuido, sino también con el apoyo de dba.

Supongo que te gusta

Origin www.cnblogs.com/zenghansen/p/12450909.html
Recomendado
Clasificación