Рубрики
Uncategorized

Исследуя родис высокой доступности

Недавно я узнал себя, используя Redis для большего количества проектов, над которыми я работаю. Redis можно использовать в … Теги с Redis, Kubernetes, DevOps, DistribedSystems.

Недавно я нашел себя, используя Redis Для получения большего количества проектов, на которых я работаю. Redis можно использовать различными способами. Он обеспечивает функциональность для очереди, установленных операций, растровых изображений, потоков и намного больше. Тем не менее, большая часть моего опыта с redis была в качестве лучшего кэша. Поскольку в моем развитии становится скоплением, я подумал, что было бы хорошо освежить его операции.

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

Что такое Redis?

Redis — это открытый источник, база данных в памяти, лицензированная в рамках лицензии BSD. Он имеет встроенный репликацию, общие стратегии выселения и даже разные уровни настойчивости на диске. Redis также поддерживает модули , что позволяет легко подключить новую функциональность и взаимодействовать с нативными типами данных. Например, RedisGraph Модуль расширяет Redis, предоставляя Графическая база данных Возможности. Из-за разнообразия структур данных и его гибкости, неудивительно, что Redis стал как популярный Как у него есть.

Как redis можно развернуть?

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

Реплицирован

Самое простое развертывание Redis — реплицированная архитектура. В этом развертывании Redis имеет одну первичную точку записи, называемую «Master». Любые данные, написанные к этому первичному размножению репликам асинхронно. Диаграмма ниже изображает, как приложение может взаимодействовать с этим развертыванием.

Хотя развертывание довольно прост, есть несколько вещей, которые нам нужно иметь в виду. Во-первых, приложения должны иметь возможность отслеживать только для чтения и чтения-записи. Они могут использовать одно соединение, но, вероятно, означает, что первичные обрабатывают каждый запрос. Используя одно соединение, ваше приложение не использует реплики, которые у вас есть на месте. Во-вторых, это развертывание имеет одну точку отказа, первичный узел. Если основной узел не удается, приложения больше не могут писать данные для Redis.

Это развертывание хорошо работает для оффлайн населения. Например, может быть, у вас есть фоновая задача, которая отвечает за заполнение кеша. Между тем, ваш веб-сервис знает о репликах и активно читает из них. Должен ли основной сбой, ваш фоновый процесс может просто подождать, пока он возвращается.

Используя Sentinel.

Чтобы помочь облегчить единственный основной узел в предыдущем развертывании, Redis предоставляет Sentinel. Sentinel — это отдельный процесс, который определяет, когда данный первичный узел больше не доступен. Это делает это с помощью кворума для голосования по доступности члена. Когда член становится недоступным, Sentinel может избрать новую первичную для кластера. Диаграмма ниже изображает, как приложение может взаимодействовать с этим развертыванием.

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

Другим риском этого развертывания является потенциальным состоянием разделения мозга во время обновлений или сбоев узла. Состояние сплит-мозга происходит, когда два узла не могут прийти к соглашению. Этот случай менее вероятно, если вы управляете развертыванием Sentinel отдельно от Redis. Если вы запустите их в том же POD или на одном хозяине, вероятность этого сценария увеличивается. Чтобы проиллюстрировать, давайте рассмотрим вышеприведенный пример.

  1. Предположим, мы обновляем наш кластер и Redis-0 снято
  2. Sentinels обнаруживает, что POD больше не доступен и начнет выяснить новую первичную.
  3. Sentinel для Redis-1 голоса, что Redis-2 должен быть новым первичным.
  4. Sentinel для Redis-2 голоса, что Redis-1 должен быть новым первичным.
  5. С кворумом 2 Инстанции не могут прийти к консенсусу.
  6. Шаги 2 по 5 повторяются до тех пор, пока не достигнет кворума.

К сожалению, вот как БИТНМИ Настраивает развертывание Sentinel в их редис Хелм диаграммы. Пока разделенный мозг может происходят, они не могут быть такими же распространенными, как вы думаете. Тем не менее, это то, что вам нужно учитывать в вашем развертывании.

Redis Cluster

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

Подобно развертыванию Sentinel, приложения должны знать, что они говорят с кластером Redis. Это связано с тем, как Redis Cluster обрабатывает его кастрюлю. Клиенты несут ответственность за хеширование клавиш, чтобы определить, к какому слоту они пишут. Затем клиенты пишут в экземпляре, ответственным за связанный слот. Это позволит клиентам выполнить подмножество операций, даже в случае частичного отключения кластера.

Кластеризация с посланником

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

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

Мое развертывание

Хотя эти подходы могут работать великолепно, я часто обнаруживаю себя, желая чего-то немного разного. В идеале я хотел развертывание, которое:

  • Улучшает доступность реплицированного развертывания
  • Улучшает стабильность развертывания Sentinel
  • Поддерживает простоту реплицированного развертывания
  • Поддерживает согласованность развертывания Redis

Такое развертывание улучшит задачи и системы на основе очереди, такие как Сельдерей в Python или Машины пойти. Полезные нагрузки в этих системах имеют тенденцию быть маленькими, относительно недолгими, а/или подкреплены в другом месте. Это означает, что мы редко должны быть надо осколки данных через узлы.

Когда я представлял, как это сделать, я имел в виду свою среду выполнения. Kubernetes обеспечивает много возможностей для инженеров. Например, добавление лидерных выборов в систему относительно легко сделать в ходе. Client-Go Библиотека предоставляет предварительно построенный Ухожец упаковка. Это может автоматизировать наблюдение за Аренда для изменений и периодически пытаясь претендовать на лидерство. Это дало мне идею для коляска.

  1. Sidecar будет использовать аренду API для определения лидерства в кластере.
  2. Когда возникает выборы, Sidecar отвечает за обновление топологии кластера Redis.
    1. Каждый кодарь действует независимо, удаляя необходимость координации за пределы первоначальных выборов.
    2. Каждый Sidecar принимает подходящие шаги, чтобы обрабатывать изменение лидерства изящно.
      • Текущий лидер делает паузу пишет и ждет недавно избранного лидера догнать.
      • Вновь избранный лидер ждет синхронизации, чтобы завершить, прежде чем пытаться продвигать себя в лидера.
      • Все остальные подписчики переключаются на репликацию из нового лидера.
    3. После того, как топология кластера была обновлена, Sidecar из недавно избранных обновлений Kubernetes Конечная точка Отказ

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

Такая система можно увидеть ниже.

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

В немногих тестах я бежал, я видел время отказов от 6 до 10 секунд. Определенно все еще разрабатывая какой-то тюнинг, но все вообще, я доволен тем, как это вышло. На данный момент я собираюсь сохранить закрытый источник проекта. Если вы заинтересованы в общении через это немного больше, не стесняйтесь протянуть.

Во всяком случае, спасибо за регистрацию. Я знаю, что это было какое-то время. Я надеюсь, вы узнали что-то, пока вы были здесь. Спасибо за чтение!

Оригинал: «https://dev.to/mjpitz/exploring-redis-high-availability-3f1k»