Amazon ElastiCache


Amazon ElastiCache 는 AWS 의 완전 관리형 분산 인메모리 캐싱 서비스로 Redis 또는 Memcached 엔진을 지원한다. 인메모리 DB 의 고성능 및 낮은 지연 시간 특성을 활용하여 읽기 집약적인 워크로드에서 DB의 부하를 줄이거나 애플리케이션을 stateless 로 만드는 데 사용할 수 있다.

Use Case - DB Cache

  • 애플리케이션이 ElastiCache 에 쿼리
  • 데이터가 없으면 RDS 에서 가져와 ElastiCache 에 저장
  • 캐시는 최신 데이터만 사용되도록 무효화 전략이 필요

Use Case - User Session Store

  • 사용자가 애플리케이션 중 하나에 로그인
  • 애플리케이션이 세션 데이터를 ElastiCache 에 작성
  • 사용자가 다른 애플리케이션 인스턴스에 접속
  • 해당 인스턴스가 세션 데이터를 가져와 사용자 로그인 상태 유지

Redis vs Memcached


Redis

  • 읽기 확장 및 고가용성을 위한 Read Replica 를 추가하여 Multi-AZ 로 구성이 가능하다.
  • Master 에 장애가 발생하면 Read Replica 가 Master 로 승격되는 Auto-Failover 를 지원한다.
  • AOF 지속성을 사용한 데이터 내구성
  • Amazon S3 에 Snapshot 저장을 통한 백업 및 복원을 지원하여 데이터 영구 보존 역시 가능하다.
  • Sets 및 Sorted Sets 지원

Memcached

  • 데이터 파티셔닝(샤딩)을 위한 Multi-node
  • HA 없음
  • 비영구적
  • 백업 및 복원 없음
  • 멀티스레드 아키텍처

Patterns for ElastiCache


  • Lazy Loading
    • 모든 읽기 데이터가 캐시됨, 캐시의 데이터가 오래될 수 있음
  • Write Through
    • DB에 쓸 때 캐시에 데이터 추가 또는 업데이트 (오래된 데이터 없음)
  • Session Store
    • 캐시에 임시 세션 데이터 저장 (TTL 기능 사용)

Cache Security


  • ElastiCache 는 Redis용 IAM 인증 지원
  • ElastiCache 의 IAM 정책은 AWS API 레벨 보안에만 사용됨
  • Redis Auth
    • Redis 클러스터 생성 시 비밀번호/토큰 설정 가능
    • 캐시에 대한 추가 보안 계층 (SG 위에)
    • SSL 전송 중 암호화 지원
  • Memcached
    • SASL 기반 인증 지원

ElastiCache Redis OSS 7 Upgrade


ElastiCache 같은 Managed Service 는 EoL 이전에 버전 업그레이드를 하지 않으면 Premium 지원을 위한 추가 요금이 발생한다. 때문에 26년 1월에 표준 지원을 종료하는 Redis OSS v5 나 27년 1월에 표준 지원을 종료하는 Redis OSS v6 버전의 엔진을 사용하는 경우 미리 Redis OSS v7 으로 업그레이드해주는 것이 좋다.

공식문서에 따르면 기본적으로 ElastiCache Redis 업그레이드는 데이터 보존과 다운타임이 발생하지 않도록 설계되어있다. 하지만 혹시 모를 데이터 유실을 방지하기 위해 업그레이드가 진행되기 전에 백업 Snapshot 을 떠놓는 것이 Best Practice 다.

Upgrade

resource "aws_elasticache_replication_group" "example" {
  replication_group_id = "example"
  description          = "example description"
  node_type            = "cache.t2.micro"
  num_cache_clusters   = 2
  port                 = 6379
  subnet_group_name    = aws_elasticache_subnet_group.example.name
  security_group_ids   = [aws_security_group.example.id]
  parameter_group_name = "default.redis7"
  engine_version       = "7.1"

  transit_encryption_enabled = true
  auth_token                 = "abcdefgh1234567890"
  auth_token_update_strategy = "ROTATE"
}

ElastiCache 를 업그레이드하기 위해선 Engine Version 과 버전에 맞는 Param Group 을 준비해야 한다. Param Group 은 AWS 에서 기본으로 제공하는 default.redis7 default.redis7.cluster.on 등이 존재한다. .cluster.on 류는 ElastiCache Cluster Mode 를 활성화했을 때 사용할 수 있다.

Terraform Apply 이후 업그레이드가 바로 진행되지 않을 수 있는데, 이는 ElastiCache Maintenance Window 가 업그레이드 등 변경 가능 시간을 제약하기 때문이다. 해당 클러스터를 사용하는 클라이언트의 사용패턴에 따라 Maintenance Window 가 상이할 수 있다. Maintenance Window 가 시작되면 Redis 7 을 호스팅하는 새로운 노드들이 순차적으로 클러스터에 조인한다.

Verification

메트릭설명데이터 유실 여부 판단 포인트
aws.elasticache.curr_itemsRedis 내 전체 키 개수업그레이드 전후 값이 비슷하면 데이터 보존됨.
aws.elasticache.evictions메모리 부족으로 강제 삭제된 키 수업그레이드 직후 spike가 있으면 일부 데이터 날아갔을 가능성 있음.
aws.elasticache.cache_hits / aws.elasticache.cache_misses캐시 조회 성공/실패 횟수업그레이드 직후 miss가 급증하면 데이터 flush 의심 가능.
aws.elasticache.bytes_used_for_cache캐시에 실제 저장된 데이터 크기(byte)업그레이드 후 갑자기 줄면 캐시가 비워졌을 가능성 높음.
aws.elasticache.new_connections새로 생성된 Redis 클라이언트 연결 수업그레이드 후 spike 있으면 재연결 발생 가능 (정상적인 failover).
aws.elasticache.replication_bytes복제본과의 동기화된 데이터 양업그레이드 시 replication 이 재시작되면 증가 가능 (정상 범위).
Datadog Resources 를 활용하여 ElastiCache Redis 의 메트릭을 확인할 수 있다. 이를 통해 업그레이드 중 데이터 유실이 발생했는지 확인할 수 있다. Datadog 연동 시 위 메트릭 외에도 더 다양한 메트릭을 지원한다. 자세한 내용은 공식문서를 참조하자.

Maintenance Window 가 시작되면 Upgrade 가 진행되고 aws.elasticache.new_connectionsaws.elasticache.replication_bytes 등에 Spike 가 감지된다. Redis7 을 호스팅하는 새로운 노드가 클러스터에 조인하고 기존 클라이언트들이 재연결하는 과정에서 관측되는 지표다.

References