O Redis é um armazenamento de dados open-source de chave-valor na memória. Um dos seus recursos mais procurados é o suporte à replicação: qualquer servidor Redis pode replicar seus dados para qualquer número de réplicas, permitindo alta escalabilidade de leitura e forte redundância de dados. Além disso, o Redis foi projetado para permitir que muitos clientes (até 10000, por padrão) se conectem e interajam com os dados, tornando-o uma boa opção para casos em que muitos usuários precisam acessar o mesmo dataset ou conjunto de dados.
Este tutorial aborda os comandos usados para gerenciar clientes e réplicas Redis.
Este guia foi escrito como uma consulta rápida com exemplos independentes. Recomendamos que você pule para qualquer seção que seja relevante para a tarefa que você está tentando concluir.
Os comandos mostrados neste guia foram testados em um servidor Ubuntu 18.04 executando a versão do Redis 4.0.9. Para configurar um ambiente semelhante, você pode seguir o Passo 1 do nosso guia Como Instalar e Proteger o Redis no Ubuntu 18.04. Vamos demonstrar como esses comandos se comportam executando-os com redis-cli
, a interface de linha de comando do Redis. Observe que se você estiver usando uma interface Redis diferente — Redli, por exemplo — a saída exata de certos comandos pode ser diferente.
Alternativamente, você pode provisionar uma instância de banco de dados Redis gerenciada para testar esses comandos, mas observe que, dependendo do nível de controle permitido pelo seu provedor de banco de dados, alguns comandos neste guia podem não funcionar como descrito. Para provisionar um banco de dados gerenciado na DigitalOcean, siga nossa documentação do produto Managed Databases. Em seguida, você deve instalar o Redli ou [configurar um túnel TLS](https://www.digitalocean.com/community/tutorials/how-to-connect-to-managed-redis-over-tls-with-stunnel-and-redis- cli) para conectar-se ao banco de dados gerenciado via TLS.
Nota: O projeto Redis usa os termos “master” e “slave” em sua documentação e em vários comandos para identificar diferentes funções na replicação, embora os colaboradores do projeto estejam tomando medidas para alterar essa linguagem nos casos onde isso não cause problemas de compatibilidade. A DigitalOcean geralmente prefere usar os termos alternativos “primary” e “replica”.
Este guia assumirá o padrão “primary” e “replica” sempre que possível, mas observe que existem algumas circunstâncias em que os termos “master” e “slave” inevitavelmente aparecem.
Um dos recursos que mais se destaca no Redis é sua replicação embutida. Ao usar a replicação, o Redis cria cópias exatas da instância primária. Essas instâncias secundárias se reconectam à primária sempre que suas conexões quebram e sempre procurarão permanecer como uma cópia exata da primária.
Se você não tiver certeza se a instância do Redis à qual você está conectado atualmente é uma instância primária ou uma réplica, verifique com o comando role
:
- role
Este comando retornará master
ou slave
ou, potencialmente, sentinel
se você estiver usando Redis Sentinel.
Para designar uma instância do Redis como uma réplica de outra instância em tempo real, execute o comando replicaof
. Este comando usa o nome do host ou o endereço IP do servidor primário pretendido e a porta como argumentos:
- replicaof hostname_ou_IP porta
Se o servidor já era uma réplica de outro primário, ele interromperá a replicação do servidor antigo e começará a sincronizar imediatamente com o novo. Ele também descartará o dataset antigo.
Para promover uma réplica de volta para ser primária, execute o seguinte comando replicaof
:
- replicaof no one
Isso impedirá a instância de replicar o servidor primário, mas não descartará o dataset que já foi replicado. Essa sintaxe é útil nos casos em que o primário original falha. Depois de executar replicaof no one
em uma réplica do primário com falha, a réplica anterior pode ser usada como o novo primário e ter suas próprias réplicas como um mecanismo de proteção a falhas.
Nota: Antes da versão 5.0.0, o Redis incluía uma versão deste comando chamada slaveof
.
Um cliente é qualquer máquina ou software que se conecta a um servidor para acessar um serviço. O Redis vem com vários comandos que ajudam a rastrear e gerenciar conexões de clientes.
O comando client list
retorna um conjunto de informações legíveis sobre as conexões atuais de cliente:
- client list
Output"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
"
Aqui está o que cada um desses campos significa:
id
: um ID de cliente exclusivo de 64 bitsname
: o nome da conexão do cliente, conforme definido por um comando anterior client setname
addr
: o endereço e a porta a partir da qual o cliente está se conectandofd
: o descritor de arquivo que corresponde ao soquete no qual o cliente está se conectandoage
: a duração total da conexão do cliente, em segundosflags
: um conjunto de uma ou mais flags de caractere simples que fornecem detalhes mais granulares sobre os clientes; veja a documentação do comando client list
para mais detalhesdb
: o número atual do ID do banco de dados ao qual o cliente está conectado (pode ser de 0
a 15
)sub
:o número de canais aos quais o cliente está inscritopsub
: o número de subscrições correspondentes ao padrão do clientemutli
: o número de comandos que o cliente enfileirou em uma transação (mostrará -1
se o cliente não iniciou uma transação ou 0
se apenas iniciou uma transação e não colocou nenhum comando na fila)qbuf
:o tamanho do buffer de consulta do cliente, com “0” significando que não há consultas pendentesqbuf-free
: a quantidade de espaço livre no buffer de consulta do cliente, com “0” significando que o buffer de consulta está cheioobl
: o comprimento do buffer de saída do clienteoll
: o comprimento da lista de saída do cliente, onde as respostas são colocadas na fila quando o buffer está cheioomem
: a memória usada pelo buffer de saída do clienteevents
: eventos do descritor de arquivo do cliente, eles podem ser r
para “legível”, w
para “gravável” ou amboscmd
: o último comando executado pelo clienteDefinir nomes de clientes é útil para debugar vazamentos de conexão em qualquer aplicativo que esteja usando o Redis. Toda nova conexão é iniciada sem um nome atribuído, mas client setname
pode ser usado para criar um para a conexão atual do cliente. Não há limite para o tamanho dos nomes dos clientes, embora o Redis normalmente limite os comprimentos de string de caracteres para 512 MB. Observe, porém, que os nomes dos clientes não podem incluir espaços:
- client setname elaine
Para obter o nome de uma conexão de cliente, use o comando client getname
:
- client getname
Output"elaine"
Para buscar o ID de conexão de um cliente, use o comando client id
:
- client id
Output(integer) "19492"
Os IDs de clientes Redis nunca são repetidos e são monotonicamente incrementais. Isso significa que, se um cliente tiver um ID maior que outro, então ele foi estabelecido posteriormente.
Os sistemas de replicação são normalmente descritos como sendo síncronos ou assíncronos. Na replicação síncrona, sempre que um cliente adiciona ou altera dados, ele deve receber algum tipo de reconhecimento de um certo número de réplicas para que a alteração seja registrada como confirmada. Isso ajuda a impedir que os nodes tenham conflitos de dados, mas tem um custo de latência, já que o cliente deve esperar para executar outra operação até receber uma resposta de um certo número de réplicas.
Na replicação assíncrona, por outro lado, o cliente vê uma confirmação de que a operação é concluída assim que os dados são gravados no armazenamento local. No entanto, pode haver um atraso entre isso e quando as réplicas realmente gravam os dados. Se uma das réplicas falhar antes de poder gravar a alteração, essa gravação será perdida para sempre. Portanto, embora a replicação assíncrona permita que os clientes continuem executando operações sem a latência causada pela espera das réplicas, isso pode levar a conflitos de dados entre nodes e pode exigir trabalho extra por parte do administrador do banco de dados para resolver esses conflitos.
Devido ao seu foco no desempenho e na baixa latência, o Redis implementa a replicação assíncrona por padrão. No entanto, você pode simular a replicação síncrona com o comando wait
. O wait
bloqueia a conexão do cliente atual por um período de tempo especificado (em milissegundos) até que todos os comandos de gravação anteriores sejam transferidos e aceitos com sucesso por um número especificado de réplicas. Este comando usa a seguinte sintaxe:
- wait número_de_réplicas número_de_milisegundos
Por exemplo, se você deseja bloquear a sua conexão de cliente até que todas as gravações anteriores sejam registradas por pelo menos três réplicas dentro de um tempo limite de 30 milissegundos, sua sintaxe wait
se parecerá com esta:
- wait 3 30
O comando wait
retorna um número inteiro que representa o número de réplicas que reconheceram os comandos de gravação, mesmo que nem todas as réplicas o façam:
Output2
Para desbloquear uma conexão de cliente que foi bloqueada anteriormente, seja de um comando wait
, brpop
ou xread
, você pode executar um comando client unblock
com a seguinte sintaxe:
- client unblock client_id
Para suspender temporariamente todos os clientes atualmente conectados ao servidor Redis, você pode usar o comando client pause
. Isso é útil nos casos em que você precisa fazer alterações na configuração do Redis de maneira controlada. Por exemplo, se você estiver promovendo uma de suas réplicas como a instância primária, poderá pausar todos os clientes com antecedência para promover a réplica e fazer com que os clientes se conectem a ela como o novo primário sem perder nenhuma operação de gravação no processo.
O comando client pause
exige que você especifique a quantidade de tempo (em milissegundos) que deseja suspender os clientes. O exemplo a seguir suspenderá todos os clientes por um segundo:
- client pause 1000
A sintaxe do client kill
permite que você feche uma única conexão ou um conjunto de conexões específicas com base em vários filtros diferentes. A sintaxe é assim:
- client kill filtro_1 valor_1 ... filtro_n valor_n
Nas versões do Redis 2.8.12 e posteriores, os seguintes filtros estão disponíveis:
addr
: permite fechar uma conexão de cliente a partir de um endereço IP e porta especificadosclient-id
: permite fechar uma conexão de cliente com base em seu campo de ID exclusivotype
: fecha todo cliente de um determinado tipo, que pode ser normal
, master
, slave
ou pubsub
skipme
: as opções de valor para este filtro são yes
e no
:
no
for especificado, o cliente que chama o comando client kill
não será ignorado e será eliminado se os outros filtros se aplicarem a eleyes
for especificado, o cliente executando o comando será ignorado e o comando kill não terá efeito no cliente. skipme
é sempre yes
por padrãoEste guia detalha vários comandos usados para gerenciar clientes e réplicas Redis. Se houver outros comandos, argumentos ou procedimentos relacionados que você gostaria de ver descritos neste guia, peça ou faça sugestões nos comentários abaixo.
Para obter mais informações sobre comandos Redis, consulte nossa série de tutoriais sobre Como gerenciar um banco de dados Redis.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.