Redis Sentinel-alta disponibilidade: tudo o que você precisa saber de DEV para PROD: Guia Completo

o que o termo ‘Redis’ realmente significa?

significa Servidor de dicionário remoto.Está bem! Há uma abundância de artigos Redis diferentes por aí, mas eu queria compartilhar minha experiência como desenvolvedor com Redis, criando um “tudo em um artigo apropriado” cobrindo o material mais essencial e importante que é necessário e útil para um desenvolvedor ou um engenheiro devops para construir um cluster Redis altamente disponível com Sentinel.

Então, vamos começar…

Redis, que é uma fonte aberta na memória de dados estrutura de armazenamento, é muito popular para a seleção entre os desenvolvedores utilizados para fins de cache, como um message broker e também usado principalmente como um NoSQL Valor-Chave de banco de dados para diferentes casos de uso.

neste post, eu vou discutir especificamente e demo sobre Redis junto com a replicação mestre/escravo, alta disponibilidade (Redis Sentinel), falha automática , alguns níveis de produção otimizando dicas e aspectos de monitoramento. Além disso, juntamente com estes tópicos, vou mencionar as questões e os erros que enfrentei durante a implementação do Redis Sentinel com o Ubuntu. A seguir mostra a versão do SO e detalhes da versão do Redis.

OS version: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Redis Version: 4.0.9

além disso, eu quero destacar que a documentação do Redis é muito informativa e é ‘the go to place’ Se você precisar de mais esclarecimentos sobre o Redis.

Moving forward to Redis basics; Redis is a in-memory database, simply which means Redis runs on RAM. Você também precisa saber que o Redis suporta várias estruturas de dados, tais como strings, hashs, listas, sets, Sets ordenados com range queries, bitmaps. Além disso, ele também suporta operações atômicas como, adicionando a uma string, aumentando o valor em um hash, empurrando um elemento para uma lista e etc.

Well, Let’s get things started with Redis High Availability.

Redis sentinel é a solução de alta disponibilidade oferecida pelo Redis. Em caso de falha no seu aglomerado Redis, Sentinel irá automaticamente detectar o ponto de falha e trazer o aglomerado de volta ao modo estável sem qualquer intervenção humana.O que realmente acontece dentro do Redis Sentinel ?Sentinel sempre verifica os casos de mestres e escravos no aglomerado Redis, verificando se eles funcionam como esperado. Se sentinel detectar uma falha no nó mestre em um determinado aglomerado, Sentinel iniciará um processo de failover. Como resultado, Sentinel escolherá uma instância escrava e promoverá-la-á a mestre. Em última análise, as outras instâncias de escravos remanescentes serão automaticamente reconfiguradas para usar a nova instância mestre.

Sentinel atua como um provedor de configuração ou uma fonte de autoridade para a descoberta de serviços de clientes.

o que significa isso ? Simplesmente, os clientes da aplicação conectam-se aos Sentinels e Sentinels fornecem-lhes o mais recente endereço mestre Redis.

além disso, Sentinel é um sistema distribuído robusto, onde vários sentinelas precisam concordar sobre o fato de que um determinado mestre não está mais disponível. Então só o processo de failover inicia um novo nó mestre. Este Acordo Sentinela é feito de acordo com o valor de quórum.O que é quórum ?

o valor do quórum é o número de sentinelas que precisam concordar sobre o fato do Mestre não ser alcançável. No entanto, o quórum é usado apenas para detectar a falha. A fim de realmente realizar uma falha, um dos Sentinelas precisa ser eleito líder para a falha e ser autorizado a prosseguir. Isso só acontece com o voto da maioria dos processos Sentinel.Vamos sujar as mãos com Redis Sentinel.

vamos manter a configuração básica com 3 instâncias do servidor.

por Favor, consulte o diagrama acima, que ilustra a 3 instância de servidor de configuração básica. Em primeiro lugar, certifique-se de que suas instâncias Ubuntu estão atualizadas com dependências de compilação relevantes. Às vezes, também podes precisar do jemalloc. A seguir mostra os passos para instalar o Redis nas instâncias do seu servidor.

