Redis를 이용해서 Tomcat의 Session Clustering을 구성한 고객에서 문제가 발생하였다. 한달에 한번씩 OOM Killer에 인해 Redis가 죽는일이 발생하였다.
해당 원인을 분석하기위해서 Redis의 memory관련 config를 공부하게 되었고 해당 문제를 해결할 수 있었다.
원인으로 판단 되었던 것은 maxmemory가 0 (default)으로 되어있어 memory가 조절되지 않았고 session 값들이 삭제되지 않고 남아 memory를 잡아 먹었던 것이 문제였다.
■ Redis 메모리 운영
- In-memory 데이터 저장 관리
- maxmemory 값을 이용하여 Redis가 사용할수있는 Memory 조정 가능
- 사용자의 모든 데이터를 메모리에 저장해서 관리할수 없다. - 이러한 문제 개선을 위해 LRU / LFU 알고르즘을 제공한다. ( maxmemory-policy 로 설정 가능 ) ( LRU: 가장 오랫동안 사용되지 않은 페이지 교체 / LFU : 참조된 횟수가 가장 적은 페이지 )
■ Maxmemory-policy
* noeviction : 캐시를 지우지 않는 정책이다. 메모리가 MAXMEMORY 이상을 사용하게 되면, 에러를 내뱉는다.
* allkeys-lru : LRU 알고리즘을 기반으로 키를 삭제한다. * allkey-random : 랜덤하게 키를 삭제한다. * allkeys-lfu : REDIS 4.0에서 추가된 정책이다. 가장 적게 사용된 키가 삭제된다
* volatile-lru : EXPIRE SET 안에 있는 키를 LRU 알고리즘을 기반으로 키를 삭제한다. * volatile-random : EXPIRE SET 안에 있는 키들을 랜덤하게 삭제한다. * volatile-lfu : REDIS 4.0에서 추가된 정책이다. EXPIRE SET 안에 있는 키 중 가장 적게 사용된 키가 삭제된다. * volatile-ttl : EXPIRE SET 안에 있는 키들을 TTL이 짧은 순으로 삭제한다.
■ Redis Maxmemory 100mb / maxmemory-policy volatile-lru TEST