레디스(Redis) 메모리 초과! 당황하지 마세요, 대처법과 정책 완벽 정리

 

레디스(Redis) 메모리가 가득 차면 어떻게 될까요?

레디스(Redis)를 사용하다 보면 '메모리가 꽉 차면 서버가 그냥 멈춰버리는 거 아닐까?' 하고 걱정될 수 있는데요.


하지만 레디스(Redis)는 메모리 한계에 도달했다고 해서 즉시 다운되거나 하지는 않습니다.

 

대신, 미리 설정된 메모리 관리 전략에 따라 상황을 처리하게 됩니다.

 

정확히 어떤 일이 벌어지는지는 여러분이 사용하고 있는 레디스(Redis)의 설정과 버전에 따라 달라질 수 있습니다.

메모리 초과 시 레디스(Redis)의 대처 방법

레디스(Redis) 메모리가 부족해지면 다음과 같은 상황들이 발생할 수 있습니다.

쓰기 작업 실패

만약 레디스(Redis)에 RDB나 AOF 같은 데이터 지속성(persistence) 설정이 되어 있지 않고 메모리 최대 한계에 도달했다면, 기본적으로는 더 이상의 쓰기(Write) 작업을 거부하고 에러(error)를 반환합니다.

 

이는 데이터의 일관성을 지키고 데이터 유실을 막기 위한 레디스(Redis)의 기본적인 보호 조치입니다.

메모리 제거(Eviction) 정책 실행

레디스(Redis)는 메모리가 가득 찼을 때를 대비한 여러 가지 '메모리 제거(Eviction) 정책'을 제공합니다.

이 정책이 설정되어 있다면, 레디스(Redis)는 설정된 정책에 따라 특정 데이터를 자동으로 삭제하여 새로운 데이터를 저장할 공간을 확보하려고 시도합니다.

데이터 지속성(Persistence) 전략 활용

만약 RDB나 AOF 같은 데이터 지속성(persistence) 설정이 되어 있다면, 레디스(Redis)는 메모리가 부족할 때 데이터를 디스크(disk)에 저장하여 메모리 공간을 확보할 수 있습니다.

이렇게 하면 데이터의 영속성을 보장하면서 계속해서 쓰기(Write) 작업을 받아들일 수 있게 됩니다.

메모리 부족 시 발생하는 문제점과 영향

메모리 부족 상태가 되면 다음과 같은 영향이 발생할 수 있습니다.

성능 저하

레디스(Redis) 메모리가 한계에 가까워지면, 데이터를 자주 제거해야 할 수 있습니다.


이 과정에서 CPU 사용량이 늘어나고, 결과적으로 레디스(Redis) 서버의 응답 시간(response time)과 처리량(throughput)에 좋지 않은 영향을 줄 수 있습니다.

데이터 유실 가능성

설정된 메모리 제거(eviction) 정책에 따라, 공간을 확보하기 위해 일부 데이터가 삭제될 수 있습니다.


이는 애플리케이션(application) 입장에서 보면 더 이상 특정 데이터에 접근할 수 없게 된다는 의미입니다.

쓰기 작업 실패 (noeviction 정책)

만약 메모리 제거(eviction) 정책이 noeviction으로 설정되어 있다면, 메모리가 가득 찼을 때 모든 쓰기(Write) 명령이 거부됩니다
이 경우, 데이터를 저장해야 하는 애플리케이션(application)이 정상적으로 작동하지 못할 수 있습니다.

레디스(Redis) 메모리 제거(Eviction) 정책 종류

레디스(Redis)는 메모리가 부족할 때 어떤 데이터를 우선적으로 제거할지 결정하는 다양한 정책을 제공하는데요.


주요 정책들을 하나씩 살펴보겠습니다.

noeviction

메모리가 가득 차도 아무 키(key)도 제거하지 않습니다.


대신, 메모리 한계에 도달하면 쓰기(Write) 명령에 대해 에러(error)를 반환합니다.
(기본값)

allkeys-random

저장된 모든 키(key) 중에서 무작위로 키(key)를 선정하여 제거합니다.

volatile-random

만료 시간(expiration time, TTL)이 설정된 키(key)들 중에서만 무작위로 키(key)를 선정하여 제거합니다.

allkeys-lru

모든 키(key)들 중에서 가장 오랫동안 사용되지 않은 키(Least Recently Used, LRU)를 우선적으로 제거합니다.


자주 접근하는 데이터를 최대한 유지하려는 전략입니다.

volatile-lru

만료 시간(TTL)이 설정된 키(key)들 중에서 가장 오랫동안 사용되지 않은 키(LRU)를 우선적으로 제거합니다

allkeys-lfu

모든 키(key)들 중에서 가장 적게 사용된 키(Least Frequently Used, LFU)를 우선적으로 제거합니다.


최근 사용 여부보다는 사용 빈도를 중요하게 생각하는 전략입니다.

volatile-lfu

만료 시간(TTL)이 설정된 키(key)들 중에서 가장 적게 사용된 키(LFU)를 우선적으로 제거합니다.

volatile-ttl

만료 시간(TTL)이 설정된 키(key)들 중에서 만료 시점이 가장 가까운 키(key)를 우선적으로 제거합니다.

메모리 부족 문제 완화 전략

레디스(Redis) 메모리 부족 문제를 예방하거나 완화하기 위한 몇 가지 전략입니다.

데이터 구조 최적화

데이터를 저장할 때 더 적은 메모리를 사용하는 자료 구조를 활용합니다.


예를 들어, 해시(Hash) 타입 대신 압축 리스트(ziplist)나 정수 집합(intset) 인코딩을 사용하도록 유도하는 것이 방법이 될 수 있습니다.

메모리 사용량 분석

정기적으로 레디스(Redis)의 메모리 분석 도구(예: MEMORY USAGE 명령어)를 사용하여 어떤 키(key)들이 메모리를 많이 차지하는지 확인하고 관리합니다

수직적 또는 수평적 확장

더 많은 메모리를 가진 서버로 업그레이드(수직적 확장)하거나, 여러 대의 레디스(Redis) 인스턴스(instance)에 데이터를 분산시키는 방식(수평적 확장, 예: 클러스터링)을 고려합니다.

모니터링 및 알림 설정

메모리 사용량을 지속적으로 모니터링하고, 메모리 한계치에 가까워지면 알림을 받을 수 있도록 시스템을 구축합니다.


이를 통해 문제가 발생하기 전에 미리 조치를 취할 수 있습니다.

결론

레디스(Redis) 메모리가 부족해지면 쓰기(Write) 작업 실패, 읽기(Read) 지연 시간 증가, 메모리 단편화, 심각할 경우 애플리케이션(application) 장애로까지 이어질 수 있습니다.


이러한 문제를 피하기 위해서는 메모리 사용량을 적절히 제한하고, 메모리 관리 전략을 최적화하는 등 적극적인 대비책을 마련하는 것이 매우 중요합니다.