Redis로 세션을 저장하는 것이 얼마나 안전합니까?


94

현재 MySql을 사용하여 세션을 저장하고 있습니다. 잘 작동하지만 약간 느립니다.

Redis를 사용하라는 요청을 받았지만 Redis가 쓰기 작업을 지연 시킨다는 소식을 들었 기 때문에 좋은 생각인지 궁금합니다. 세션은 실시간이어야하므로 조금 두렵습니다.

그런 문제를 겪은 사람이 있습니까?


1
Redis는 내구성이 옵션이라고 말 했으므로 HDD에서 지속성을 선택하면 사용하는 것이 안전하다고 말하고 싶습니다. 그러나 세션 데이터의 경우-분명히 RAM에 저장합니다 (즉, 전체 시련의 내구성 부분에 대해 걱정하지 않을 것입니다). 세션 데이터를 잃어버린 경우 최악의 상황은 사용자가 로그 아웃하는 것입니다.
NB

1
예, 그러나 이것은 내 요구 사항의 일부입니다. 사용자가 로그인하지 않은 동안 일부 사용자 데이터가 세션 전반에 걸쳐 유지되는 방식 (게스트 사용자)으로 인해 사용자는 다시 로그인 할 필요가 없습니다. Redis RAM을 사용하지만 로깅 및 / 또는 백업이 활성화되어 있습니다. 일부 세션을 잃어도 괜찮습니다.
Trent

1
내 주요 관심사에 경우 사용자가 로그인을 발생하고 세션이 지연 기록, 자신이 연결됩니다 있지만 로그인하지 않은 것을, 지연된 쓰기에 관한 것입니다
트렌트

2
전자 상거래 사이트를 상상해보십시오. 세션이 손실되면 현재 카트도 손실됩니다. 끔찍하지는 않지만 사용자에게는 이상 할 수 있습니다. 게스트 사용자는 세션으로 만 식별되므로 카트를 복구 할 방법이 없습니다.
Boris Guéry 2012

1
@ BorisGuéry-동의하지 않는다는 것은 아니지만 성능을 향상시켜야한다면 무언가 잘못되었을 때 타협을 설정해야합니다. 예, 사용자가 갑자기 로그 아웃되는 것은 이상 할 수 있습니다. 물론입니다. 문제는 얼마나 자주 발생할 것으로 예상됩니까? 모든 Redis 노드가 다운되는 것이 일년에 한두 번이면 전체 클러스터를 사용할 수없는 몇 번의 격리 된 시간 동안 성능을 저하시킬 이유가 없습니다. 하지만 그것은 나뿐입니다.
NB

답변:


149

Redis는 세션 저장에 적합합니다. 모든 작업은 메모리에서 수행되므로 읽기 및 쓰기가 빠릅니다.

두 번째 측면은 세션 상태의 지속성입니다. Redis는 세션 상태를 하드 디스크에 유지하는 방법에 많은 유연성을 제공합니다. http://redis.io/topics/persistence 를 통해 자세히 알아볼 수 있지만 높은 수준의 옵션은 다음과 같습니다.

  1. 세션 손실을 감당할 수없는 경우 appendfsync always구성 파일에 설정하십시오. 이를 통해 Redis는 모든 쓰기 작업이 디스크에 저장되도록 보장합니다. 단점은 쓰기 작업이 느려진다는 것입니다.
  2. 약 1 초 분량의 데이터를 잃어도 괜찮다면 appendfsync everysec. 이것은 합리적인 데이터 보장으로 뛰어난 성능을 제공합니다.

14

기본적으로 async snapsnots 및 fsync(). 그것들은 각각 RDB와 AOF라고 불립니다. 지속성 모드에 대한 자세한 내용 은 공식 페이지를 참조하십시오 .

데몬 화 된 프로세스의 신호 처리는 예를 들어 SIGTERM을 수신 할 때 디스크에 동기화되므로 재부팅 후에도 데이터가 그대로 유지됩니다. 기본 설정 (RDB 스냅 샷)을 사용하더라도 무결성 손상이 발생하기 전에 데몬이나 OS가 충돌해야한다고 생각합니다.

AOF 설정은 서버가 수신하는 명령을 기록하는 Append Only File을 사용하고 저장된 파일에서 콜드 스타트시 처음부터 DB를 다시 생성합니다. 기본 디스크 동기화 정책은 1 초에 한 번 플러시 (IIRC)하는 것이지만 모든 명령에 대해 잠금 및 쓰기로 설정할 수 있습니다.

스냅 샷과 증분 로그를 모두 사용하면 더 안전하지만 비용이 많이 드는 증분 로그를 사용하여 장기적 으로 신경 쓰지 않는 경우 데이터를 놓치는 방식을 모두 제공하는 것으로 보입니다 . Redis는 즉시 클러스터링을 지원하므로 복제도 수행 할 수 있습니다.

기본 RDB 설정을 직접 사용하고 스냅 샷을 원격 FTP에 저장하고 있습니다. 데이터 손실을 유발하는 오류를 아직 보지 못했습니다. 심각한 하드웨어 오류 또는 정전이 발생할 가능성이 높지만 VPS에서 호스팅됩니다. 그런 일이 일어날 가능성이 희박합니다 :)


12

이 질문은 실제로 실시간 세션에 관한 것이며 부분적으로는 '지연된 쓰기 작업'이라는 문구에 대한 오해로 인해 발생한 것 같습니다. 결국 세부 사항은 댓글에서 알려졌지만, 저는 그저 매우 명확하게 만들고 싶었습니다. ..

실시간 세션을 구현하는 데 문제가 없습니다.

Redis는 디스크에 대한 선택적 지속성을 가진 메모리 내 키-값 저장소입니다. '지연된 쓰기 작업'은 일반적으로 메모리에 존재하는 데이터베이스가 아닌 디스크쓰기를 의미합니다 . 키 / 값 쌍을 설정하면 즉시 (즉, 실시간으로) 가져올 수 있습니다. 지속성과 관련하여 선택한 정책 (쓰기를 지연하는 정도)에 따라 충돌시 손실 될 수있는 데이터 양의 상한이 결정됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.