Elastic Cache(클러스터 활성화) 모드에서 데이터를 저장하는 일부 데이터가 누락하는 현상이 발생했다.
데이터가 누락하는 원인을 분석해보면,
Elastic Cache의 노드 타입이 cache.m4.xlarge이면 메모리는 14.28G이다.
메모리를 다 쓰게되면 eviction 정책에 따라 자동으로 데이터가 삭제되기 때문이다.
(캐시 메모리 사용 제한에 도달 할 때 캐시 엔진은 새로운 쓰기위한 공간을 확보하기 위해 항목을 제거 할 수있다.)
# 예약된 메모리
예약된 메모리는 비데이터 사용을 위해 구분된 메모리입니다.
백업 또는 장애 조치를 수행할 때 클러스터의 데이터가 .rdb 파일에 작성되는 동안 Redis에서는 사용 가능한 메모리를 사용하여 클러스터에 쓰기 작업을 기록합니다.
# 예약된 메모리를 관리하기 위한 파라미터
기본 파라미터 그룹을 사용하여 Redis 클러스터 또는 복제 그룹을 생성할 때 메모리 관리 파라미터는 reserved-memory-percent입니다.
이 경우 노드 maxmemory 값의 25%가 비데이터 용도로 예약됩니다.
따라서 cache.m4.xlarge이면 메모리는 14.28G이지만,
25%(약 3.6G)가 비데이터 용도로 예약되므로 실제로는 약 10.7G만 사용가능하다.
redis-cli에서 아래 명령으로 maxmemory 확인이 가능하다.
$ redis-cli -h {REDIS_ENDPOINT} -c info | grep maxmemory
maxmemory:11496376320
maxmemory_human:10.71G
maxmemory_policy:volatile-lru ---> 최대 메모리 사용량에 도달했을 때 키에 대한 제거 정책
# Eviction Policy
noeviction : 메모리 제한에 도달하고 클라이언트가 사용할 메모리를 더 많이 만들 수있는 명령 (대부분의 쓰기 명령이지만 DEL 및 몇 가지 예외) 을 실행하려고하면 오류를 반환합니다 .
allkeys-lru : 추가 된 새 데이터를위한 공간을 확보하기 위해 LRU (최근에 덜 사용 된) 키를 먼저 제거하여 키를 제거합니다.
volatile-lru : 추가 된 새 데이터를위한 공간을 확보하기 위해 LRU (최근에 덜 사용 된) 키를 먼저 제거하지만 만료가 설정된 키 중 하나만 제거하여 키를 제거합니다 .
allkeys-random : 추가 된 새 데이터를위한 공간을 만들기 위해 무작위로 키를 제거합니다.
volatile-random : 추가 된 새 데이터를위한 공간을 만들기 위해 무작위로 키를 제거하지만 만료가 설정된 키만 제거합니다 .
volatile-ttl : 만료가 설정된 키를 제거하고 새로운 데이터를 추가 할 공간을 확보하기 위해 TTL (짧은 사용 시간)이있는 키를 먼저 제거합니다.
# Eviction 통계 모니터링
$ redis-cli -h {REDIS_ENDPOINT} -c info
maxmemory_policy:volatile-lru
used_memory_peak_human:10.73G
maxmemory_human:10.71G
evicted_keys:9801898 --> 제거된 키의 개수
Cloud Watch의 경우 Evictions(Count)로 조회 가능하다.
# 참고사이트
https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/mem-ug/CacheMetrics.Memcached.html
https://redis.io/topics/lru-cache
https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/redis-memory-management.html
'AWS' 카테고리의 다른 글
아마존 AWS 가입 및 EC2 생성 (0) | 2018.05.15 |
---|