Редис Шардинг

Redis Sarding



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

Масштабируемость

Существует два распространенных подхода к масштабированию сервера: вертикальное масштабирование и горизонтальное масштабирование. Вертикальное масштабирование или масштабирование — это когда вы добавляете больше мощности и ресурсов на свой сервер, например, больше ЦП, памяти и хранилища, что является дорогостоящим. С другой стороны, горизонтальное масштабирование — это добавление нескольких узлов в существующий пул ресурсов. Это называется масштабированием. Таким образом, исходя из ваших ограничений и требований, вам решать, иметь ли один экземпляр сервера большего размера или развернуть несколько серверных узлов.

Предположим, у вас 100 ГБ ОЗУ и вам нужно хранить 200 ГБ данных. В этом случае у вас есть два варианта:







  • Масштабирование путем добавления дополнительной оперативной памяти в систему
  • Увеличение масштаба путем добавления еще одного экземпляра сервера со 100 ГБ ОЗУ.

Если вы достигли максимального предела оперативной памяти в своей инфраструктуре, идеальным подходом будет горизонтальное масштабирование. Кроме того, горизонтальное масштабирование значительно увеличит пропускную способность базы данных.





Редис Шардинг

Известно, что Redis работает в одном потоке. Таким образом, Redis не может использовать несколько ядер ЦП вашего сервера для обработки команд. Следовательно, добавление большего количества ядер ЦП не даст вам большой пропускной способности или производительности с Redis. Это не относится к разделению ваших данных между несколькими экземплярами сервера. Добавление нескольких серверов и распределение набора данных между ними позволяет параллельно обрабатывать запросы клиентов, что увеличивает пропускную способность. Кроме того, общая производительность может увеличиваться почти линейно.





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



Как выполняется шардинг — алгоритмический шардинг

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

Наиболее распространенным подходом является вычисление хеш-значения с использованием имени ключа Redis и модуля. Затем разделите его на доступные осколки Redis в системе.

HASH_SLOT = CRC16 (ключ) мод 16384

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

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

Преимущества шардинга Redis

Шардинг Redis дает несколько преимуществ вашей системе баз данных с минимальными изменениями.

Высокая пропускная способность

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

Высокая доступность

Благодаря подходу сегментирования кластер Redis может настроить архитектуру мастер-реплика, которая обеспечивает высокую доступность и надежность.

Чтение реплик

Разделение позволяет хранить точную копию данных и выполнять операции чтения через отдельные экземпляры Redis, что повышает производительность выполнения запросов на чтение.

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

Вывод

Подводя итог, шардинг Redis разделяет данные между несколькими серверами, что обеспечивает масштабирование и высокую пропускную способность для вашей базы данных. Как уже говорилось, Redis использует алгоритмическую стратегию сегментирования, чтобы направлять клиентские запросы на правильный сегмент. Это имеет некоторые недостатки, когда общее количество осколков увеличивается. Таким образом, вместо общего количества сегментов Redis использует количество хеш-слотов для расчета соответствующего сегмента. Благодаря внедрению сегментирования базы данных Redis обеспечивают высокую доступность, высокую пропускную способность и высокую производительность.