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:
Для создания плагина в кластере и регистрации его сервиса на доступных тирах:
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);
Для включения плагина в кластере:
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 и hxlloh*llo
соответствует hllo и heeeelloh[ae]llo
соответствует hello и hallo, но не hilloh[^e]llo
соответствует hallo, hbllo, ... но не helloh[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-хэша для указанного числа xredis.status_reply(x)
— возврат статуса состояния x в виде строкиredis.error_reply
— возврат состояния x в виде строкиredis.REDIS_VERSION
— возврат текущей версии Redis в виде строки в формате Luaredis.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 ...]
Включает проверку значений указанных ключей для последующих транзакций.