ElastiCache Redis 복제 그룹 및 클러스터 모드
읽기 확장을 위한 Redis 복제 그룹을 구축하고, 클러스터 모드를 활성화해 여러 노드 그룹에 데이터를 샤딩합니다.
ElastiCache Redis 복제 그룹 및 클러스터 모드은(는) CoddyKit의 무료 AWS Solutions Architect 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AWS Solutions Architect 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AWS Solutions Architect 강의에는 총 4개의 강의가 포함되어 있습니다.
Redis 복제 그룹 개요
ElastiCache Replication Group은 하나의 기본 Redis 노드와 최대 5개의 읽기 복제본을 논리적으로 묶은 그룹입니다. 기본 노드는 모든 쓰기 작업을 처리하고, 복제본은 기본 노드에서 비동기 복제를 받아 읽기 트래픽을 처리합니다. 복제 그룹은 두 가지 핵심 기능을 제공합니다. 읽기 확장(여러 복제본에 읽기 요청 분산)과 자동 장애 조치를 통한 고가용성(기본 노드에 장애가 발생하면 복제본을 기본 노드로 승격)입니다. 복제 그룹의 모든 노드는 동일한 데이터 세트를 공유합니다.
# Create a replication group with 1 primary and 2 read replicas
aws elasticache create-replication-group \
--replication-group-id web-cache \
--replication-group-description 'Web application cache' \
--num-cache-clusters 3 \
--cache-node-type cache.r7g.large \
--engine redis \
--engine-version '7.0' \
--automatic-failover-enabled \
--multi-az-enabled \
--cache-subnet-group-name my-multi-az-subnet-groupPrimary Endpoint와 Reader Endpoint 비교
ElastiCache는 복제 그룹에 두 개의 DNS 엔드포인트를 제공합니다. Primary Endpoint는 항상 현재 기본 노드를 가리키며 장애 조치 중 자동으로 업데이트됩니다. 모든 쓰기 작업에는 이를 사용하세요. Reader Endpoint는 사용 가능한 모든 복제본에 읽기 요청을 분산합니다. 부하를 분산하려면 읽기 작업에 이를 사용하세요. 애플리케이션에서는 두 개의 연결 풀을 유지해야 합니다. 하나는 쓰기를 위한 Primary Endpoint용이고 다른 하나는 읽기를 위한 Reader Endpoint용입니다. 이는 ElastiCache Redis 복제 그룹에 권장되는 연결 패턴입니다.
# Get primary and reader endpoints
aws elasticache describe-replication-groups \
--replication-group-id web-cache \
--query 'ReplicationGroups[].{
Primary:NodeGroups[].PrimaryEndpoint.Address,
Reader:ReaderEndpoint.Address
}'
# Application connection pattern:
# write_client = redis.Redis(host='primary-endpoint', port=6379)
# read_client = redis.Redis(host='reader-endpoint', port=6379)자동 장애 조치 과정
기본 노드에 장애가 발생하면 ElastiCache가 상태 확인을 통해 몇 초 이내에 이를 감지하고, 자동 장애 조치가 읽기 복제본 중 하나를 선택하여 기본 노드로 승격합니다. 승격 과정은 다음과 같습니다. (1) 선택한 복제본이 기본 노드로 승격됩니다. (2) 기본 엔드포인트의 DNS 레코드가 새 기본 노드를 가리키도록 업데이트됩니다(TTL 약 1초). (3) 이전 기본 노드가 새 복제본으로 교체됩니다. 전체 장애 조치 시간은 일반적으로 30~60초입니다. 기본 엔드포인트 DNS를 사용하는 애플리케이션은 DNS가 전파되면 자동으로 다시 연결되므로 하드코딩된 IP 주소가 필요하지 않습니다.
# Test failover manually (triggers primary failover)
aws elasticache test-failover \
--replication-group-id web-cache \
--node-group-id 0001
# Monitor failover events
aws elasticache describe-events \
--source-identifier web-cache \
--source-type replication-group \
--duration 60 \
--query 'Events[].{Time:Date,Message:Message}'Multi-AZ 복제본 배치
최대의 복원력을 확보하려면 여러 가용 영역에 복제본을 분산 배치하세요. 복제 그룹에서 Multi-AZ를 Enable하면 ElastiCache가 기본 노드와 복제본을 서로 다른 AZ에 자동으로 배치합니다. AZ 전체가 오프라인이 되면 장애 조치가 정상적으로 운영 중인 AZ의 복제본을 승격합니다. 복제 그룹을 생성할 때 --preferred-cache-cluster-a-zs 옵션을 사용하여 각 노드에 선호하는 AZ를 명시적으로 지정할 수도 있습니다.
# Create replication group with explicit AZ placement
aws elasticache create-replication-group \
--replication-group-id ha-redis \
--replication-group-description 'Multi-AZ Redis' \
--num-cache-clusters 3 \
--cache-node-type cache.r7g.xlarge \
--engine redis \
--automatic-failover-enabled \
--multi-az-enabled \
--preferred-cache-cluster-a-zs us-east-1a us-east-1b us-east-1c \
--cache-subnet-group-name multi-az-subnetsRedis Cluster Mode란 무엇인가요?
Redis Cluster Mode Enabled (CME)는 여러 노드 그룹(샤드)에 데이터 세트를 분할하며, 각 노드 그룹에는 기본 노드 하나와 최대 5개의 복제본이 포함됩니다. 이는 Redis의 수평 샤딩 솔루션입니다. Cluster Mode를 사용하면 단일 노드의 메모리 한계를 넘어설 수 있습니다. 최대 500개의 노드 그룹을 사용할 수 있고 각 그룹의 용량이 500 GB이므로, 단일 Redis 클러스터에 최대 500 × 500 GB = 250 TB의 데이터를 저장할 수 있습니다. 또한 각 노드 그룹이 해당 키 범위의 쓰기를 독립적으로 처리하므로 쓰기 처리량도 배가됩니다.
# Create a Redis Cluster Mode Enabled replication group
# with 3 shards, each with 1 primary and 2 replicas
aws elasticache create-replication-group \
--replication-group-id clustered-redis \
--replication-group-description 'Cluster mode: 3 shards x 3 nodes' \
--num-node-groups 3 \
--replicas-per-node-group 2 \
--cache-node-type cache.r7g.large \
--engine redis \
--automatic-failover-enabled \
--multi-az-enabled \
--cache-subnet-group-name multi-az-subnetsHash 슬롯과 키 분배
Redis Cluster Mode는 키 공간을 16,384개의 해시 슬롯으로 나눕니다. 각 노드 그룹은 연속된 해시 슬롯 범위를 소유합니다. 키를 쓸 때 Redis는 CRC16(key) % 16384를 계산하여 해시 슬롯과 해당 키를 담당하는 노드 그룹을 결정합니다. 애플리케이션은 슬롯 맵을 알고 각 명령을 올바른 노드로 라우팅하는 클러스터 인식 Redis 클라이언트(예: redis-py-cluster 또는 클러스터 모드의 Jedis)를 사용해야 합니다. 표준 클라이언트가 키를 잘못된 샤드로 보내면 MOVED 리디렉션 오류를 반환합니다.
# Python cluster-aware client example
# pip install redis[hiredis]
# from redis.cluster import RedisCluster
# cluster_client = RedisCluster(
# host='clustered-redis.abc123.clustercfg.use1.cache.amazonaws.com',
# port=6379,
# decode_responses=True
# )
# The client automatically resolves slot-to-node mapping
# cluster_client.set('user:1', 'Alice') # routes to correct shard
# cluster_client.get('user:1') # routes to correct shardCluster Mode와 Non-Cluster Mode 비교
SAA-C03 시험에서는 다음과 같은 경우 non-cluster mode를 선택하세요. 데이터가 단일 노드에 들어가고(여유 공간을 제외하면 약 400 GB 미만), 단순한 기본 노드/복제본 구성이 필요하거나, 애플리케이션에서 복잡한 다중 키 작업을 사용하는 경우입니다(여러 키에 걸친 트랜잭션을 수행하려면 모든 키가 동일한 슬롯에 있어야 함). 다음과 같은 경우에는 cluster mode를 선택하세요. 데이터 세트가 단일 노드의 메모리를 초과하거나, 쓰기 처리량의 수평 확장이 필요하거나, 향후 온라인 리샤딩이 필요할 정도로 성장할 것으로 예상되는 경우입니다. Cluster mode에서는 중단 없이 샤드를 추가할 수 있습니다(온라인 리샤딩).
# Scale out a cluster-mode Redis by adding shards
aws elasticache modify-replication-group-shard-configuration \
--replication-group-id clustered-redis \
--node-group-count 5 \
--apply-immediately \
--resharding-configuration \
NodeGroupId=0004,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c \
NodeGroupId=0005,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c
# No downtime — slots are migrated incrementally리전 간 복제를 위한 Global Datastore
ElastiCache Global Datastore는 여러 AWS 리전에 걸쳐 Redis 복제를 확장합니다. 한 리전을 기본 클러스터로 지정하고 다른 리전에 보조 클러스터를 추가합니다. 쓰기는 기본 클러스터로 전달되고, 보조 클러스터에는 일반적으로 1초 미만의 지연으로 비동기 복제가 수행됩니다. 보조 클러스터는 매우 낮은 지연 시간으로 로컬 읽기를 처리할 수 있습니다. Global Datastore를 사용하면 여러 대륙의 사용자가 가장 가까운 리전에서 데이터를 읽는 글로벌 애플리케이션과, 기본 리전에 장애가 발생했을 때 보조 클러스터를 기본 클러스터로 승격할 수 있는 리전 간 DR을 구현할 수 있습니다.
# Create a Global Datastore (adds a secondary region to an existing cluster)
aws elasticache create-global-replication-group \
--global-replication-group-id-suffix my-global-cache \
--primary-replication-group-id prod-redis
# Add a secondary cluster in another region
aws elasticache create-replication-group \
--replication-group-id prod-redis-eu \
--replication-group-description 'EU secondary' \
--global-replication-group-id ldgnf-my-global-cache \
--region eu-west-1대규모 Redis 게시/구독
클러스터링되지 않은 Redis 복제 그룹에서는 게시/구독 메시지가 모든 복제본에 분산됩니다. 즉, 어떤 노드에 있는 구독자라도 채널에 게시된 메시지를 받습니다. 하지만 클러스터 모드에서는 게시/구독이 키스페이스 알림으로 제한되며, Redis 7+ with Pub/Sub sharding을 사용하지 않는 한 채널 기반 게시/구독은 단일 샤드 내에서만 작동합니다(SSUBSCRIBE / SPUBLISH는 샤드를 인식하는 게시/구독에 사용됩니다). 이는 클러스터 모드에서 대규모 게시/구독을 설계할 때 중요한 제한 사항입니다.
# Keyspace notification (fires when a key expires)
# Enable in parameter group: notify-keyspace-events Ex
# Subscriber in Python:
# pubsub = redis_client.pubsub()
# pubsub.psubscribe('__keyevent@0__:expired')
# for message in pubsub.listen():
# if message['type'] == 'pmessage':
# expired_key = message['data']
# print(f'Key expired: {expired_key}')복제 지연 모니터링
읽기 복제본의 ReplicationLag CloudWatch 지표를 모니터링하여 기본 클러스터의 변경 사항을 제대로 따라가고 있는지 확인합니다. 지연이 몇 초를 초과하면 복제본에 병목 현상이 있음을 나타냅니다(과부하된 노드, 네트워크 문제 또는 복제본이 처리하기에 너무 많은 쓰기). 글로벌 데이터 저장소 시나리오에서는 GlobalDatastoreReplicationLag를 모니터링합니다. 복제 지연이 높으면 읽기 복제본이 오래된 데이터를 반환할 수 있으므로, 엄격한 범위 내에서 최종적 일관성을 기대하는 애플리케이션에서는 특히 중요합니다.
# Monitor replication lag for all replicas
aws cloudwatch get-metric-statistics \
--namespace AWS/ElastiCache \
--metric-name ReplicationLag \
--dimensions Name=ReplicationGroupId,Value=web-cache \
--statistic Maximum \
--period 60 \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
# Alert if ReplicationLag > 10 seconds복제 그룹 확장
수직 확장(노드 유형 변경) 또는 수평 확장(복제본 추가 또는 제거)을 수행할 수 있습니다. 노드 유형을 변경하려면 modify-replication-group 호출이 필요하며, 변경 사항을 즉시 적용하면 짧은 장애 조치가 발생합니다. 이때 기본 노드가 새 유형의 노드로 교체됩니다. 복제본 추가는 온라인으로 수행되며 중단 시간이 없습니다. 비클러스터 모드에서 클러스터 모드로 확장할 때는 새 클러스터 모드 그룹을 만들고 데이터를 마이그레이션해야 합니다. 클러스터 모드와 비클러스터 모드 간에는 기존 그룹을 직접 변환할 수 없습니다.
# Scale up node type with maintenance window
aws elasticache modify-replication-group \
--replication-group-id web-cache \
--cache-node-type cache.r7g.xlarge \
--apply-immediately false
# Add a read replica
aws elasticache increase-replica-count \
--replication-group-id web-cache \
--new-replica-count 4 \
--apply-immediately빠른 확인
이 단원에서 다룬 AWS Solutions Architect (SAA-C03) 개념을 이해했는지 확인해 보세요.
단원 요약
이 단원에서는 다음을 배웠습니다. 복제 그룹은 복제본을 통해 읽기 확장을 제공하고, 기본 엔드포인트와 읽기 엔드포인트를 사용한 자동 장애 조치를 통해 고가용성을 제공합니다. 클러스터 모드는 데이터를 최대 500개의 노드 그룹에 걸쳐 분할하고 16,384개의 해시 슬롯을 사용하여 단일 노드의 메모리를 넘어 수평 확장합니다. 또한 Global Datastore는 리전 간에 데이터를 복제하여 전 세계에서 지연 시간이 짧은 읽기와 리전 간 DR을 제공합니다. 다음으로는 지연 로딩과 쓰기 관통 방식의 캐싱 전략을 살펴보겠습니다.
자주 묻는 질문
“ElastiCache Redis 복제 그룹 및 클러스터 모드” 강의는 무료인가요?
네 — “ElastiCache Redis 복제 그룹 및 클러스터 모드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AWS Solutions Architect 강의 전체를 잠금 해제할 수 있습니다. AWS Solutions Architect 강의에는 총 4개의 강의가 포함되어 있습니다.
“ElastiCache Redis 복제 그룹 및 클러스터 모드”에서 뭘 배우나요?
읽기 확장을 위한 Redis 복제 그룹을 구축하고, 클러스터 모드를 활성화해 여러 노드 그룹에 데이터를 샤딩합니다. 브라우저에서 직접 실행하는 실습 코드로 AWS Solutions Architect을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AWS Solutions Architect을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AWS Solutions Architect은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“ElastiCache Redis 복제 그룹 및 클러스터 모드” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AWS Solutions Architect 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AWS Solutions Architect 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Redis와 Memcached 비교: 적합한 엔진 선택
- ElastiCache Redis 복제 그룹 및 클러스터 모드
- 캐싱 전략: 지연 로딩 및 쓰기 관통
- 세션 스토리지 및 순위표 패턴