Введение
Redis — это хранилище данных «ключ-значение» в памяти с открытым исходным кодом. Одной из наиболее востребованных функций является поддержка репликации: любой сервер Redis может реплицировать свои данные на любое количество реплик, что обеспечивает высокую масштабируемость чтения и сильную избыточность данных. Кроме того, Redis позволяет множеству клиентов (до 10 000 по умолчанию) подключаться и взаимодействовать с данными, что делает его хорошим выбором в случаях, когда многим пользователям требуется доступ к одному и тому же набору данных.
В этом руководстве рассматриваются команды, используемые для управления клиентами и репликами Redis.
Предпосылки
Настройка среды Redis в Ubuntu 18.04:
Управление репликацией
Одной из самых отличительных особенностей Redis является встроенная репликация. При использовании репликации Redis создает точные копии основного экземпляра. Эти вторичные экземпляры повторно подключаются к первичному всякий раз, когда соединения теряются, и всегда стремятся оставаться точной копией первичного.
Если вы не уверены, является ли экземпляр Redis, к которому вы сейчас подключены, основным экземпляром или репликой, вы можете проверить это, выполнив команду role
:
role
Эта команда вернет либо master
(основной), либо slave
(дополнительный), либо потенциально sentinel
при использовании Redis Sentinel.
Чтобы назначить экземпляр Redis репликой другого экземпляра, выполните команду replicaof
. Эта команда принимает в качестве аргумента имя хоста, IP-адрес или порт ожидаемого основного сервера:
replicaof hostname_o_indirizzo_ip porta
Если сервер уже был репликой другого основного сервера, он прекратит репликацию старого сервера и немедленно начнет синхронизацию с новым. Он также отбросит старый набор данных.
Чтобы сделать реплику основной, выполните следующую команду replicaof
:
replicaof no one
Это предотвратит репликацию экземпляра основного сервера, но не удалит набор данных, который он уже реплицировал. Этот синтаксис полезен в случаях, когда исходный первичный сервер дает сбой. После запуска replicaof no one
на неисправной первичной реплике старую реплику можно использовать в качестве новой первичной и иметь свои собственные реплики в качестве отказоустойчивых.
Примечаниеslaveof
Управление клиентами
Клиент — это любая машина или программное обеспечение, которое подключается к серверу для доступа к службе. Redis поставляется с несколькими командами, которые помогают отслеживать клиентские подключения и управлять ими.
Команда client list
возвращает набор удобочитаемой информации о текущих клиентских подключениях:
client list
"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
"
Вот что означает каждое из этих полей:
id
: уникальный 64-битный идентификатор клиента.name
: имя клиентского соединения, как определено предыдущейclient setname
addr
: адрес и порт, с которого подключается клиентfd
: файловый дескриптор, соответствующий сокету, к которому подключается клиент.age
: Общая продолжительность клиентского соединения в секундах.flags
: набор из одного или нескольких односимвольных флагов, которые предоставляют более подробные сведения о клиенте; см. документацию по командеclient list
для более подробной информацииdb
: идентификационный номер текущей базы данных, к которой подключен клиент (может быть от0
до15
)sub
: количество каналов, на которые подписан клиентpsub
: количество подписок, соответствующих модели клиента.mutli
: количество команд, которые клиент поставил в очередь в транзакции (отображает-1
, если клиент не инициировал транзакцию, или0
, если он только инициировал транзакцию и не ставил в очередь никаких команд)qbuf
: длина буфера запросов клиента,0
означает, что у него нет ожидающих запросов.qbuf-free
: количество свободного места в буфере запросов клиента,0
означает, что буфер запросов заполненobl
: длина выходного буфера клиентаoll
: Длина списка вывода клиента, где ответы ставятся в очередь, когда буфер заполнен.omem
: память, используемая выходным буфером клиента.events
: события файлового дескриптора клиента, они могут быть «доступными дляr
»,w
«доступными для записи» или обоимиcmd
: последняя команда, выполненная клиентом
Установка имен клиентов полезна для отладки утечек соединения в любом приложении, использующем Redis. Каждое новое соединение начинается без назначенного имени, но имя client setname
может использоваться для создания имени для текущего соединения клиента. Длина имен клиентов не ограничена, хотя Redis обычно ограничивает длину строк до 512 МБ. Обратите внимание, однако, что имена клиентов не могут содержать пробелы:
client setname elaine
Чтобы получить имя клиентского соединения, используйте команду client getname
:
client getname
"elaine"
Чтобы получить идентификатор подключения клиента, используйте команду client id
:
client id
(integer) "19492"
Идентификаторы клиентов Redis никогда не повторяются и являются монотонно возрастающими. Это означает, что если один клиент имеет больший идентификатор, чем другой, он был установлен позже.
Блокировать клиентов и закрывать клиентские соединения
Системы репликации обычно описываются как синхронные или асинхронные. При синхронной репликации каждый раз, когда клиент добавляет или изменяет данные, он должен получить тип подтверждения от определенного количества реплик, чтобы изменение было зарегистрировано как зафиксированное. Это помогает предотвратить конфликты данных между узлами, но приводит к задержке, поскольку клиенту приходится ждать, чтобы выполнить другую операцию, пока он не получит ответ от определенного количества реплик.
Однако при асинхронной репликации клиент видит подтверждение завершения операции, как только данные записываются в локальную память. Однако может быть задержка между этим и тем, когда реплики фактически записывают данные. Если одна из реплик выйдет из строя до того, как она сможет записать изменение, эта запись будет потеряна навсегда. Следовательно, хотя асинхронная репликация позволяет клиентам продолжать выполнение операций без задержки, вызванной ожиданием реплик, она может привести к конфликтам данных между узлами и может потребовать дополнительной работы со стороны администратора базы данных для разрешения этих конфликтов.
Благодаря своей ориентации на производительность и низкую задержку Redis по умолчанию реализует асинхронную репликацию. Однако синхронную репликацию можно имитировать с помощью команды wait
. wait
блокирует текущее клиентское соединение на указанный период времени (в миллисекундах), пока все предыдущие команды записи не будут успешно переданы и приняты указанным количеством реплик. Эта команда использует следующий синтаксис:
wait number_of_replicas number_of_milliseconds
Например, если вы хотите заблокировать подключение клиента до тех пор, пока все предыдущие записи не будут зарегистрированы как минимум 3 репликами в течение 30-миллисекундного тайм-аута, синтаксис wait
должен выглядеть следующим образом:
wait 3 30
Команда wait
возвращает целое число, представляющее количество реплик, распознавших команды записи, хотя не все реплики это делают:
2
Чтобы разблокировать клиентское соединение, которое ранее было заблокировано, из команд wait
, brpop
или xread
вы можете запустить команду client unblock
со следующим синтаксисом:
client unblock client_id
Чтобы временно приостановить работу всех клиентов, подключенных в данный момент к серверу Redis, вы можете использовать команду client pause
полезно в тех случаях, когда вам нужно внести изменения в конфигурацию Redis контролируемым образом. Например, если вы продвигаете одну из своих реплик в качестве основного экземпляра, вы можете заранее приостановить работу всех клиентов, чтобы вы могли повысить реплику и подключить клиентов к ней в качестве нового основного экземпляра без потери каких-либо операций записи в процессе.
Команда client pause
предлагает вам указать время (в миллисекундах), на которое вы хотите приостановить работу клиентов. В следующем примере все клиенты приостанавливаются на одну секунду:
client pause 1000
Синтаксис client kill
позволяет закрыть одно соединение или набор определенных соединений на основе различных фильтров. Синтаксис выглядит следующим образом:
client kill filter_1 value_1... filter_n value_n
В Redis версии 2.8.12 и более поздних доступны следующие фильтры:
addr
- закрыть клиентское соединение с указанного IP-адреса и портаclient-id
: закрывает клиентское соединение на основе его уникального поля ID.type
: закрыть любого клиента данного типа, который может бытьnormal
,master
,slave
илиpubsub
skipme
: Варианты значений для этого фильтра:yes
иno
: Если указаноno
, клиент, вызывающий командуclient kill
, не будет игнорироваться и будет завершен, если к нему будут применены другие фильтры. Если указаноyes
, клиент, выполняющий команду, будет проигнорирован, и команда kill не повлияет на клиента.skipme
по умолчанию всегдаyes
Вывод
В этом руководстве подробно описан набор команд, используемых для управления клиентами и репликами Redis. Если есть какие-либо другие связанные команды, темы или процедуры, которые вы хотели бы видеть в этом руководстве, спросите или внесите предложения в комментариях ниже.