Pipy + Redis + Sentinel = высокодоступный Redis

Pipy — это программируемый прокси-сервер с открытым исходным кодом для облаков, границ и IoT. Универсальность Pipy позволяет использовать его во множестве сценариев использования. Основная цель этой статьи — продемонстрировать реализацию Pipy в качестве балансировщика нагрузки TCP перед репликацией ведущего и ведомого (агента) Redis, чтобы обеспечить постоянную доступность соединений клиентов и приложений.

Наши цели

  • Мы хотим реализовать и достичь возможности автоматического обхода отказа в случаях, когда назначенный ведущий узел Redis перестает отвечать из-за завершения процесса, аппаратного сбоя, неполадок в сети или по каким-то неизвестным причинам, и Sentinel автоматически переключает ведущий узел на один из оставшихся узлов агентов.
  • Мы хотим, чтобы клиенты и приложения, подключающиеся к Redis, не были затронуты механизмом обхода отказа.
  • Мы хотим, чтобы весь механизм обхода отказа был полностью прозрачным и не требовал никаких изменений в конфигурации/настройках клиентов и приложений.
  • Мы хотим, чтобы все запросы на запись (Redis SET или другие настроенные пользователем команды) обрабатывались главным узлом без знания топологии клиентом и приложением.
  • Мы хотим, чтобы все наши запросы распределялись поровну между доступными узлами для лучшего использования выделенных ресурсов и высокой производительности.
  • ….

Балансировка нагрузки, проксирование TCP-соединений, обеспечение того, чтобы SET (или другие настроенные пользователем) команды Redis всегда направлялись на главный узел, проверка работоспособности, ведение журнала в консоли, запись метрик и т.д. достигаются с помощью Pipy.

Высокая доступность для развертывания Redis, включая внедрение мастера и агента, достигается путем внедрения Redis Sentinel, который непрерывно осуществляет мониторинг, уведомление и автоматическое переключение при отказе мастера.

Краткое введение в используемые технологии

  • Pipy — это программируемый прокси с открытым исходным кодом для облачных, пограничных и IoT-серверов.
  • Redis — это хранилище данных in-memory с открытым исходным кодом, признанное самым быстрым в мире. Redis используется в передовых приложениях и, как известно, улучшает такие сценарии использования, как аналитика в реальном времени, быстрые транзакции большого объема, социальные функции в приложении, управление заданиями приложения, очереди и кэширование.
  • Redis Sentinel обеспечивает высокую доступность Redis, когда не используется Redis Cluster.

Демонстрационная высокоуровневая архитектура развертывания

  • Один прокси-сервер Pipy для работы в качестве балансировщика нагрузки TCP и отслеживания того, какие серверы Redis доступны и готовы обслуживать запросы.
  • Три сервера Redis обеспечивают репликацию мастер-агента.
  • Три экземпляра Sentinel для надежного развертывания.

Установка

Для демонстрационных целей демо-код поставляется со скриптом Docker Compose для создания контейнеров.

Полный исходный код демонстрации доступен и может быть загружен с сайта https://github.com/flomesh-io/pipy-demos/tree/main/pipy-redis-sentinel.

Предварительные условия

  • Docker
  • docker-compose
  • redis-cli
  1. Клонируйте Pipy Demos Repo или скачайте демо-код с pipy-redis-sentinel.
  2. Разверните контейнеры Pipy proxy, Redis, Sentinel.

    $ docker-compose up -d
    

Тестирование

  1. Убедитесь, что все контейнеры запущены и работают:
$ docker ps

CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                 NAMES
0db7eba4f91d   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 6 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_3
e4a7b6b99074   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 6 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_2
4ec87846b1e3   naqvis/pipy-pjs:0.22.0-31   "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   6000/tcp, 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   pipy-proxy
8e81ddc5eb07   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 4 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_1
f1a533de6d41   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds   6379/tcp                                              redis-slave2
a522c208b236   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   6379/tcp                                              redis-slave1
8065dec93c3d   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   6379/tcp                                              redis-master
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Pipy прослушивает TCP порт 6379 на докер-хосте, который является стандартным портом Redis и балансирует нагрузку на 3 контейнера Redis (один Master & два Slave). Три контейнера Redis Sentinel для надежного развертывания и обеспечения высокой доступности Redis.

  1. Проверьте, что сервис Pipy направляет трафик на все узлы Redis, выполнив следующие команды. Вам не нужно указывать IP и порт хоста docker, так как Pipy открывает порт Redis по умолчанию 6379.
