Перейти к содержанию

Radix

В данном разделе приведены сведения о Radix, плагине для СУБД Picodata.

Picodata Enterprise

Функциональность плагина доступна только в коммерческой версии Picodata.

Общие сведения

Radix — реализация Redis на базе Picodata, предназначенная для замены существующих инсталляций Redis.

Плагин Radix состоит из одноименного сервиса (radix), реализующего Redis на базе СУБД Picodata. Каждый экземпляр Radix открывает еще один порт для подключения в дополнение к уже открытым.

При использовании Picodata c плагином Radix нет необходимости в отдельной инфраструктуре Redis Sentinel, так как каждый узел Picodata выполняет роль прокси ко всем данным Redis.

Установка

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

Установка плагина Radix, в целом, соответствует общей процедуре установки плагинов в Picodata, но имеет ряд особенностей.

Процедура установки включает:

  • установку адреса, который будет слушать Radix (например, export RADIX_ADDR=0.0.0.0:7379). Эта настройка также доступна для инвентарного файла Ansible (см. ниже). Если в одном пространстве имен (например, на одном хосте) запущено несколько инстансов Picodata, то нужно задать для них отличающиеся значения RADIX_ADDR.
  • установку у тиров, на которые предполагается развернуть плагин, 16384 бакетов. См. описание bucket_count и default_bucket_count.
  • запуск инстанса Picodata с поддержкой плагинов (параметр --share-dir)
  • распаковку архива Radix в директорию, указанную на предыдущем шаге
  • подключение к административной консоли инстанса
  • выполнение SQL-команд для регистрации плагина, привязки его сервиса к тиру, выполнения миграции, включения плагина в кластере

Подключение плагина

Для подключение плагина последовательно выполните следующие SQL-команды в административной консоли Picodata:

Для создания плагина в кластере и регистрации его сервиса на доступных тирах:

В примере использованы два тира: `default` и `extra`
CREATE PLUGIN radix 0.7.0;
ALTER PLUGIN radix 0.7.0 ADD SERVICE radix TO TIER default;
ALTER PLUGIN radix 0.7.0 ADD SERVICE radix TO TIER extra;

Для настройки миграций задайте значения для 16 параметров (по числу баз данных в Radix):

ALTER PLUGIN radix 0.7.0 SET migration_context.tier_0='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_1='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_2='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_3='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_4='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_5='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_6='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_7='default';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_8='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_9='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_10='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_11='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_12='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_13='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_14='extra';
ALTER PLUGIN radix 0.7.0 SET migration_context.tier_15='extra';

Для выполнения миграции:

ALTER PLUGIN radix MIGRATE TO 0.7.0 OPTION(TIMEOUT=300);

Для включения плагина в кластере:

Убедитесь, что задан адрес, который будет слушать Radix
ALTER PLUGIN radix 0.7.0 ENABLE OPTION(TIMEOUT=30);

Чтобы убедиться в том, что плагин успешно добавлен и запущен, выполните запрос:

SELECT * FROM _pico_plugin;

В строке, соответствующей плагину Radix, в колонке enabled должно быть значение true.

Настройка

Для настройки плагина используйте файл конфигурации, который можно применить к плагину с помощью Picodata Pike или инвентарного файла Ansible.

Пример файла конфигурации:

addr: 0.0.0.0:7301 # адрес, который будет слушать Radix
clients:           # ограничения клиентских соединений
    max_clients: 10000
    max_input_buffer_size: 1073741824
    max_output_buffer_size: 1073741824
cluster_mode: true # какой флаг отдавать в команде `info cluster`

Для изменения доступны следующие параметры:

addr

Адрес, по которому Radix откроет сокет и будет его слушать.

Имейте ввиду, что данные параметры одинаковы для всех узлов Picodata, на которых развернут Radix. Следовательно, если у вас процессы не изолированы каждый в своем сетевом пространстве имен (т.е. не используется Docker или K8S), то вам надо отдельно для каждого узла прописать переменную окружения RADIX_ADDR для того, чтобы не было конфликтов по портам.

clients

max_clients

Максимальное количество клиентов, которые могут подключиться к одному узлу Radix. При достижении максимального числа max_clients новые соединения будут отклоняться, пока количество клиентов не станет снова меньше max_clients. Отклоненные соединения увеличивают счетчик метрики rejected_connections (пока доступна только через INFO STATS).

