0Pricing
AWS Solutions Architect · Урок

Группы репликации ElastiCache Redis и кластерный режим

Создайте группу репликации Redis для масштабирования чтения и включите кластерный режим, чтобы распределить данные между несколькими группами узлов.

«Группы репликации ElastiCache Redis и кластерный режим» — бесплатный урок AWS Solutions Architect на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AWS Solutions Architect, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AWS Solutions Architect содержит 4 уроков всего.

Обзор групп репликации Redis

Группа репликации ElastiCache — это логическая группа из одного основного узла Redis и максимум пяти реплик для чтения. Основной узел обрабатывает все операции записи; реплики получают асинхронные данные репликации от основного узла и обслуживают трафик чтения. Группы репликации обеспечивают две ключевые возможности: масштабирование чтения (распределение запросов на чтение между несколькими репликами) и высокую доступность с автоматическим переключением при сбое (назначение реплики основной, если основной узел выходит из строя). Все узлы группы репликации используют один и тот же набор данных.

# 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-group

Основная конечная точка и конечная точка для чтения

ElastiCache предоставляет для группы репликации две конечные точки DNS: основная конечная точка всегда указывает на текущий основной узел (автоматически обновляется при переключении при сбое) — используйте её для всех операций записи. Конечная точка для чтения распределяет запросы на чтение между всеми доступными репликами — используйте её для операций чтения, чтобы распределять нагрузку. Приложение должно поддерживать два пула соединений: один для основной конечной точки для операций записи и один для конечной точки для чтения. Это рекомендуемый способ организации соединений для групп репликации 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 для группы репликации ElastiCache автоматически размещает основной узел и реплики в разных AZ. Если целая AZ становится недоступной, при переключении назначается реплика из сохранившей работоспособность AZ. Вы также можете явно указать предпочтительные AZ для каждого узла при создании группы репликации с помощью параметра --preferred-cache-cluster-a-zs.

# 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-subnets

Что такое Redis Cluster Mode

Redis Cluster Mode Enabled (CME) разделяет набор данных между несколькими группами узлов (сегментами), каждая из которых содержит основной узел и максимум пять реплик. Это решение Redis для горизонтального распределения. Cluster Mode позволяет превысить объём памяти одного узла: можно создать до 500 групп узлов по 500 GB каждая, благодаря чему один кластер Redis может хранить до 500 × 500 GB = 250 TB данных. Cluster Mode также увеличивает пропускную способность записи, поскольку каждая группа узлов независимо обрабатывает записи для своего диапазона ключей.

# 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-subnets

Хеш-слоты и распределение ключей

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 shard

Режим кластера и режим без кластера

На экзамене SAA-C03 выбирайте режим без кластера, если: Ваши данные помещаются на одном узле (< ~400 GB с учётом запаса), Вам нужна простая конфигурация с основным узлом и репликами или приложение использует сложные операции с несколькими ключами (для транзакций, охватывающих несколько ключей, все ключи должны находиться в одном слоте). Выбирайте режим кластера, если: набор данных превышает объём памяти одного узла, Вам требуется горизонтальное масштабирование пропускной способности записи или Вы ожидаете дальнейший рост, который потребует перераспределения сегментов без остановки. Режим кластера поддерживает добавление сегментов без простоя (перераспределение сегментов без остановки).

# 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 расширяет репликацию Redis на несколько регионов AWS. Вы назначаете один регион основным кластером и добавляете вторичные кластеры в других регионах. Записи направляются в основной кластер, а вторичные получают асинхронную репликацию с обычной задержкой менее 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 Pub/Sub в больших масштабах

В группе репликации Redis без кластеризации сообщения публикации и подписки распределяются по всем репликам — любой подписчик на любом узле получает сообщения, опубликованные в канале. Однако в режиме кластера публикация и подписка ограничены уведомлениями пространства ключей, а публикация и подписка на основе каналов работает только в пределах одного шарда, если не используется Redis 7+ с шардированием публикации и подписки (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}')

Мониторинг задержки репликации

Отслеживайте метрику CloudWatch ReplicationLag на репликах для чтения, чтобы убедиться, что они успевают за основным узлом. Задержка более нескольких секунд указывает на узкое место на реплике (перегруженный узел, проблемы с сетью или слишком большое количество записей, которые реплика не успевает обработать). В сценариях с Global Datastore отслеживайте показатель 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) и разблокировать остальной курс AWS Solutions Architect, подпишись на CoddyKit PRO. Курс AWS Solutions Architect содержит 4 уроков всего.

Чему я научусь в уроке «Группы репликации ElastiCache Redis и кластерный режим»?

Создайте группу репликации Redis для масштабирования чтения и включите кластерный режим, чтобы распределить данные между несколькими группами узлов. Ты практикуешь AWS Solutions Architect с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AWS Solutions Architect?

Предыдущий опыт не требуется. AWS Solutions Architect на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Группы репликации ElastiCache Redis и кластерный режим»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AWS Solutions Architect?

Да. Каждый урок AWS Solutions Architect включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Redis и Memcached: выбор подходящего механизма
  2. Группы репликации ElastiCache Redis и кластерный режим
  3. Стратегии кэширования: отложенная загрузка и сквозная запись
  4. Хранение сеансов и шаблоны таблиц лидеров
← Назад к AWS Solutions Architect