sudo apt-get update 
sudo apt-get install build-essential tcl
sudo apt-get install libjemalloc-dev (Optional)curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install

Agora no redis diretório, você deve ser capaz de ver ambos os redis.conf e sentinel.ficheiros de configuração conf.

Antes de executar o Redis vamos necessário fazer algumas configurações básicas para cima e executar um Redis cluster. A seguir estão os endereços IP desta configuração.

10.52.209.46 (Initial Master Node)
10.52.209.47 (Initial Slave Node)
10.52.209.49 (Initial Slave Node)

porta padrão para o servidor Redis é 6379 e Sentinel é 26379. Por isso, certifique-se que abre este porto com,

sudo ufw allow 6379
sudo ufw allow 26379

as configurações Redis (ambas em redis.conf e sentinel.conf) nos servidores acima devem ser configurados da seguinte forma.

Para a configuração básica configurações acima será o suficiente, mas para o nível de produção, por favor, considere as dicas mencionadas na parte final deste post. A única diferença em redis.arquivos conf em 3 servidores é que, todos os escravos devem ter a seguinte configuração. 10.52.209.46 é o endereço IP principal.

slaveof 10.52.209.46 6379

Slav of tells Redis cluster to make this particular server instance as a SLAVE instance of the given MASTER node (10.52.209.46).

em Sentinela.conf, após a configuração notificar Sentinelas para iniciar a monitorização do conjunto com as seguintes configurações iniciais. Posteriormente, esta configuração de configuração poderá ser automaticamente actualizada em conformidade.

sentinel monitor mymaster 10.52.209.46 6379 2
(This tells sentinel to monitor the master node. And the last argument which is 2 is the quorum value)

além disso, Sentinela.conf inclui também os seguintes valores de configuração.

sentinel down-after-milliseconds mymaster 5000
(Means server will unresponsive for 5 seconds before being classified as +down and consequently activating a +vote to elect a new master node.)sentinel failover-timeout mymaster 10000
(Specifies the failover timeout in milliseconds.)

Okie Dokie! Agora … vamos repetir.

existem muitas maneiras de rodar Redis. Nesta demonstração, vou seguir o comando.

(Go to src folder.)
cd src/ && redis-server ../redis.conf &
cd src/ && redis-server ../sentinel.conf — sentinel &(Or else you can simply use cd utils && ./install_server.sh.)

depois disso, pode simplesmente verificar os processos Redis através do comando ps-ef | grep redis. Cada instância do servidor deve executar um processo Redis e um processo Sentinel. Se tudo vai para o plano, deve haver 2 processos funcionando como segue.

conectar-se com o Redis cliente através de um dos seguintes comandos e testar se o Redis é um trabalho muito bem.Impressionante! Agora tens o Redis a funcionar. Vamos concentrar-nos na replicação mestre/escravo.

replicação de Mestre/Escravo

agora, se verificar os redis.log (que está localizado no lugar que definimos no redis.conf) de cada instância, você pode ver a sincronização Mestre-Escravo ocorreu.

Master node-redis.registo

nó Escravo — redis.registo

a Verificação de Status de Replicação

Você pode verificar as informações de replicação através de informações de comando de replicação no Redis CLI bem. Sob o atributo role, ele menciona se esse nó em particular é um mestre ou um escravo (Caixa Amarela).além disso, no nó mestre, ele mostra os detalhes de todos os escravos conectados. (caixa verde)

agora vamos examinar o Sentinela.o registo indica. (que está localizado no lugar que definimos no Sentinela.conf)

Além disso, se você verificar o sentinela.ficheiro conf, poderá ver que o ficheiro conf é actualizado automaticamente com as últimas configurações, incluindo os valores sentinel known-slave e sentinel known-sentinel known-sentinel.

Legal! Agora vamos criar um valor de amostra em todos os nós.

127.0.0.1:6739> set demokey "Amila"

Como você pode ver no diagrama acima, os ESCRAVOS são SOMENTE de LEITURA, portanto, você só pode gravar dados Mestre. Uma vez que Redis se reproduz assíncronamente com todos os escravos restantes, você pode recuperar o valor inserido de qualquer Redis escravos usando a mesma chave dada. Além disso via,KEYS* você pode listar todas as chaves inseridas. Acima do diagrama descreve claramente o que acabamos de falar.