max_input_buffer_size

Максимальный размер входящего буфера. Если данный параметр у соединения будет превышен, то соединение будет закрыто. Закрытые по этой причине соединения увеличивают счетчик метрики client_query_buffer_limit_disconnections (пока доступна только через INFO STATS).

max_output_buffer_size

Максимальный размер исходящего буфера. Если данный параметр у соединения будет превышен, то соединение будет закрыто. Закрытые по этой причине соединения увеличивают счетчик метрики client_output_buffer_limit_disconnections (пока доступна только через INFO STATS).

Использование

В консоли для общения с Redis используется клиентская программа redis-cli. Для подключения к инстансу Picodata по протоколу Redis используйте адрес, заданный ранее в переменной RADIX_ADDR:

redis-cli -p 7379

Поддерживаемые команды

Управление кластером

cluster getkeysinslot

CLUSTER GETKEYSINSLOT slot count

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

cluster keyslot

CLUSTER KEYSLOT key

Позволяет узнать, к какому хэш-слоту относится указанный в команде ключ.

cluster myid

CLUSTER MYID

Возвращает идентификатор текущего узла кластера (INSTANCE UUID).

cluster myshardid

CLUSTER MYSHARDID

Возвращает идентификатор текущего репликасета, в который входит текущий узел кластера (REPLICASET UUID).

cluster nodes

CLUSTER NODES

Возвращает информацию о текущем составе и конфигурации узлов кластера, включая номера бакетов, относящихся к узлам.

cluster replicas

CLUSTER REPLICAS node-id

Возвращает состав реплицированных узлов (т.е. состав репликасета)

cluster shards

CLUSTER SHARDS

Возвращает подробную информацию о шардах кластера.

cluster slots

CLUSTER SLOTS

Возвращает информацию о соответствии слотов инстансам кластера.

ping

PING [message]

Возвращает PONG, если аргумент не указан, в противном случае возвращает строкой аргумент, который пришел. Эта команда полезна для:

  • проверки того, живо ли еще соединение
  • проверки способности сервера обслуживать данные — ошибка возвращается, если это не так (например, при загрузке из постоянного хранилища или обращении к устаревшей реплике)
  • измерения задержки

Управление соединениями

select

SELECT index

Получение логической базы данных Redis с указанным нулевым числовым индексом. Новые соединения всегда используют базу данных 0.

Общие команды

dbsize

DBSIZE

Возвращает количество ключей в базе данных

del

DEL key [key ...]

Удаляет указанные ключи. Несуществующие ключи игнорируются.

exists

EXISTS key [key ...]

Проверяет, существует ли указанный ключ key и возвращает число совпадений. Например, запрос EXISTS somekey somekey вернет 2.

expire

EXPIRE key seconds [NX | XX | GT | LT]

Устанавливает срок жизни (таймаут) для ключа key в секундах (TTL, time to live). По истечении таймаута ключ будет автоматически удален. В терминологии Redis ключ с установленным тайм-аутом часто называют волатильным.

Тайм-аут будет сброшен только командами, которые удаляют или перезаписывают содержимое ключа, включая DEL, SET и GET/SET. Это означает, что все операции, которые концептуально изменяют значение, хранящееся в ключе, не заменяя его новым, оставляют таймаут нетронутым.

expireat

EXPIREAT key unix-time-seconds [NX | XX | GT | LT]

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIRE, но вместо оставшегося числа секунд (TTL, time to live) использует абсолютное время Unix timestamp — число секунд, прошедших с 01.01.1970. Если максимальное число секунд превышено (т.е. дата отсчета находится ранее 01.01.1970), то ключ будет автоматически удален.

Дополнительные параметры EXPIREAT:

  • NX — установить срок жизни только если он не был ранее установлен
  • XX — установить срок жизни только если ключ уже имеет ранее установленный срок
  • GT — установить срок жизни только если он превышает ранее установленный срок
  • LT — установить срок жизни только если он меньше ранее установленного срока

expiretime

EXPIRETIME key

Возвращает срок жизни (таймаут) ключа key в секундах согласно формату Unix timestamp.

keys

KEYS pattern

Возвращает все ключи, соответствующие шаблону.

