É seguro armazenar sessões com o Redis?

92

Atualmente estou usando o MySql para armazenar minhas sessões. Funciona muito bem, mas é um pouco lento.

Pediram-me para usar o Redis, mas estou me perguntando se é uma boa ideia porque ouvi dizer que o Redis atrasa as operações de gravação. Estou com um pouco de medo porque as sessões precisam ser em tempo real.

Alguém já experimentou esses problemas?

Trent
fonte
1
Como o Redis diz que tem durabilidade opcional, eu diria que é seguro usá-lo se você optar pela persistência no HDD. No entanto, para os dados da sessão - eu definitivamente os salvaria na RAM (o que significa que não me preocuparia com a durabilidade de toda a provação). O pior que deve acontecer caso você perca os dados da sessão é ter seus usuários desconectados.
NB
1
sim, mas isso é parte do meu requisito, os usuários não devem ter que se logar novamente, a propósito, alguns dados dos usuários são persistidos durante a sessão enquanto os usuários não estão logados (usuários convidados). Eles irão para Redis RAM, mas com registro e / ou backup habilitado. Se perdemos algumas sessões, é aceitável.
Trent
1
minhas principais preocupações são sobre a gravação atrasada, o que acontece se um usuário efetuar login e a sessão for gravada com atraso, ele será redirecionado, mas não conectado
Trent
2
imagine um site de comércio eletrônico, se a sessão for perdida, o carrinho atual também será perdido, isso não é terrível, mas pode ser estranho para os usuários. Os usuários convidados são identificados apenas com uma sessão, portanto não há como recuperar seu carrinho.
Boris Guéry
1
@ BorisGuéry - não é que eu discorde, mas se for preciso aumentar o desempenho - é preciso definir compromissos quando algo der errado. Sim, será estranho que os usuários sejam desconectados repentinamente, com certeza - mas a questão é com que frequência isso deve acontecer? Se for uma ou duas vezes por ano que todos os nós do Redis caem, não vejo razão para dizimar o desempenho por algumas vezes isoladas, quando todo o cluster está indisponível. Mas isso sou só eu.
NB

Respostas:

147

O Redis é perfeito para armazenar sessões. Todas as operações são realizadas na memória e, portanto, as leituras e gravações serão rápidas.

O segundo aspecto é a persistência do estado da sessão. O Redis oferece bastante flexibilidade em como você deseja manter o estado da sessão no disco rígido. Você pode acessar http://redis.io/topics/persistence para saber mais, mas em um alto nível, aqui estão suas opções -

  1. Se você não pode perder nenhuma sessão, defina appendfsync alwaysem seu arquivo de configuração. Com isso, o Redis garante que todas as operações de gravação sejam salvas no disco. A desvantagem é que as operações de gravação serão mais lentas.
  2. Se não houver problema em perder cerca de 1s de dados, use appendfsync everysec. Isso proporcionará um ótimo desempenho com garantias de dados razoáveis
Sripathi Krishnan
fonte
14

Basicamente, existem dois tipos principais disponíveis: snapsnots assíncronos e fsync(). Eles são chamados de RDB e AOF, respectivamente. Mais sobre modos de persistência na página oficial .

O tratamento do sinal do processo daemonizado sincroniza com o disco quando ele recebe um SIGTERM, por exemplo, para que os dados ainda estejam lá após uma reinicialização. Acho que o daemon ou o sistema operacional precisa travar antes que você veja uma corrupção de integridade, mesmo com as configurações padrão (instantâneos RDB).

A configuração AOF usa um arquivo somente anexo que registra os comandos que o servidor recebe e recria o banco de dados desde o início na inicialização a frio, a partir do arquivo salvo. A política de sincronização de disco padrão é liberar uma vez a cada segundo (IIRC), mas pode ser definida para bloquear e gravar em cada comando.

Usar os instantâneos e o log incremental parece oferecer uma abordagem de longo prazo para não se importar se eu perder alguns segundos de dados com um log incremental mais seguro, mas caro. O Redis oferece suporte a clustering pronto para uso, portanto, ao que parece, a replicação também pode ser feita.

Estou usando a configuração de RDB padrão e salvando os instantâneos no FTP remoto. Ainda não vi uma falha que tenha causado perda de dados. Provavelmente, falha aguda de hardware ou falta de energia, mas estou hospedado em um VPS. Pouca chance de isso acontecer :)

Morten Jensen
fonte
12

Esta questão é realmente sobre sessões em tempo real e parece ter surgido em parte devido a um mal-entendido da frase 'operações de gravação atrasadas' Embora os detalhes tenham sido eventualmente revelados nos comentários, eu só queria deixar bem claro. ..

Você não terá problemas para implementar sessões em tempo real.

Redis é um armazenamento de valor-chave na memória com persistência opcional no disco. 'Operações de gravação atrasadas' referem-se a gravações no disco , não no banco de dados em geral, que existe na memória. Se você DEFINIR um par chave / valor, você pode obtê-lo imediatamente (ou seja, em tempo real). A política que você seleciona em relação à persistência (quanto você atrasa as gravações) determinará o limite superior de quantos dados podem ser perdidos em uma falha.

Jordan Dodson
fonte