agora vamos verificar como Redis Sentinel falha automática funciona.

Redis Sentinel Automatic Failover

Okiee! Vamos simular um cenário de falha automática. A fim de simular um cenário de falha, você pode simplesmente parar o servidor Redis ou matar o processo Redis na instância mestre. Até você pode dormir o processo Redis também. Podes escolher o que quiseres.

kill -9 <process id>
or
redis-cli -p 6379 DEBUG sleep 30
or
redis-cli -p 6379 DEBUG SEGFAULT

Como ilustrado no diagrama acima, em um cenário de failover, se o nó MESTRE falhar, em seguida, os 2 restantes Sentinelas vai determinar a activação pós-falha e se está de acordo (Desde quórum valor é 2 ), em seguida, um novo MESTRE vão ser eleitos os 2 restantes nós.

a seguir mostra a cauda de log para este cenário de failover.

redis.registo de nós de escravos.

sentinela.registo de nós Escravos

Agora vamos verificar o status de replicação através de informações de comando de replicação.

elaborando ainda Mais o log cauda,

Cada Sentinela detecta o mestre é para baixo, com um +sdown > evento. (+sdown significa que a instância especificada está agora subjetivamente em baixo estado.)

+New-epoch significa que a época atual foi atualizada.

+sdown o evento é posteriormente escalado para +odown, o que significa que vários Sentinelas concordam sobre o fato de que o mestre não é acessível. (+odown significa que a instância especificada está agora em estado objetivamente baixo.)

Sentinels + vote um sentinela que iniciará a primeira tentativa de falha.

a falha acontece.

Upstart for Redis

description "Redis Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../redis.conf"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Upstart for Sentinel

description "Redis Sentinel Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../sentinel.conf --sentinel"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Parabéns! É só isso. É assim que a Redis lida com alta disponibilidade e falha automática. Agora vamos dar uma olhada em alguns fatos Redis interessantes antes de começarmos a otimizar dicas e truques.

factos interessantes sobre a Redis.

Referência da Imagem: http://download.redis.io/logocontest/

Redis pode lidar com até 2 32 teclas, e foi testado na prática para lidar com, pelo menos, 250 milhões de chaves por exemplo.

uma instância vazia usa ~ 3MB de memória.

1 milhão de chaves pequenas- > pares de caracteres usam ~ 85MB de memória.

1 milhão de chaves- > valor de Hash, representando um objeto com 5 campos, usar ~ 160 MB de memória.

Redis é um único roscado. Como posso explorar múltiplos CPU / núcleos?

não é muito frequente que a CPU se torne o seu gargalo com Redis, como normalmente o Redis é ligado à memória ou à rede. Se for esse o caso, a escala horizontal ou vertical das instâncias Redis ajudará a reduzir os pontos de estrangulamento relacionados com a CPU.

Redis é uma memória, mas persistente na base de dados de disco.

persistência do Redis – >RDB : instantâneos pontuais do seu conjunto de dados em intervalos especificados. (Backup de dados)| AOF : regista todas as operações de escrita recebidas pelo servidor. (Mais durável)

se você está usando Java, você pode usar Jedis que é um cliente java, para conectar sua aplicação Java com Redis. Nota: Jedis usa o Apache Commons Pool para a ligação em comum (GenericObjectPool). A single Jedis instance is not threadsafe! para evitar estes problemas, você deve usar JedisPool, que é uma piscina triadsafe de conexões de rede. O tamanho máximo de conjunto de ligações por omissão é de 8.

agora vamos nos concentrar nos problemas / erros que você pode obter e algum desempenho de produção otimizando dicas e truques para Redis.

problemas / erros que você pode obter & desempenho de produção otimizando dicas e truques

em primeiro lugar, no redis.conf e sentinel.conf, todos os configus estão numa ordem, por isso não interfira com a ordem. Caso contrário, você vai obter erros de configuração como segue.

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 98
>>> 'sentinel down-after-milliseconds mymaster 5000'
No such master with specified name.