Поддерживаются шаблоны в стиле glob:

  • h?llo соответствует hello, hallo и hxllo
  • h*llo соответствует hllo и heeeello
  • h[ae]llo соответствует hello и hallo, но не hillo
  • h[^e]llo соответствует hallo, hbllo, ... но не hello
  • h[a-b]llo соответствует hallo и hbllo

persist

PERSIST key

Удаляет существующий таймаут для ключа key, превращая его из непостоянного (ключ с установленным сроком действия) в постоянный (ключ, срок действия которого никогда не истечет, поскольку таймаут для него не установлен).

pexpire

PEXPIRE key milliseconds [NX | XX | GT | LT]

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIRE, но в миллисекундах.

pexpireat

PEXPIREAT key unix-time-milliseconds [NX | XX | GT | LT]

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIREAT, но в миллисекундах.

pexpiretime

PEXPIRETIME key

Возвращает срок жизни (таймаут) ключа key подобно EXPIRETIME, но в миллисекундах.

pttl

PTTL key

Возвращает оставшееся время жизни ключа key подобно TTL, но в миллисекундах.

scan

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

Команда SCAN используется для инкрементного итерационного просмотра коллекции элементов в выбранной в данный момент базе данных Redis.

ttl

TTL key

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

Команда возвращает -2, если ключ не существует.

Команда возвращает -1, если ключ существует, но не имеет связанного с ним истечения срока действия.

type

TYPE key

Возвращает строковое представление типа значения, хранящегося по адресу ключа key. Могут быть возвращены следующие типы:

  • string
  • list
  • set
  • zset
  • hash
  • stream

Хэш-команды

hdel

HDEL key field [field ...]

Удаляет указанные поля из хэша, хранящегося по адресу ключа key. Указанные поля, которые не существуют в этом хэше, игнорируются. Удаляет хэш, если в нем не осталось полей. Если key не существует, он рассматривается как пустой хэш, и эта команда возвращает 0.

hexists

HEXISTS key field

Возвращает, является ли поле field существующим полем в хэше, хранящемся по адресу ключа key.

hget

HGET key field

Возвращает значение, связанное с полем field в хэше, хранящемся по адресу ключа key.

hgetall

HGETALL key

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

hincrby

HINCRBY key field increment

Увеличивает число, хранящееся в поле field, в хэше, хранящемся в ключе key, на инкремент. Если ключ не существует, создается новый ключ, содержащий хэш. Если поле не существует, то перед выполнением операции его значение устанавливается в 0.

Диапазон значений, поддерживаемых HINCRBY, ограничен 64-битными знаковыми целыми числами.

hkeys

HKEYS key

Возвращает все имена полей в хэше, хранящемся по адресу ключа key.

hlen

HLEN key

Возвращает количество полей, содержащихся в хэше, хранящемся по адресу ключа key.

hscan

HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES]

Работает подобно SCAN, но с некоторым отличием: HSCAN выполняет итерацию полей типа Hash и связанных с ними значений.

hset

HSET key field value [field value ...]

Устанавливает указанные поля в соответствующие им значения в хэше, хранящемся по адресу ключа key.

Эта команда перезаписывает значения указанных полей, которые существуют в хэше. Если ключ не существует, создается новый ключ, содержащий хэш.

hvals

HVALS key

Возвращает значения всех полей в хэше, хранящиеся по адресу ключа key.

Команды для строк

get

GET key

Получает значение ключа key. Если ключ не существует, возвращается специальное значение nil. Если значение, хранящееся в ключе, не является строкой, возвращается ошибка, поскольку GET работает только со строковыми значениями.

getrange

GETRANGE key start end

Возвращает подстроку из значения, хранящегося по указанному ключу. Границы подстроки определяют аргументами start и end.

incr

INCR key

Увеличивает значение, хранящееся по указанному ключу, на 1. Если указанный ключ не существует, то его значение принимается за 0.

incrby

INCRBY key increment

Увеличивает значение, хранящееся по указанному ключу, на величину increment. Если указанный ключ не существует, то его значение принимается за 0.

incrbyfloat

INCRBYFLOAT key increment

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

psetex

PSETEX key milliseconds value

Устанавливает значение и срок жизни (таймаут) для ключа key подобно SETEX, но в миллисекундах.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.7.0 SET radix.redis_compatibility = '{ "enabled_deprecated_commands": ["psetex" ] }';

set

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
  EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

