Партиционирование Redis
Партиционирование — это процесс разделения данных между несколькими экземплярами Redis, так что каждый экземпляр хранит только подмножество ключей.
Преимущества партиционирования
- За счёт использования суммарной памяти нескольких компьютеров это позволяет создавать базы данных большего размера.
- За счёт нескольких ядер и нескольких компьютеров это позволяет масштабировать вычислительную мощность; за счёт нескольких компьютеров и сетевых адаптеров — масштабировать пропускную способность сети.
Недостатки партиционирования
Некоторые возможности Redis плохо работают при партиционировании:
- Операции, затрагивающие несколько ключей, обычно не поддерживаются. Например, если два множества отображены на разные экземпляры Redis, вы не можете выполнить операцию пересечения этих двух множеств.
- Транзакции Redis, затрагивающие несколько ключей, нельзя использовать.
- При использовании партиционирования работа с данными сложнее; например, вам нужно обрабатывать несколько файлов RDB/AOF и создавать резервные копии файлов персистентности с нескольких экземпляров и хостов.
- Добавление или удаление ёмкости также сложно. Redis Cluster в основном поддерживает прозрачную балансировку данных при добавлении или удалении узлов во время работы, но другие системы, такие как клиентское партиционирование и прокси, не поддерживают эту функцию. Однако в этом отношении помогает техника, называемая presharding.
Типы партиционирования
В Redis есть два типа партиционирования. Предположим, есть 4 экземпляра Redis R0, R1, R2, R3 и несколько ключей, представляющих пользователей, например user:1, user:2. Для заданного ключа существуют различные способы выбрать, в каком экземпляре будет храниться ключ. То есть существуют разные системы сопоставления ключа с сервисом Redis.
Секционирование по диапазонам
Самый простой способ секционирования — секционирование по диапазонам, при котором диапазон объектов сопоставляется конкретному экземпляру Redis.
Например, пользователи с ID от 0 до 10000 сохраняются в экземпляр R0, пользователи с ID от 10001 до 20000 — в R1, и так далее.
Этот подход осуществим и применяется на практике, но его недостаток — необходимость таблицы сопоставления диапазонов экземплярам. Этой таблицей нужно управлять, а также нужны таблицы сопоставления для различных объектов; в целом для Redis это не лучший метод.
Хеш-секционирование
Другой метод секционирования — хеш-секционирование. Он работает для любого ключа и не требует формы object_name:
- Используйте хеш-функцию, чтобы преобразовать ключ в число, например с помощью хеш-функции crc32. Запуск crc32(foobar) для ключа foobar выведет целое число вроде 93024922.
- Возьмите остаток от деления этого целого числа, чтобы преобразовать его в число от 0 до 3, а затем сопоставьте это целое число одному из 4 экземпляров Redis. 93024922 % 4 = 2, что означает, что ключ foobar следует хранить в экземпляре R2. Примечание: операция взятия по модулю возвращает остаток от деления, обычно реализуется оператором % во многих языках программирования.