¿Qué tan seguro es almacenar sesiones con Redis?

92

Actualmente estoy usando MySql para almacenar mis sesiones. Funciona muy bien, pero es un poco lento.

Me han pedido que use Redis, pero me pregunto si es una buena idea porque escuché que Redis retrasa las operaciones de escritura. Tengo un poco de miedo porque las sesiones deben ser en tiempo real.

¿Alguien ha experimentado tales problemas?

Trento
fuente
1
Dado que Redis dice que tiene una durabilidad opcional, yo diría que es seguro usarlo si opta por la persistencia en el disco duro. Sin embargo, para los datos de sesión, definitivamente los guardaría en la RAM (lo que significa que no me preocuparía por la durabilidad como parte de todo el calvario). Lo peor que debería suceder en caso de que pierda los datos de la sesión es que sus usuarios cierren la sesión.
NB
1
sí, pero esto es parte de mi requisito, los usuarios no deberían tener que volver a iniciar sesión, por cierto, algunos datos de los usuarios se conservan durante la sesión mientras los usuarios no están conectados (usuarios invitados). Irán por Redis RAM pero con el registro y / o la copia de seguridad habilitados. Si perdimos algunas sesiones es aceptable.
Trent
1
mi principal preocupación es sobre la escritura retrasada, qué sucede si un usuario inicia sesión y la sesión se escribe con retraso, será redirigido pero no iniciará sesión
Trent
2
Imagine un sitio de comercio electrónico, si se pierde la sesión, también se pierde el carrito actual, eso no es terrible, pero puede resultar extraño para los usuarios. Los usuarios invitados se identifican solo con una sesión, por lo que no hay forma de recuperar su carrito.
Boris Guéry
1
@ BorisGuéry, no es que no esté de acuerdo, pero si hay que mejorar el rendimiento, se deben establecer compromisos cuando algo sale mal. Sí, será extraño que los usuarios se desconecten repentinamente, eso es seguro, pero la pregunta es ¿con qué frecuencia se espera que suceda? Si es una o dos veces al año que todos los nodos de Redis fallan, entonces no veo ninguna razón para diezmar el rendimiento durante algunos momentos aislados cuando todo el clúster no está disponible. Pero ese soy solo yo.
NB

Respuestas:

147

Redis es perfecto para almacenar sesiones. Todas las operaciones se realizan en la memoria, por lo que las lecturas y escrituras serán rápidas.

El segundo aspecto es la persistencia del estado de la sesión. Redis le brinda mucha flexibilidad en cuanto a cómo desea conservar el estado de la sesión en su disco duro. Puede visitar http://redis.io/topics/persistence para obtener más información, pero en un nivel alto, estas son sus opciones:

  1. Si no puede permitirse perder ninguna sesión, establezca appendfsync alwayssu archivo de configuración. Con esto, Redis garantiza que cualquier operación de escritura se guarde en el disco. La desventaja es que las operaciones de escritura serán más lentas.
  2. Si está de acuerdo con perder aproximadamente 1s de datos, use appendfsync everysec. Esto dará un gran rendimiento con garantías de datos razonables.
Sripathi Krishnan
fuente
14

Básicamente, hay dos tipos principales disponibles: async snapsnots y fsync(). Se llaman RDB y AOF respectivamente. Más sobre los modos de persistencia en la página oficial .

El manejo de señales del proceso demonizado se sincroniza con el disco cuando recibe un SIGTERM, por ejemplo, por lo que los datos aún estarán allí después de un reinicio. Creo que el demonio o el sistema operativo tiene que fallar antes de que vea una corrupción de integridad, incluso con la configuración predeterminada (instantáneas RDB).

La configuración de AOF utiliza un archivo de solo adjuntar que registra los comandos que recibe el servidor y recrea la base de datos desde cero en el inicio en frío, desde el archivo guardado. La política de sincronización de disco predeterminada es vaciar una vez cada segundo (IIRC), pero se puede configurar para bloquear y escribir en cada comando.

El uso de las instantáneas y el registro incremental parece ofrecer un enfoque a largo plazo de no importar si me pierdo unos pocos segundos de datos con un registro incremental más seguro pero costoso. Redis admite la agrupación en clústeres lista para usar, por lo que parece que la replicación también se puede hacer.

Estoy usando la configuración predeterminada de RDB y estoy guardando las instantáneas en FTP remoto. Todavía no he visto una falla que haya causado una pérdida de datos. Lo más probable es que se produzcan fallas agudas de hardware o cortes de energía, pero estoy alojado en un VPS. Escasas posibilidades de que eso suceda :)

Morten Jensen
fuente
12

Esta pregunta se trata realmente de sesiones en tiempo real, y parece haber surgido en parte debido a un malentendido de la frase 'operaciones de escritura retrasadas'. Si bien los detalles finalmente se descubrieron en los comentarios, solo quería dejarlo súper claro. ..

No tendrás problemas para implementar sesiones en tiempo real.

Redis es un almacén de clave-valor en memoria con persistencia opcional en disco. "Operaciones de escritura retrasada" se refiere a escrituras en disco , no a la base de datos en general, que existe en la memoria. Si establece un par clave / valor, puede OBTENERlo inmediatamente (es decir, en tiempo real). La política que seleccione con respecto a la persistencia (cuánto demora las escrituras) determinará el límite superior de la cantidad de datos que se podrían perder en una falla.

Jordan Dodson
fuente