Construcción de clústeres RabbitMQ de alta disponibilidad y análisis de principios

Prefacio

Cualquier servicio, aunque sea una implementación independiente, el rendimiento siempre tiene un límite superior, RabbitMQno es una excepción, cuando un RabbitMQservicio 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 RabbitMQel 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 Anodo, pero el mensaje está almacenado en el Bnodo 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 RabbitMQclúster:

  1. Si tuvo que comenzar antes de la versión independiente, luego elimine los datos antiguos rm -rf /var/lib/rabbitmq/mnesiao elimine la instalación en el directorio var/lib/rabbitmq/mnesia, mi máquina está instalada en el directorio de instalación, se ejecuta el comando rm -rf /usr/local/rabbitmq_server-3.8.4/var/lib/rabbitmq/mnesia/.

  2. A continuación, debe iniciar los siguientes tres comandos para iniciar tres números de puerto diferentes de RabbitMQservicios, además de especificar RabbitMQcuándo los puertos de servicio también deben especificar sistemas de back office de puertos adicionales, y deben especificar el nodenombre 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 es rabbit@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 3información de cómo crear un nodo:

Inserte la descripción de la imagen aquí

También a través de ps -ef | grep rabbittambién se pueden encontrar tres procesos de servicio que se inician.

  1. 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
  1. Después de un éxito, ejecute el estado del rabbitmqctl cluster_statusnodo de consulta de comando rabbit1, puede ver la siguiente figura, dos nodos de disco un nodo de memoria:

Inserte la descripción de la imagen aquí

  1. 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í RabbitMQun 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.cookieel archivo consistente.

Clúster de alta disponibilidad basado en HAProxy + Keepalived

Si es un RabbitMQclú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 Redisel Sentinelmodo de clúster (Sentinel), puede supervisar el Redisnodo centinela y la conmutación por error.

En RabbitMQun clúster, por Keepalivedy HAProxydos componentes para lograr una alta disponibilidad y un clúster de equilibrio de carga.

HAProxy

HAProxyEs 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, lvsetc. HAproxyAdmite el 7equilibrio de 4carga de capas y el equilibrio de carga de capas.

Balanceo de carga

El llamado 7equilibrio de carga de capa y equilibrio de carga de 4capa para los OSIpropósitos del modelo, que se muestra a continuación es un OSImodelo de comunicación:

Inserte la descripción de la imagen aquí

Vemos la figura de arriba, la primera 7capa corresponde a la capa de aplicación, la segunda 4capa corresponde a la capa de transporte. Usado comúnmente como software de equilibrio de carga, nginxgeneralmente funciona en la primera 7capa, lvsgeneralmente funciona (servidor virtual Linux) en la primera 4capa.

  • 4 Carga de capa:

4La 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 IPy el puerto, y luego reenvíe el paquete al servidor de destino correspondiente. 4El 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

HAProxyAunque se logra el equilibrio de carga, si solo se implementa uno HAProxy, existe el riesgo de tiempo de inactividad. Una vez HAProxyinactivo, hará que todo el clúster no esté disponible, por lo que HAProxytambién debemos implementar un clúster, si HAProxytambié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 HAProxyalta disponibilidad, la necesidad de introducir un Keepalivedcomponente, Keepalivedcomponente 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 masternodo.
  • masterEl nodo externo proporcionará un IPlado de la aplicación virtual , solo es necesario conectar este IPen la línea. Se puede entender que los HAProxynodos del clúster también competirán por el virtual IP, qué nodo a la competencia, que será atendido por un nodo.

Protocolo VRRP

VRRPEl protocolo es el Protocolo de redundancia de enrutador virtual (Protocolo de redundancia de enrutador virtual). KeepalivedSiempre IPque 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 RaabbitMQgrupos 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 RabbitMQclúster, pero también presenta algunos inconvenientes que los clústeres comunes pueden combinarse HAProxyy Keepalivedcomponentes para lograr un verdadero servicio de clúster distribuido de alta disponibilidad.

Supongo que te gusta

Origin blog.csdn.net/zwx900102/article/details/113790097
Recomendado
Clasificación