$ redis-cli info replication | grep role
role:master
$ redis-cli info replication | grep role
role:slave
$ redis-cli info replication | grep role
role:slave
Войти в полноэкранный режим Выйти из полноэкранного режима

Pipy поставляется с алгоритмами балансировки нагрузки, и демо-скрипт настроен на использование RoundRobinLoadBalancer, и вы можете видеть из вышеприведенного вывода, что Pipy отправляет запросы на все настроенные узлы Redis в режиме roundrobin.

  1. Теперь попробуйте выполнить еще несколько команд Redis
$ redis-cli set hello world
OK

$ redis-cli get hello
"world"

$ redis-cli set foo bar
OK
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы настроили прокси на использование алгоритмов roundrobin, но мы видим, что все запросы SET выполняются успешно. Если бы мы просто следовали алгоритму roundrobin для пересылки запросов поровну на каждый узел, то наши запросы SET, обращенные к подчиненным узлам, были бы отклонены с ошибкой, например:

(error) READONLY You can't write against a read only slave.
Вход в полноэкранный режим Выход из полноэкранного режима

Тестирование обхода отказа

  1. Давайте приостановим работу контейнера redis-master для тестирования автоматического обхода отказа
$ docker pause redis-master
Войти в полноэкранный режим Выйти из полноэкранного режима

Sentinel автоматически обнаружит, что мастер отсутствует, и выберет ведомое устройство, чтобы назначить его мастером. Pipy во время проверки работоспособности обнаружит, что ведущий узел не работает, он пометит его как нездоровый и больше не будет посылать запросы на этот узел, пока он не станет снова доступным. Pipy обнаружит новый master-узел и перешлет все команды SET на новый продвинутый master-узел.

  1. Запустите снова несколько команд Redis, чтобы проверить, можно ли получить доступ к Redis без каких-либо проблем.
$ redis-cli set abc 1234
OK

$ redis-cli get abc
"1234"
Войдите в полноэкранный режим Выход из полноэкранного режима
  1. Верните контейнер паузы, и Sentinel пометит его как ведомый узел
$ docker unpause redis-master

Войдите в полноэкранный режим Выйти из полноэкранного режима

Вот и все, теперь у вас должно быть все необходимое для настройки отказоустойчивого и высокодоступного Redis, если не используется Redis Cluster.

Тест производительности

Мы провели различные тесты с pipy, haproxy, twemproxy и одним экземпляром Redis, чтобы выяснить падение производительности при использовании прокси перед Redis.
Ниже приведены результаты тестов, проведенных на нашей виртуальной машине с 4C8G с ОС 20.04.4 LTS (Focal Fossa) ARM64, работающей на Mac M1 Max.

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

Заключение

Вы можете достичь высокой доступности Redis и максимальной защиты от любых сбоев и катастроф для репликации Redis, сочетая инфраструктурные услуги с конфигурацией программного обеспечения. При правильной настройке и проектировании инфраструктуры мы можем добиться высокой доступности для репликации Redis между ведущим и ведомым серверами, используя различные зоны доступности. Redis Sentinel отслеживает и выполняет обход отказа при репликации Redis с ведущего на ведомое устройство.

Pipy — это процессор сетевого трафика с открытым исходным кодом, чрезвычайно быстрый и легкий, который может быть использован в различных областях, начиная от пограничных маршрутизаторов, балансировки нагрузки и заканчивая проксированием (прямое/обратное), шлюзами API, статическими HTTP-серверами, сайдчейнами Service mesh и многими другими приложениями. Pipy находится в активной разработке и поддерживается постоянными коммиттерами и контрибьюторами, хотя это еще ранняя версия, она прошла боевые испытания и используется в производстве несколькими коммерческими клиентами.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *