Cómo comenzar rápidamente con VUE3.0: aprendamos
a usar la función de clúster redis
en nodejs
. No encontré un artículo relativamente completo y fácil de entender, por lo que también tomé muchos desvíos durante el desarrollo y la depuración. proceso.
Este artículo presentará en detalle cómo construir un clúster de Redis localmente, cómo usar el clúster en el cliente y resumirá y explicará los problemas y errores encontrados durante el proceso de construcción para evitar desvíos la próxima vez y mejorar el desarrollo y la eficiencia del trabajo.
El trasfondo del uso del clúster es: en el modo singleton de Redis, con el aumento en el número de usuarios y visitas, ¿el valor qps aumenta drásticamente? Una gran cantidad de operaciones io
hacen que cpu(100%)
en En un momento determinado, puede haber un tiempo de inactividad en cualquier momento. Al mismo tiempo, el procesamiento por lotes de Redis y otros métodos solo tratan los síntomas, pero no la causa raíz, y no pueden superar el cuello de botella en el rendimiento del servidor . Por lo tanto, es imperativo utilizar una solución de clúster o agregar instancias de Redis.
un clúster de clúster generalmente se refiere a un clúster de servidores, que es diferente de un sistema distribuido. Reúne muchos servidores para realizar el mismo servicio. Desde la perspectiva del cliente, parece que solo hay un servidor. Un clúster puede utilizar varias computadoras para la computación paralela a fin de lograr una alta velocidad de computación. También puede usar varias computadoras para realizar copias de seguridad, de modo que si alguna máquina falla, todo el sistema aún pueda funcionar con normalidad. ( Antes de redis3.0, generalmente se usaba el modo centinela, pero la configuración de centinela es un poco complicada y el rendimiento y la alta disponibilidad son promedio )
que, debido al mecanismo de tolerancia a fallas de votación, más de la mitad de los Los nodos creen que un determinado nodo ha fallado. El nodo está inactivo, por lo que 2 nodos no pueden formar un clúster, por lo que el clúster de Redis requiere al menos 3 nodos.
Para garantizar la alta disponibilidad del clúster, cada nodo debe tener un nodo esclavo (es decir, un nodo de respaldo), por lo que Redis
requiere al menos 6 servidores. (Tres maestros y tres esclavos, tres depósitos y tres recuperaciones, alta disponibilidad y respaldo)
Por supuesto, es imposible para nosotros usar tantos servidores al depurar localmente, por lo que podemos simular la ejecución de 6 instancias redis
localmente. Clúster de Redis en el entorno de producción La compilación es básicamente la misma que aquí.
. Puede optar por instalarlo en el sitio web oficial o puede instalarlo con la línea denominada
#install brew install redis. #Iniciar servidor redis # Ingrese al cliente redis redis-cli
primero debe encontrar la ubicación del archivo de configuración de redis
brew list redis
# Verifique la ubicación delcd /opt/homebrew/Cellar/redis/6.2.4
# Ingrese la versión según la ubicación La carpeta donde se encuentra el númeroopen .
# Abra la carpetaXcode.app
para abrir homebrew.mxcl.redis.plist
para encontrar la ubicación de redis.conf
, como se muestra. abajo:Cree seis archivos de configuración de servicio
cd /opt/homebrew/etc/
(el directorio del archivo de configuración que se encuentra en el paso anterior)
# Debe estar en la ruta /opt/homebrew/etc/ mkdir -p redis/cluster/7000 mkdir -p redis/cluster/7001 mkdir -p redis/cluster/7002 mkdir -p redis/cluster/7003 mkdir -p redis/cluster/7004 mkdir -p redis/cluster/7005
Modificar el archivo de configuración
No es necesario modificar el archivo de configuración en la ruta /opt/homebrew/etc/redis.conf
. Simplemente cópielo en el directorio redis/cluster/7000
creado anteriormente y luego. modifíquelo Los pasos son los siguientes:
cd /opt/homebrew/etc/ # Ingrese al directorio del archivo de configuración cp redis.conf redis/cluster/7000/7000.conf. code redis/cluster/7000/7000.conf # Abra el archivo de configuración con un editor o vim para modificarlo.
7000.conf
, modifique las siguientes propiedades# Número de puerto de Redis (cada archivo de configuración 7000-7005 debe modificarse). puerto 7000 # Habilite el modo de clúster y ejecute Sí habilitado para clúster # Ruta del archivo de configuración del archivo de configuración interna del clúster, nodos predeterminados-6379.conf (cada archivo de configuración 7000-7005 debe modificarse) archivo-config-clúster nodos-7000.conf # Tiempo de espera de comunicación entre nodos cluster-node-timeout 5000 # Persistencia de datos appendonly sí
cd de servicio de redis /opt/homebrew/etc/redis/cluster # Ingrese al directorio del archivo de configuración cp 7000/7000.conf 7001/7001.conf cp7000/7000.conf 7002/7002.conf cp7000/7000.conf 7003/7003.conf cp7000/7000.conf 7004/7004.conf cp 7000/7000.conf 7005/7005.conf
7001.conf-7005.conf
Nota: Cada archivo de configuración debe configurar port和cluster-config-file
diferentes. valor port和cluster-config-file
(de lo contrario, el clúster no tendrá efecto), que se distingue por el puerto.
El directorio del archivo de configuración se puede encontrar mediante el comando find /opt/homebrew -name nodes-7000.conf
.
Dado que hemos configurado 6 servicios, es imposible iniciarlos o detenerlos uno por uno. Debe usar un script de shell para
ingresar al directorio /opt/homebrew/etc/redis/cluster
y crear. start.sh y detener el archivo .sh
# archivo start.sh#!/bin/sh. servidor redis /opt/homebrew/etc/redis/cluster/7000/7000.conf & servidor redis /opt/homebrew/etc/redis/cluster/7001/7001.conf & servidor redis /opt/homebrew/etc/redis/cluster/7002/7002.conf & servidor redis /opt/homebrew/etc/redis/cluster/7003/7003.conf & servidor redis /opt/homebrew/etc/redis/cluster/7004/7004.conf & servidor redis /opt/homebrew/etc/redis/cluster/7005/7005.conf & # archivo stop.sh #!/bin/sh redis-cli -p 7000 apagado y redis-cli -p 7001 apagado y redis-cli -p 7002 apagado y redis-cli -p 7003 apagado y redis-cli -p 7004 apagado y redis-cli -p 7005 apaga y
ejecuta ./start.sh
o ./stop.sh
para iniciar y detener el servicio
Ejecute ps -ef |grep redis
para ver el servicio redis iniciado
Nota: es necesario ejecutar ./ start.sh por primera vez Autorice permisos de ejecución a través de sudo chmod +x start.sh
redis-cli -p 7000 # Iniciar un único cliente redis-server 7000/7000.conf # Iniciar un único servidor redis-cli. -p 7000 apagado # Apagar el servidor sudo chmod +x start.sh # Habilitar el permiso de ejecución del script # Establecer la relación maestro-esclavo de redis (tres maestros y tres esclavos) redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 nodos del clúster #Ver el estado del nodo del clúster (ingrese un cliente para ejecutar) información del clúster #Ver información del clúster (ingrese un cliente para ejecutar) Ver todos los valores clave: claves * Eliminar el valor en el índice especificado: del key Borre los datos de todo el servidor Redis: flusall Borre todas las claves en la biblioteca actual: el
Redis. El clúster proporciona la función de fragmentación automática en múltiples nodos de Redis. Utilice los seis servidores redis creados anteriormente y luego inicie node redis.js
, puede probar el efecto del clúster. ioredis
// redis.js const Redis = requerir("ioredis"); clúster constante = nuevo Redis.Cluster ([ { puerto: 7000, anfitrión: "127.0.0.1", }, { puerto: 7001, anfitrión: "127.0.0.1", }, ]); cluster.set("foo", "barra"); cluster.get("foo", (err, res) => { // res === 'barra' });
importar cola desde 'bull' // Crea una instancia de cola de Redis const instancia = new Queue('custom', { prefijo: '{miprefijo}', crearCliente(tipo) { // la instancia del cluster es la misma que la anterior return cluster } }) //Agregar datos a la cola de Redis (productor) instancia.add( 'pedido', { ...parámetros }, { eliminarOnComplete: falso } ).catch(e => { consola.error(e) }) // Devolución de llamada del consumidor instancia.proceso('solicitud', 5, async (trabajo, hecho) => { console.log('Obtener datos consumidos actualmente:', job.data) //Realizar operación asincrónica en espera de nueva promesa((resolve)=>resolve()) hecho() })
Hay un problema al usar bull
Framework para conectarse al clúster ioredis
: cada vez que push
datos a la cola redis
, la función de devolución de llamada correspondiente puede activarse varias veces. Actualmente es imposible determinar si se trata de un problema. el uso o un problema con el marco en sí (si saben más, bienvenidos a todos, dejen un mensaje para informar).
Alternativa a la agrupación en clústeres: si no se requieren sincronización ni migración de datos, se pueden usar varias instancias redis
en el cliente, combinadas con Math.random()
para dividir los datos en partes iguales en una de redis
, resolviendo así el problema del hardware de instancia única. ( cpu
etc.) problema de cuello de botella.
1. ¿Se produce un error al conectarse a redis en el sistema Mac?
Mensaje de error de la consola: No se pudo conectar a Redis en 127.0.0.1:6379: Conexión rechazada
Motivo: el servidor no se inicia o no se inicia
Solución: primero debe iniciar el servidor de Redis
Enlace de referencia
del servidor de Redishttps://blog. csdn.net/qq_23347459/article/details/104257529
2. Al iniciar el cliente, ¿reporta un error al leer o escribir?
Mensaje de error: ClusterAllFailedError: No se pudo actualizar la caché de ranuras
Motivo: Los atributos del archivo de configuración del clúster en los archivos de configuración de cada servicio son consistentes.
Procesamiento: Modificar al valor de atributo único
Enlace de referencia 1
https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache
Referencia 2
https://github.com/luin/ioredis/ issues /711
3. ¿Error al ejecutar la instrucción de creación de redis maestro-esclavo?
Ejecutar declaración: redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
Error rápido: [ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
: al ejecutar la instrucción de creación, los datos no se borran y el clúster no se restablece.
Procesamiento: borrar los datos y restablecer el clúster, borrar los archivos rdb y aof,
consulte
borrar los datos de redis
https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working
# Tome el servicio del puerto 7000. como ejemplo, repita las siguientes operaciones para 7001-7005 $redis-cli -p 7000 127.0.0.1:7000> descarga 127.0.0.1:7000> reinicio del clúster 127.0.0.1:7000>salir # Utilice find para buscar los archivos rdb y aof (también en el directorio rdb) buscar /opt/homebrew -name dump.rdb # Vuelva a ejecutar la declaración de creación con éxito redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1: 7005
El uso del clúster redis en el cliente es muy simple; en comparación, la configuración en el servidor será más engorrosa.
El uso específico del cliente se explica brevemente. Durante el uso, se debe prestar atención a cuestiones como la sincronización y la migración de datos de Redis.
Aunque el uso de un clúster puede mejorar las capacidades del servicio, admitir la replicación maestro-esclavo, el modo centinela, la separación de lectura y escritura y distribuir uniformemente la presión sobre el servidor, etc. Sin embargo, no tiene funciones automáticas de recuperación y tolerancia a fallas. Si se produce un tiempo de inactividad, algunas solicitudes de lectura y escritura fallarán, lo que reducirá la disponibilidad del sistema. Al utilizar, analice y elija diferentes soluciones en función de las condiciones comerciales.
Este artículo es una reproducción de: https://juejin.cn/post/7079928963107127327
Autor: tager