Сохраняет строковое значение в ключе. Если ключ уже содержит значение, оно будет перезаписано, независимо от его типа. Любое предыдущее ограничение таймаута, связанное с ключом, отменяется при успешном выполнении операции SET.

Параметры:

  • EX — установка указанного времени истечения срока действия в секундах (целое положительное число)
  • PX — установка указанного времени истечения в миллисекундах (целое положительное число)
  • EXAT — установка указанного времени Unix, в которое истекает срок действия ключа, в секундах (целое положительное число)
  • PXAT — установка указанного времени Unix, по истечении которого срок действия ключа истечет, в миллисекундах (целое положительное число)
  • NX — установка значение ключа только в том случае, если он еще не существует
  • XX — установка значение ключа только в том случае, если он уже существует
  • KEEPTTL — сохранить время жизни, связанное с ключом
  • GET — возвращает старую строку, хранящуюся по адресу ключа, или nil, если ключ не существовал. Возвращается ошибка и SET прерывается, если значение, хранящееся по адресу ключа key, не является строкой.

setex

SETEX key seconds value

Устанавливает для ключа key значение value и срок жизни (таймаут) в секундах. Аналогичный результат достигается так:

SET key value EX seconds
Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.7.0 SET radix.redis_compatibility = '{ "enabled_deprecated_commands": ["setex" ] }';

Установка некорректного значения вернет ошибку.

setnx

SETNX key value

Устанавливает для ключа key значение value только если такого ключа ранее не было.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.7.0 SET radix.redis_compatibility = '{ "enabled_deprecated_commands": ["setnx" ] }';

strlen

STRLEN key

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

Команды для скриптов

Radix поддерживает следующие команды для работы с Lua-скриптами:

eval

EVAL script numkeys [key [key ...]] [arg [arg ...]]

Вызывает Lua-скрипт. Первый аргумент — исходный код Lua-скрипта (script). Следующий за ним аргумент — количество передаваемых ключей (numkeys) и далее сами ключи и их аргументы.

Пример:

> EVAL "return ARGV[1]" 0 hello
"hello"

Поддерживаемые скриптовые функции для EVAL:

  • redis.call(command)— вызов команды Redis и вывод ее результата (при его наличии)
  • redis.pcall(command) — аналог redis.call(), но с гарантированным возвратом ответа, что удобно для анализа ошибок команд
  • redis.log(level, message) — запись в журнал инстанса сообщения с указанием уровня важности. Например, redis.log(redis.LOG_WARNING, 'Something is terribly wrong')
  • redis.sha1hex(x) — возврат шестнадцатеричного SHA1-хэша для указанного числа x
  • redis.status_reply(x) — возврат статуса состояния x в виде строки
  • redis.error_reply — возврат состояния x в виде строки
  • redis.REDIS_VERSION — возврат текущей версии Redis в виде строки в формате Lua
  • redis.REDIS_VERSION_NUM— возврат текущей версии Redis в виде номера

evalro

EVAL_RO script numkeys [key [key ...]] [arg [arg ...]]

Вызывает Lua-скрипт аналогично eval, но в режиме "только чтение", т.е. беез модификации данных БД.

evalsha

EVALSHA sha1 numkeys [key [key ...]] [arg [arg ...]]

Вызывает Lua-скрипт аналогично eval, но в качестве аргумента принимает не сам скрипт, а его SHA1-хэш из кэша скриптов.

evalsharo

EVALSHA_RO sha1 numkeys [key [key ...]] [arg [arg ...]]

Вызывает Lua-скрипт аналогично evalsha, но в режиме "только чтение", т.е. беез модификации данных БД.

script exists

SCRIPT EXISTS sha1 [sha1 ...]

Возвращает информацию о существовании скрипта с указанным хэшем SHA1 в кэше скриптов.

script load

SCRIPT LOAD script

Загружает скрипт в кэш скриптов. Работает идемпотентно (т.е. подразумевая, что такой скрипт уже есть в хранилище).

Команды для транзакций

exec

EXEC

Исполняет все команды в очереди в виде единой транзакции.

discard

DISCARD

Удаляет все команды из очереди исполнения

multi

MULTI

Обозначает момент блокировки транзакции. Последующие команды будут исполняться одна за другой при помощи exec.

unwatch

UNWATCH key [key ...]

Удаляет все ключи из списка наблюдения watch.

watch

WATCH key [key ...]

Включает проверку значений указанных ключей для последующих транзакций.