Prefacio
Cualquier servicio, aunque sea una implementación independiente, el rendimiento siempre tiene un límite superior, RabbitMQ
no es una excepción, cuando un RabbitMQ
servicio de tiempo único , la capacidad de manejar mensajes llega al cuello de botella, se puede lograr a través de un clúster de alta disponibilidad y equilibrio de carga.
¿Cuánto sabe sobre el clúster RabbitMQ?
Normalmente, en cada clúster tenemos un servicio llamado nodo en RabbitMQ
el clúster, el tipo de nodo se puede dividir en dos tipos:
- Nodo de memoria: los metadatos se almacenan en la memoria. Para sincronizar los datos después de reiniciar, el nodo de memoria almacenará la dirección del nodo del disco en el disco. Además, si el mensaje persiste, también se almacenará en el disco, porque el nodo de memoria lee y escribe rápido, y el cliente general El extremo se conectará al nodo de memoria.
- Nodo de disco: los metadatos se almacenan en el disco (tipo de nodo predeterminado) y se debe garantizar al menos un nodo de disco. De lo contrario, una vez que se apaga, los datos no se pueden restaurar y no se puede lograr el propósito de alta disponibilidad del clúster. .
PD: Los metadatos se refieren a información básica que incluye atributos de nombre de cola, atributos de nombre de tipo de conmutador, información de enlace, vhost, etc. No incluye datos de mensajes en la cola.
RabbitMQ
Hay dos modos principales de clústeres en, el modo de clúster normal y el modo de cola de espejo.
Modo de clúster normal
En el modo de clúster normal, cada nodo del clúster solo sincronizará los metadatos entre sí, es decir, los datos de los mensajes no se sincronizarán. Entonces, la pregunta es, si estamos conectados al A
nodo, pero el mensaje está almacenado en el B
nodo y ¿cómo hacerlo?
Independientemente de si es un productor o un consumidor, si el nodo conectado no almacena datos de la cola, se reenviará internamente al nodo que almacena los datos de la cola para su almacenamiento. Aunque se puede reenviar internamente, debido a que el mensaje solo se almacena en un nodo, si el nodo deja de funcionar, ¿desaparecerá el mensaje? Este problema existe, por lo que este modo de clúster común no logra el propósito de alta disponibilidad.
Modo de cola de espejo
En el modo de cola de espejo, no solo los metadatos se sincronizarán entre los nodos, sino que el contenido del mensaje también se sincronizará entre los nodos de espejo y la disponibilidad es mayor. Si bien esta solución mejora la disponibilidad, también genera una sobrecarga de red entre los datos sincronizados, lo que afectará el rendimiento hasta cierto punto.
Construcción del clúster RabbitMQ
Intentemos juntos construir un RabbitMQ
clúster:
-
Si tuvo que comenzar antes de la versión independiente, luego elimine los datos antiguos
rm -rf /var/lib/rabbitmq/mnesia
o elimine la instalación en el directoriovar/lib/rabbitmq/mnesia
, mi máquina está instalada en el directorio de instalación, se ejecuta el comandorm -rf /usr/local/rabbitmq_server-3.8.4/var/lib/rabbitmq/mnesia/
. -
A continuación, debe iniciar los siguientes tres comandos para iniciar tres números de puerto diferentes de
RabbitMQ
servicios, además de especificarRabbitMQ
cuándo los puertos de servicio también deben especificar sistemas de back office de puertos adicionales, y deben especificar elnode
nombre del prefijo, porque el nombre del nodo del clúster es comunicarse, por lo que el nombre del nodo debe ser único, el nombre del nodo predeterminado esrabbit@hostname
, el siguiente comando indica que se especifica el prefijo:
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
Después de comenzar a ingresar al /usr/local/rabbitmq_server-3.8.4/var/lib/rabbitmq/mnesia/
catálogo, busque la 3
información de cómo crear un nodo:
También a través de ps -ef | grep rabbit
también se pueden encontrar tres procesos de servicio que se inician.
- Los tres servicios que comenzaron ahora no tienen conexión entre sí. Ahora necesitamos usar uno de los nodos como nodo maestro, y luego los otros dos nodos deben unirse al nodo maestro para formar un servicio de clúster. Cabe señalar que antes al unirse al clúster, es necesario restablecer la información del nodo, es decir, los nodos con datos no pueden unirse al clúster.
//rabbit2 节点重置后加入集群
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 join_cluster --ram rabbit1@`hostname -s` //--ram 表示这是一个内存节点
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
rabbitmqctl -n rabbit3 join_cluster --disc rabbit1@`hostname -s` //--disc表示磁盘节点(默认也是磁盘节点)
rabbitmqctl -n rabbit3 start_app
- Después de un éxito, ejecute el estado del
rabbitmqctl cluster_status
nodo de consulta de comandorabbit1
, puede ver la siguiente figura, dos nodos de disco un nodo de memoria:
- Cabe señalar que el clúster que se inició aquí es solo el clúster normal predeterminado. Si desea configurar un clúster reflejado, debe ejecutar el siguiente comando:
rabbitmqctl -n rabbit1 set_policy ha-all "^" '{"ha-mode":"all"}'
Aquí RabbitMQ
un clúster incluso si la compilación está completa, pero debe tenerse en cuenta que, debido a que aquí hay una versión independiente, no considere .erlang.cookie
el archivo consistente.
Clúster de alta disponibilidad basado en HAProxy + Keepalived
Si es un RabbitMQ
clúster, hay varios nodos de memoria, ¿dónde está conectado un nodo deberíamos hacerlo? Si esta estrategia de elección se hace del lado del cliente, habrá grandes inconvenientes. El más grave es que el código del cliente debe ser modificado cada vez que se expande el clúster. Por lo tanto, este método no es muy deseable, por lo que estamos implementando el clúster.Cuando necesite un componente de proxy intermedio, este componente para habilitar la supervisión y el reenvío del servicio, como Redis
el Sentinel
modo de clúster (Sentinel), puede supervisar el Redis
nodo centinela y la conmutación por error.
En RabbitMQ
un clúster, por Keepalived
y HAProxy
dos componentes para lograr una alta disponibilidad y un clúster de equilibrio de carga.
HAProxy
HAProxy
Es un software de equilibrio de carga de código abierto y alto rendimiento, que también se puede utilizar como software de equilibrio de carga nginx
, lvs
etc. HAproxy
Admite el 7
equilibrio de 4
carga de capas y el equilibrio de carga de capas.
Balanceo de carga
El llamado 7
equilibrio de carga de capa y equilibrio de carga de 4
capa para los OSI
propósitos del modelo, que se muestra a continuación es un OSI
modelo de comunicación:
Vemos la figura de arriba, la primera 7
capa corresponde a la capa de aplicación, la segunda 4
capa corresponde a la capa de transporte. Usado comúnmente como software de equilibrio de carga, nginx
generalmente funciona en la primera 7
capa, lvs
generalmente funciona (servidor virtual Linux) en la primera 4
capa.
4
Carga de capa:
4
La carga de capa utiliza tecnología NAT
(traducción de direcciones de red), a saber: traducción de direcciones de red. Al recibir la solicitud del cliente, modificando la fuente del paquete de datos IP
y el puerto, y luego reenvíe el paquete al servidor de destino correspondiente. 4
El equilibrio de carga de capa solo puede reenviar solicitudes basadas en la dirección de destino y la dirección de origen en el mensaje, y no puede determinar ni modificar los tipos específicos de recursos solicitados.
7
Carga de capa:
De acuerdo con la ruta de recursos solicitada por el cliente, se reenvía a diferentes servidores de destino.
HAProxy de alta disponibilidad
HAProxy
Aunque se logra el equilibrio de carga, si solo se implementa uno HAProxy
, existe el riesgo de tiempo de inactividad. Una vez HAProxy
inactivo, hará que todo el clúster no esté disponible, por lo que HAProxy
también debemos implementar un clúster, si HAProxy
también se da cuenta del clúster, el cliente debe conectarse ¿Qué servicios? El problema parece estar de vuelta al principio, atascado en un bucle infinito ...
Keepalived
Para lograr una HAProxy
alta disponibilidad, la necesidad de introducir un Keepalived
componente, Keepalived
componente tiene principalmente las siguientes características:
- Con la función de carga, puede monitorear el estado de los nodos en el clúster. Si un nodo en el clúster deja de funcionar, se puede realizar la conmutación por error.
- El clúster en sí también se puede lograr, pero solo un
master
nodo. master
El nodo externo proporcionará unIP
lado de la aplicación virtual , solo es necesario conectar esteIP
en la línea. Se puede entender que losHAProxy
nodos del clúster también competirán por el virtualIP
, qué nodo a la competencia, que será atendido por un nodo.
Protocolo VRRP
VRRP
El protocolo es el Protocolo de redundancia de enrutador virtual (Protocolo de redundancia de enrutador virtual). Keepalived
Siempre IP
que pertenezca un mecanismo virtual VRRP
, es para evitar la aparición de un punto único de falla del enrutador de protocolo tolerante a fallas.
para resumir
Este documento describe los RaabbitMQ
grupos de conocimiento relevantes y compara la diferencia entre el clúster ordinario y el espejo de clúster, y finalmente a través de la práctica para construir un RabbitMQ
clúster, pero también presenta algunos inconvenientes que los clústeres comunes pueden combinarse HAProxy
y Keepalived
componentes para lograr un verdadero servicio de clúster distribuido de alta disponibilidad.