Как управлять репликами и клиентами в Redis в Ubuntu 18.04 LTS

12 set 2022 5 min di lettura
Как управлять репликами и клиентами в Redis в Ubuntu 18.04 LTS
Indice dei contenuti

Введение

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. Если есть какие-либо другие связанные команды, темы или процедуры, которые вы хотели бы видеть в этом руководстве, спросите или внесите предложения в комментариях ниже.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.