제거 정책
제거 정책 (Eviction policy) (eviction-policy-2)
제거 정책(eviction policy)은 데이터베이스가 메모리 한도에 도달했을 때 어떤 일이 생길지를 결정해요. Redis가 새 데이터를 위한 공간을 만들기 위해 더 오래된 데이터를 *제거(evict)*하는 방식을 정하는 거죠. 이 페이지에서는 각 정책이 무엇을 의미하는지, 그리고 Active-Active 데이터베이스에서 어떻게 다르게 동작하는지 옆에서 설명드릴게요.
선택된 정책에 따라 더 오래된 데이터가 제거(삭제)되어 새 데이터를 위한 공간이 만들어져요. 이런 일이 생기지 않게 하려면 데이터베이스가 모든 키를 담을 수 있을 만큼 충분히 큰지 확인하세요.
클러스터형 데이터베이스에서는 각 샤드(shard)가 자신의 메모리 사용량을 추적하고, 자신의 메모리 한도에 도달하면 제거를 시작해요. 데이터가 샤드들에 고르게 분포되어 있지 않으면, 전체 데이터베이스 메모리 사용률이 설정된 한도 아래인데도 일부 샤드가 가득 차서 키를 제거하기 시작할 수 있어요.
제거 정책 목록
| 제거 정책 (Eviction Policy) | 설명 |
|---|---|
| noeviction | 메모리 한도에 도달하면 새 값이 저장되지 않음. 데이터베이스가 복제를 사용하면 이 정책은 프라이머리(primary) 데이터베이스에 적용됨 |
| allkeys-lru | 최근 사용된 키를 유지하고, 가장 오래 사용되지 않은(LRU) 키를 제거 |
| allkeys-lrm | 최근 수정된 키를 유지하고, 가장 오래 수정되지 않은(LRM) 키를 제거 |
| allkeys-lfu | 자주 사용된 키를 유지하고, 가장 덜 자주 사용된(LFU) 키를 제거 |
| allkeys-random | 키를 무작위로 제거 |
| volatile-lru | expire 필드가 true로 설정된 키 중 가장 오래 사용되지 않은 키 제거 |
| volatile-lrm | expire 필드가 true로 설정된 키 중 가장 오래 수정되지 않은 키 제거 |
| volatile-lfu | expire 필드가 true로 설정된 키 중 가장 덜 자주 사용된 키 제거 |
| volatile-random | expire 필드가 true로 설정된 키를 무작위로 제거 |
| volatile-ttl | expire 필드가 true로 설정된 키 중 남은 TTL(time-to-live) 값이 가장 짧은 키 제거 |
제거 정책 기본값 (Eviction policy defaults)
volatile-lru가 대부분의 데이터베이스의 기본 제거 정책이에요.
Active-Active 데이터베이스의 기본 정책은 noeviction이에요.
Active-Active 데이터베이스 제거 (Active-Active database eviction)
Active-Active 데이터베이스의 제거 정책 메커니즘은 참여하는 모든 클러스터에 전파(propagation)되어야 하기 때문에 단독(standalone) 데이터베이스보다 일찍 시작돼요. Active-Active 인스턴스 중 하나의 샤드가 메모리 한도의 80%에 도달하면 제거 정책이 키를 제거하기 시작합니다.
- 80% 임계값은 전체 데이터베이스 한도가 아니라 각 샤드의 메모리 한도에 적용돼요.
- 키가 제거되는 동안에도 메모리 사용량이 계속 늘면, out-of-memory 오류를 피하기 위해 제거 속도가 빨라져요.
- 과도한 제거를 피하기 위해, 내부 휴리스틱이 80% 메모리 한도에서 키가 제거되는 것을 막을 수 있어요. 그런 경우 키는 샤드 메모리가 100%에 도달했을 때만 제거돼요.
- Redis Software는 키 분포의 불균형을 수용하고 out-of-memory 오류를 피하기 위해 개별 샤드에 더 높은
maxmemory값을 할당하기도 해요.
Active-Active 인스턴스 사이에 네트워크 문제가 있으면, 메모리는 모든 인스턴스가 동기화된 상태일 때만 해제될 수 있어요. 참여 클러스터 사이에 통신이 없으면 모든 키가 제거되고 인스턴스가 out-of-memory 상태에 이를 수 있어요.
참고: Auto Tiering을 사용하는 Active-Active 데이터베이스에서는 데이터 제거 정책이 지원되지 않아요.
데이터 제거 피하기 (Avoid data eviction)
데이터 제거를 피하려면 데이터베이스가 필요한 값을 담을 만큼 충분히 큰지 확인하세요.
더 큰 데이터베이스라면 Redis Flex 또는 Auto Tiering을 고려해 보세요.
Auto Tiering은 활발히 사용되는 데이터(hot data)를 RAM에 저장하고 나머지 데이터를 플래시 메모리(SSD)에 저장해요. 이렇게 하면 가장 중요한 데이터에 가장 빠르게 접근하면서도 더 많은 데이터를 보관할 수 있어요.