Redis Sentinel-Alta disponibilidad: Todo lo que necesitas saber, desde DESARROLLO hasta PROD: Guía completa
¿Qué significa realmente el término «Redis»?
Significa Servidor de diccionario remoto.
¡Bien! Hay muchos artículos de Redis diferentes, pero quería compartir mi experiencia como desarrollador con Redis creando un «artículo todo en uno» que cubra las cosas más esenciales e importantes que se necesitan y que son útiles para un desarrollador o un ingeniero de devops para construir un clúster de Redis de alta Disponibilidad con Sentinel.
Así que comencemos
Redis, que es un almacén de estructura de datos de código abierto en memoria, es una selección muy popular entre los desarrolladores que se usa para fines de almacenamiento en caché, como agente de mensajes y también se usa principalmente como base de datos clave-Valor NoSQL para diferentes casos de uso.
En esta publicación, voy a discutir y demostrar específicamente sobre Redis junto con la Replicación Maestro/Esclavo, Alta disponibilidad (Redis Sentinel), Conmutación por error automática , algunos consejos de optimización del nivel de producción y aspectos de monitoreo. Además, junto con estos temas, mencionaré los problemas y errores que enfrenté durante la implementación de Redis Sentinel con Ubuntu. A continuación se muestran los detalles de la versión del sistema operativo y la versión de Redis.
OS version: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Redis Version: 4.0.9
Además, quiero destacar que la documentación de Redis es muy informativa y es ‘el lugar al que ir’ si necesita más aclaraciones sobre Redis.
Pasando a lo básico de Redis; Redis es una base de datos en memoria, lo que simplemente significa que Redis se ejecuta en RAM. También debe saber que Redis admite varias estructuras de datos, como cadenas, hashes, listas, conjuntos, conjuntos ordenados con consultas de rango y mapas de bits. Además, también admite operaciones atómicas, como agregar a una cadena, incrementar el valor en un hash, empujar un elemento a una lista, etc.
Bueno, comencemos con la alta disponibilidad de Redis.
Redis sentinel es la solución de alta disponibilidad ofrecida por Redis. En caso de fallo en el clúster de Redis, Sentinel detectará automáticamente el punto de fallo y devolverá el clúster al modo estable sin intervención humana.
¿Qué sucede realmente dentro de Redis Sentinel ?
Sentinel siempre comprueba las instancias MAESTRO y ESCLAVO en el clúster de Redis, comprobando si funcionan como se esperaba. Si sentinel detecta un error en el nodo MAESTRO de un clúster determinado, Sentinel iniciará un proceso de conmutación por error. Como resultado, Sentinel elegirá una instancia de ESCLAVO y la promocionará a MAESTRA. En última instancia, las otras instancias ESCLAVAS restantes se reconfigurarán automáticamente para usar la nueva instancia MAESTRA.
Sentinel actúa como proveedor de configuración o fuente de autoridad para la detección de servicios de clientes.
¿Qué significa eso ? Simplemente, los clientes de la aplicación se conectan a los Centinelas y los Centinelas les proporcionan la dirección MAESTRA de Redis más reciente.
Además, Sentinel es un sistema distribuido robusto, en el que varios centinelas deben estar de acuerdo sobre el hecho de que un maestro dado ya no está disponible. A continuación, solo el proceso de conmutación por error inicia una selección de un nuevo nodo MAESTRO. Este acuerdo de centinela se realiza de acuerdo con el valor de quórum.
¿Qué es el quórum ?
El valor de quórum es el número de Centinelas que necesitan ponerse de acuerdo sobre el hecho de que el maestro no es accesible. Sin embargo, el quórum solo se utiliza para detectar el fallo. Para realizar una conmutación por error, uno de los Centinelas debe ser elegido líder para la conmutación por error y estar autorizado para proceder. Esto solo sucede con el voto de la mayoría de los procesos Centinela.
Ensuciémonos las manos con Redis Sentinel.
Seguiremos la configuración básica con 3 instancias de servidor.
por Favor, consulte el diagrama que ilustra las 3 de la instancia del servidor de configuración básica. En primer lugar, asegúrese de que sus instancias de Ubuntu estén actualizadas con las dependencias de compilación relevantes. A veces, también podrías necesitar jemalloc. A continuación se muestran los pasos para instalar Redis en las instancias de 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
Ahora en la redis directorio que usted debería ser capaz de ver tanto redis.conf y sentinel.archivos de configuración de conf.
Antes de ejecutar Redis vamos a hacer algo necesario configuraciones básicas para arriba y ejecutar un Redis clúster. A continuación se muestran las direcciones IP de esta configuración.
10.52.209.46 (Initial Master Node)
10.52.209.47 (Initial Slave Node)
10.52.209.49 (Initial Slave Node)
El puerto predeterminado para el servidor Redis es 6379 y Sentinel es 26379. Por lo tanto, asegúrese de abrir estos puertos utilizando,
sudo ufw allow 6379
sudo ufw allow 26379
Las configuraciones de Redis (ambas en redis.conf y sentinel.conf) en los servidores anteriores debe configurarse de la siguiente manera.
Para la configuración básica anterior, las configuraciones serán suficientes, pero para el nivel de producción, tenga en cuenta los consejos mencionados en la última parte de este post. La única diferencia en redis.archivos de configuración en 3 servidores es que, todos los esclavos deben tener la siguiente configuración. 10.52.209.46 es la dirección IP maestra.
slaveof 10.52.209.46 6379
slaveof le indica al clúster de Redis que convierta esta instancia de servidor en particular en una instancia ESCLAVA del nodo MAESTRO dado (10.52.209.46).
En sentinel.conf, después de la configuración, notifique a Sentinels que inicie la supervisión del clúster con los siguientes ajustes iniciales. Posteriormente, esta configuración puede actualizarse automáticamente en consecuencia.
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)
Además, sentinel.conf también incluye los siguientes valores de configuración.
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! Ahora run vamos a correr Redis.
Hay muchas formas de ejecutar Redis. En esta demostración me quedaré con el siguiente 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.)
Después de eso, simplemente puede verificar los procesos de Redis a través del comando ps-ef | grep redis. Cada instancia de servidor debe ejecutar tanto un proceso Redis como un proceso Sentinel. Si todo va al plan, debe haber 2 procesos que se ejecuten de la siguiente manera.
Ahora conectarse a Redis cliente a través de uno de los siguientes comandos y probar si Redis está trabajando bien.
redis-cli ping
or
redis-cli -h IP_Address pingYou should get a output of PONG.
¡Impresionante! Ahora tienes a Redis en marcha. Centrémonos en la replicación Maestro / Esclavo.
Replicación Maestro/esclavo
Ahora si marca el redis.log (que se encuentra en el lugar que definimos en el redis.conf) de cada instancia, puede ver la sincronización Maestro — Esclavo ocurrida.
Nodo maestro-redis.registro de
nodo Esclavo — redis.registro de
Comprobación del Estado de la Replicación
Puede verificar la información de replicación a través de info comando de replicación en Redis CLI. Bajo el atributo rol, menciona si ese nodo en particular es un MAESTRO o un ESCLAVO (caja amarilla).Además, en el nodo maestro, muestra los detalles de todos los esclavos conectados. (caja verde)
Ahora examinemos qué centinela.el registro indica. (que se encuentra en el lugar que definimos en el centinela.conf)
Además, si usted comprueba el centinela.archivo de configuración, puede ver que el archivo de configuración se actualiza automáticamente con las configuraciones más recientes, incluidos los valores sentinel known-slave y sentinel known-sentinel.
Genial! Ahora vamos a crear un valor de muestra en todos los nodos.
127.0.0.1:6739> set demokey "Amila"
Como puede ver en el diagrama anterior, los ESCLAVOS son de SOLO LECTURA, por lo que solo puede escribir datos en el Maestro. Dado que Redis se replica de forma asíncrona con todos los esclavos restantes, puede recuperar el valor insertado de cualquier esclavo Redis utilizando la misma clave dada. Además, a través de,KEYS*
puede enumerar todas las teclas insertadas. El diagrama de arriba describe claramente de lo que acabamos de hablar.
Ahora vamos a comprobar cómo funciona la conmutación por error automática de Redis Sentinel.
Conmutación por error automática Redis Sentinel
Okiee! Simulemos un escenario de conmutación por error automática. Para simular un escenario de conmutación por error, simplemente puede detener el servidor Redis o eliminar el proceso Redis en la instancia MAESTRA. Incluso usted puede dormir el proceso de Redis también. Puedes elegir el camino que desees.
kill -9 <process id>
or
redis-cli -p 6379 DEBUG sleep 30
or
redis-cli -p 6379 DEBUG SEGFAULT
Como se ilustra en el diagrama anterior, en un escenario de conmutación por error, si falla el nodo MAESTRO, los 2 Centinelas restantes determinarán la conmutación por error y si ambos están de acuerdo (ya que el valor de quórum es 2 ), se elegirá un nuevo MAESTRO de esos 2 nodos restantes.
A continuación se muestra la cola de registro para este escenario de conmutación por error.
redis.registro de nodos esclavos.
sentinel.registro de nodos esclavos
Ahora comprobemos el estado de la replicación a través del comando info replication.
continuar elaborando el registro de la cola,
Cada Centinela detecta el maestro es una
+sdown
evento. (+sdown significa que la instancia especificada está ahora en estado Descendente subjetivo.)+ nueva época significa que la época actual se actualizó.El evento
+sdown
se escalona posteriormente a+odown
, lo que significa que varios Centinelas están de acuerdo en que el maestro no es accesible. (+odown significa que la instancia especificada está ahora en un estado objetivamente descendente.)Centinelas + vota un Centinela que iniciará el primer intento de conmutación por error.
Se produce la conmutación por error.
Además, a continuación se muestran los trabajos iniciales.
Upstart para 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 para 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
Felicitaciones! Eso es simplemente. Así es como Redis maneja la Alta Disponibilidad y la Conmutación por Error automática. Ahora echemos un vistazo a algunos datos interesantes de Redis antes de saltar a consejos y trucos de optimización.
Datos interesantes sobre Redis.
Redis puede manejar hasta 2 y 32 claves, y se probó en la práctica para manejar al menos 250 millones de claves por instancia.
Una instancia vacía utiliza ~ 3 MB de memoria.
1 Millón de teclas pequeñas – > Los pares de valores de cadena usan ~ 85 MB de memoria.
1 Millón de claves -> Valor Hash, que representa un objeto con 5 campos, utiliza ~ 160 MB de memoria.
Redis es de rosca simple. ¿Cómo puedo explotar múltiples CPU / núcleos?
No es muy frecuente que la CPU se convierta en su cuello de botella con Redis, ya que normalmente Redis está vinculada a la memoria o a la red. Si es el caso, el escalado horizontal o vertical de las instancias de Redis ayudará a reducir los cuellos de botella relacionados con la CPU.
Redis es una base de datos en memoria pero persistente en disco.
Persistencia de Redis – > RDB : instantáneas puntuales de su conjunto de datos a intervalos especificados. (Copia de seguridad de datos)| AOF : registra cada operación de escritura recibida por el servidor. (Más duradero)
Si está utilizando Java, puede usar Jedis, que es un cliente java, para conectar su aplicación Java con Redis. Nota: Jedis utiliza Apache Commons Pool para la agrupación de conexiones (GenericObjectPool).
A single Jedis instance is not threadsafe!
Para evitar estos problemas, debe usar JedisPool, que es un conjunto de conexiones de red seguras para hilos. El tamaño máximo predeterminado del grupo de conexiones es 8.
Ahora centrémonos en los problemas/errores que podría obtener y en algunos consejos y trucos para optimizar el rendimiento de producción para Redis.
Problemas / errores que podría obtener & Consejos y trucos de optimización del rendimiento de producción
En primer lugar, en redis.conf y sentinel.conf, todas las configuraciones están en orden, así que no te metas con el orden. De lo contrario, obtendrá errores de configuración como los siguientes.
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 98
>>> 'sentinel down-after-milliseconds mymaster 5000'
No such master with specified name.
Desde el punto de vista de la seguridad, configure una contraseña para autenticarse con el maestro y los esclavos. Para ello, puede cambiar fácilmente el redis.conf y sentinel.conf en consecuencia con el siguiente valor de configuración.
In sentinel.conf
sentinel auth-pass <master-name> <password>In redis.conf
masterauth <master-password>
Asegura que la configuración de backlog TCP (Conexiones máximas) es 511. Puede establecer ese valor en consecuencia (teniendo en cuenta la especificación de su servidor) con los siguientes pasos.
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.
Algunas de las advertencias que puede encontrar en redis.el registro podría 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
Es posible que deba deshabilitar THP o Página Enorme Transparente.
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
El uso de socket UNIX en lugar del puerto TCP 6379 también contribuirá a la ganancia de rendimiento de Redis.
para lograr esto, redis.conf debe cambiarse a la siguiente configuración.
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
Además, dependiendo de su caso de uso, también puede configurar la opción persistencia de Redis.
Si lo desea, puede deshabilitar la persistencia en absoluto, si desea que sus datos solo existan mientras el servidor se esté ejecutando. Nota: puede desactivar la persistencia RDB comentando todas las líneas «guardar» en redis.conf como sigue.
Comment out these 3 values in redis.conf
save 900 1
save 300 10
save 60 10000rdbcompression no
rdbchecksum no
La persistencia AOF (Archivo Solo Anexar) está deshabilitada de forma predeterminada en redis.conf.
appendonly no
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Monitoreo de Redis
De Monitoreo de la perspectiva, hay varias herramientas para monitorear Redis. NewRelic proporciona capacidades avanzadas para monitorear y analizar Redis, incluidas «operaciones de base de datos más consumidas», «operaciones por rendimiento», «operaciones por tiempo de consulta», etc.
Más información acerca de la Nueva Reliquia Redis se menciona aquí. Además, Redis-stat también es una buena herramienta de monitoreo de Redis de código abierto.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
AWS ElasticCache
AWS ofrece también una memoria caché de servicio en la nube llamado «ElastiCache», que también viene con Redis incluido. Se puede especificar como un servicio en la nube eficaz y fácil de usar, que descarga la mayoría de las configuraciones manuales y tareas administrativas.
ElastiCache es un servicio web que facilita el lanzamiento, la administración y la escala de una caché distribuida en memoria en la nube.
Curiosamente, viene con fabulosas funciones avanzadas, como el modo de clúster con fragmentación en pocos clics, Multi-AZ con Conmutación por error automática, Cifrado en reposo, Cifrado en tránsito, Importación de archivos RDB a S3, Habilitar copias de seguridad automáticas y muchos más.
La característica más interesante de AWS ElastichCache es que ofrece un panel de supervisión completo para su clúster de Redis que incluye aspectos de supervisión como la utilización de CPU/Memoria (Memoria intercambiable y libre), Recuento de conexiones, Recuento de elementos, Desalojos, Cadena, Clave, Recuento de comandos basados en Hash, Retardo de replicación y muchos más.
Bueno… Eso es todo por este post!
Como mencioné al principio de esta publicación, hay muchos artículos de Redis diferentes, pero quería crear un «artículo completo» que cubriera los hechos y consejos más esenciales que se necesitan y son útiles para un desarrollador o un ingeniero de devops para construir un clúster de Redis de alta Disponibilidad con Sentinel.
Antes de terminar este post, uno de los artículos interesantes que encontré fue Cómo Flickr implementó Redis Sentinel. Por favor, asegúrese de revisar ese poste también.
OK. Así que muchas gracias por leer este artículo y espero encontrar otro artículo interesante pronto, compartiendo mi experiencia como desarrollador. Hasta entonces, ¡Salud! ¡y Feliz Programación!