do ponto de vista da segurança, configure uma senha para autenticar com o mestre e os escravos. Para isso você pode facilmente mudar o redis.conf e sentinel.conf em conformidade com o seguinte valor de configuração.

In sentinel.conf
sentinel auth-pass <master-name> <password>In redis.conf
masterauth <master-password>

Makesute that the TCP backlog setting (Max connections) is 511. Você pode definir esse valor de acordo (considerando a especificação do seu servidor) com os seguintes passos.

sudo nano /etc/rc.local
Add this:
sysctl -w net.core.somaxconn=65535When you reboot the next time, the new setting will be to allow 65535 connections instead of 128 as before. When you add the line to rc.local make sure it's before the exit 0.

algumas das advertências que você pode encontrar a partir do redis.o registo pode ser,

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.You can add this via following command as well as using a cat command you can makesure whether the value is set properly.echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
cat /etc/sysctl.conf

você pode precisar desativar THP ou transparente página enorme.

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.Fixsudo nano /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled

usando o soquete UNIX em vez do porta tcp 6379 também contribuirá para o ganho de desempenho do Redis.

Referência: https://redis.io/topics/benchmarks

para conseguir isso, redis.conf deve ser alterado para a seguinte configuração.

unixsocket /var/run/redis.sock
unixsocketperm 777# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0

adicionalmente, dependendo do seu caso de uso, Poderá também configurar a opção de persistência do Redis.

se desejar, pode desactivar a persistência, se quiser que os seus dados apenas existam enquanto o servidor estiver a correr. Nota: você pode desativar a persistência do RDB comentando todas as linhas de “salvar” em redis.conf como se segue.

Comment out these 3 values in redis.conf
save 900 1
save 300 10
save 60 10000rdbcompression no
rdbchecksum no

o AOF persistence (Apend Only File) está desactivado por omissão no redis.conf.

appendonly no

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Monitoramento Redis

Do ponto de vista do Acompanhamento, existem várias ferramentas para monitorar o Redis. A NewRelic fornece recursos avançados para monitorar e analisar Redis, incluindo “operações mais consumidas de db”, “operações por transferência”, “operações por tempo de consulta” e etc.

Mais informações sobre a Nova Relíquia Redis é mencionado aqui. Além disso, o Redis-stat é também uma boa ferramenta de monitoramento do Redis da opensource.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

a AWS Elasticache

AWS também oferece um cache na memória de serviço em nuvem chamado “ElastiCache”, que também vem com o Redis incluído. Pode ser especificado como um serviço eficiente e fácil de usar em nuvem, que descarrega a maioria das configurações manuais e tarefas administrativas.ElastiCache é um serviço web que facilita o lançamento, gerenciamento e escala de um cache distribuído em memória na nuvem.

Curiosamente, ele é fornecido com o fabuloso funcionalidades avançadas, tais como o Modo de Cluster com sharding dentro de alguns cliques, Multi-AZ, com a Auto-activação pós-falha, a Criptografia em repouso, a Criptografia em trânsito, Importação RDB de arquivos para o S3, Habilitar cópias de segurança automáticas e muito mais.

recurso mais interessante do AWS ElastichCache é que, ele oferece um abrangente painel de monitorização para o Redis cluster, incluindo o monitoramento de aspectos, tais como a CPU e a utilização de Memória (Swap e memória Liberável), contagem de Ligação, a contagem de itens, Despejos, String;Chave;Hash baseado Comando de contagem, O atraso de replicação e muito mais.

Bem… isso é muito bonito para esta postagem!

Como eu mencionei no início deste post, há uma abundância de diferentes Redis artigos lá fora, mas eu queria criar um “tudo em um artigo” que abrangem a maioria dos fatos essenciais e dicas de o que é necessário e útil para um desenvolvedor ou um devops engenheiro para construir um ambiente Altamente Disponível Redis cluster com Sentinela.

Antes de terminar este post, um dos artigos interessantes que encontrei foi como o Flickr implementou Redis Sentinel. Por favor, certifique-se de verificar esse post também.

OK. Então, muito obrigado por ler este artigo e estou ansioso para chegar com outro artigo interessante em breve, compartilhando minha experiência como desenvolvedor. Até lá, saúde! e feliz codificação!