Какие существуют способы масштабирования Redis

«Какие существуют способы масштабирования Redis» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Redis поддерживает как вертикальное, так и горизонтальное масштабирование. Основные подходы к горизонтальному масштабированию (увеличению количества серверов) включают:

  1. Репликация (Primary-Replica)

    • Что это: Создание копий (реплик) основного узла (primary). Все операции записи идут на primary, а затем асинхронно копируются на реплики.
    • Зачем: Масштабирование операций чтения (read scaling) и обеспечение высокой доступности (high availability). Если primary узел падает, одна из реплик может быть повышена до нового primary.
    • Ограничение: Не решает проблему масштабирования записи или нехватки памяти для хранения всего набора данных.
  2. Redis Sentinel

    • Что это: Система мониторинга и автоматического аварийного переключения (failover) для конфигураций с репликацией.
    • Зачем: Обеспечивает высокую доступность. Sentinel следит за состоянием primary узла и, в случае его отказа, автоматически выбирает и повышает реплику до нового primary, перенаправляя клиентов.
  3. Redis Cluster (Шардирование)

    • Что это: Встроенное решение для горизонтального распределения данных по нескольким узлам (шардам). Набор данных делится на 16384 хеш-слота, которые распределяются между узлами кластера.
    • Зачем: Масштабирование операций записи (write scaling) и объема хранимых данных. Позволяет хранить датасет, который не помещается в память одного сервера.
    • Пример создания кластера:
      # Создать кластер из 6 узлов (3 мастера и 3 реплики)
      redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 
      127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 
      --cluster-replicas 1
  4. Шардирование на стороне клиента

    • Что это: Логика распределения ключей по разным инстансам Redis реализуется в коде приложения.
    • Зачем: Дает полный контроль над распределением данных, но усложняет приложение и требует ручного управления при добавлении/удалении узлов.