Redis 데이터 퇴출(Eviction) 정책 이해하기

Redis 데이터 퇴출(Eviction) 정책 이해하기

데이터 퇴출 정책은 새 데이터가 데이터베이스의 메모리 한도를 넘어설 때 무슨 일이 일어날지 결정해요. 이 글에서는 사용할 수 있는 정책이 무엇인지, 그리고 데이터베이스별로 어떤 정책을 쓰는지 바꾸는 방법을 배워볼 거예요. 보통 이런 상황에서는 데이터베이스에 이미 추가된 데이터를 퇴출(삭제)해야 해요.

출처: Redis 공식 문서 - Data eviction

정책 목록

데이터베이스마다 다음 데이터 퇴출 정책 중 하나를 고를 수 있어요.

정책 설명
allkeys-lru 가장 최근에 사용된 키는 유지하고, 가장 오래전에 사용된(LRU) 키를 제거
allkeys-lfu 자주 사용되는 키는 유지하고, 가장 적게 사용된(LFU) 키를 제거
allkeys-random 키를 무작위로 제거
volatile-lru expire 필드가 true인 키 중에서 가장 오래전에 사용된 키를 제거 (기본값)
volatile-lfu expire 필드가 true인 키 중에서 가장 적게 사용된 키를 제거
volatile-random expire 필드가 true인 키를 무작위로 제거
volatile-ttl expire 필드가 true인 키 중에서 남은 TTL(만료까지 시간)이 가장 짧은 키를 제거
no eviction 메모리 한도에 도달하면 새 값이 저장되지 않음. 복제를 사용하면 기본(primary) 데이터베이스에 적용

데이터 퇴출 막기

데이터 퇴출을 피하려면 데이터베이스가 필요한 값을 담기에 충분히 커야 해요.

Redis Cloud는 Redis Cloud Pro의 Auto Tiering과 Redis Cloud Essentials의 Redis Flex를 지원해서, 데이터 퇴출을 막으면서도 높은 성능을 유지할 수 있어요.

Auto Tiering과 Redis Flex는 데이터베이스를 RAM과 플래시 메모리로 확장하고, "hot"(활발한) 데이터는 RAM에, "cold"(덜 활동적인) 데이터는 플래시 메모리(SSD)에 지능적으로 배치해요.

Active-Passive 복제 고려사항

Active-Passive 복제를 사용할 때 퇴출과 만료는 원본(active) 데이터베이스에서만 동작해요. 대상 데이터베이스는 Active-Passive가 활성화된 동안 데이터를 퇴출하거나 만료시키지 않아요.

Active-Passive가 활성화된 동안 대상 데이터베이스에 쓰지 마세요. 그렇게 하면 다음과 같은 문제가 생길 수 있어요.

  • 대상 데이터베이스는 로컬 쓰기를 관리하기 위해 퇴출·만료에 의존할 수 없어서, 복제 데이터와 로컬 쓰기 둘 다 처리할 충분한 메모리가 필요해요.
  • 로컬 쓰기가 원본·대상 데이터베이스 사이에 차이를 만들어, 복제된 명령이 각 데이터베이스에서 다르게 동작할 수 있어요.
  • 일관되지 않은 데이터는 복제된 명령이 오류로 실패하게 만들 수 있고, 이는 동기화 프로세스를 종료시켜 복제를 깨뜨려요.

Active-Active 복제 고려사항

Active-Active 데이터베이스의 퇴출 정책 메커니즘은 모든 리전에 전파해야 하기 때문에 단독 데이터베이스보다 일찍 작동해요. Active-Active 인스턴스 중 하나가 메모리 한도의 80%에 도달하면 퇴출 정책이 키를 퇴출하기 시작해요. 키가 퇴출되는 동안에도 메모리 사용량이 계속 오르면, OOM(Out-of-Memory) 상태를 막기 위해 퇴출 속도가 빨라져요.

더 알아보기