Operación y mantenimiento en contenedores: guía de Docker Compose para crear un clúster RabbitMQ de alta disponibilidad

Prefacio

En el mundo de la informática, la mensajería es como un viaje mágico, en el que los mensajes van y vienen entre sistemas como si fueran transportados mágicamente. Hoy entraremos en un campo lleno de aventuras de fantasía: la implementación del clúster RabbitMQ.

Imagine que RabbitMQ es nuestro conejo mensajero: no solo es inteligente y flexible, sino que también puede enviar mensajes rápidamente de un lugar a otro. El clúster RabbitMQ es como una poderosa familia de conejos: trabajan en estrecha colaboración para garantizar que los mensajes nunca se pierdan, como un espectáculo de magia de conejos.

En este fantástico viaje, revelaremos el clúster RabbitMQ y exploraremos juntos cómo construir un poderoso sistema de mensajería que pueda manejar cargas elevadas y sea tolerante a fallas, como un ejército mágico omnipotente.

¡Así que prepárate para seguir a nuestros amigos conejitos en esta divertida y desafiante aventura de mensajería! En este maravilloso mundo, descubrirás que la magia de la mensajería es infinita.

Para RabbitMQ, primero puede explicar algunos puntos de conocimiento.

Puntos de conocimiento relacionados con RabbitMQ

❓: ¿Cuál es la diferencia entre tipos en Exchanges?

  1. Intercambio directo:

    • Envíe el mensaje a la cola que coincida exactamente con la clave de enrutamiento del mensaje.
    • Un mensaje se envía a una cola sólo si su clave de enrutamiento coincide exactamente con la clave de enrutamiento de la cola vinculada al intercambio.
    • Adecuado para situaciones en las que se requiere una coincidencia exacta de claves de enrutamiento.
  2. Intercambio de temas:

    • Utilice comodines para hacer coincidir la clave de enrutamiento del mensaje con la cola vinculada.
    • Puede utilizar los caracteres comodín "*" (coincide con una palabra) y "#" (coincide con varias palabras) para definir patrones para las claves de enrutamiento.
    • Es adecuado para situaciones en las que se requiere una coincidencia flexible de claves de enrutamiento y admite enrutamiento de mensajes complejos.
  3. Intercambio de fans:

    • Transmite los mensajes recibidos a todas las colas enlazadas, ignorando la clave de enrutamiento del mensaje.
    • Todas las colas vinculadas al intercambio reciben la misma copia del mensaje.
    • Adecuado para situaciones en las que es necesario transmitir mensajes a todas las colas.
  4. Intercambio de encabezados:

    • Utilice los atributos del encabezado del mensaje para realizar coincidencias en lugar de utilizar claves de enrutamiento.
    • Puede establecer atributos de par clave-valor en el encabezado del mensaje y luego establecer los atributos de encabezado coincidentes al vincularse a la cola.
    • Adecuado para enrutamiento basado en atributos del encabezado del mensaje.

La elección del tipo de intercambio adecuado depende de la arquitectura de su aplicación y de sus necesidades de mensajería. Normalmente, el uso de conmutadores de conexión directa y conmutadores temáticos puede satisfacer la mayoría de los escenarios. Si necesita transmitir mensajes entre varias colas, puede utilizar un intercambiador de distribución. Si necesita hacer coincidir según los atributos del encabezado del mensaje, puede utilizar un intercambiador de encabezados.

Tenga en cuenta que una vez configurado el tipo de interruptor, normalmente no se puede cambiar. Por lo tanto, es necesario hacer concesiones y planificar en función de las necesidades reales al elegir un tipo de interruptor.

❓:políticasqué es

En RabbitMQ, las "políticas" son un mecanismo para automatizar la gestión y configuración del comportamiento de intercambios, colas y enlaces. Las políticas le permiten definir un conjunto de reglas en su clúster RabbitMQ que se aplican automáticamente a intercambios, colas y enlaces para realizar acciones predefinidas cuando se cumplen condiciones específicas. Esto simplifica la gestión, aumenta la eficiencia y garantiza la coherencia.
Las políticas se pueden utilizar de muchas maneras, incluida la duplicación de colas, el tiempo de vencimiento, la longitud máxima de los mensajes, las colas de mensajes no entregados, etc. Al establecer políticas, puede aplicar automáticamente la misma configuración en varios nodos de un clúster sin tener que realizar cambios de configuración manuales para cada nodo.

A continuación se muestran algunos usos comunes de las estrategias:

  1. Política de cola espejo: le permite configurar automáticamente la cola como cola espejo cuando se declara la cola, logrando así una copia de seguridad con redundancia de mensajes y alta disponibilidad.

  2. Política de caducidad de la cola: le permite establecer el tiempo de caducidad de los mensajes en la cola. Cuando el mensaje caduque, RabbitMQ lo eliminará automáticamente de la cola.

  3. Política de longitud máxima de mensajes: le permite limitar la longitud máxima de los mensajes en la cola. Cuando el número de mensajes en la cola alcanza la longitud máxima establecida, los mensajes nuevos se descartarán o procesarán como mensajes no entregados.

  4. Estrategia de cola de mensajes fallidos: le permite enviar automáticamente mensajes que no se pueden consumir en la cola a la cola de mensajes fallidos para su posterior procesamiento.

  5. Política de cola de prioridad: le permite establecer prioridades para los mensajes y colocarlos en diferentes colas según la prioridad.

etc.

Para establecer políticas, puede usar la interfaz de administración del complemento RabbitMQ Management o puede usar una herramienta de línea de comandos como rabbitmqctl. Al establecer políticas, puede automatizar la administración y la configuración, reducir la necesidad de operaciones manuales y mejorar la confiabilidad y el mantenimiento del sistema.

❓: Cómo configurar la política

imagen.png
Descripción de parámetros:

  1. Patrón:

    • Este es un patrón que se utiliza para hacer coincidir intercambiadores, colas y enlaces. Puede utilizar caracteres comodín *y #.
    • Por ejemplo, puede utilizar para amq.*hacer coincidir todos amq.los intercambiadores que comiencen con .
  2. Definición:

    • Este es un objeto JSON que contiene la definición de política. Los parámetros y valores específicos dependen del tipo de política que desee configurar.
    • Por ejemplo, si está creando una política de cola reflejada, puede definir ha-modeotros parámetros relacionados.
    1. ha-mode (modo de cola espejo):

      • Uso: ha-mode = allo ha-mode = exactlyoha-mode = nodes
      • Función: Defina si la cola es una cola espejo para lograr una copia de seguridad con redundancia de mensajes y alta disponibilidad.
      • all: establezca la cola como una cola reflejada y cree una espejo de la cola en todos los nodos.
      • exactly: establezca la cola como una cola reflejada y especifique la cantidad de nodos reflejados que se crearán.
      • nodes: establezca la cola como una cola reflejada y especifique los nodos en los que se creará la duplicación.
    2. ha-params (parámetros de cola espejo):

      • uso:ha-params = ["node1", "node2"]
      • Función: se utiliza para ha-mode = nodesespecificar la lista de nodos para crear una duplicación de cola.
    3. expira (tiempo de vencimiento del mensaje):

      • Uso: expires = 3600000(milisegundos)
      • Función: Defina el tiempo de vencimiento de los mensajes en la cola, y los mensajes vencidos se eliminarán automáticamente.
    4. message-ttl (tiempo de supervivencia del mensaje):

      • Uso: message-ttl = 60000(milisegundos)
      • Función: Defina el tiempo de supervivencia de los mensajes en la cola. Los mensajes que excedan este tiempo se eliminarán automáticamente.
    5. longitud máxima (número máximo de mensajes):

      • uso:max-length = 1000
      • Función: Limitar el número máximo de mensajes en la cola. Cuando el número de mensajes en la cola alcanza el valor especificado, los nuevos mensajes se descartarán o procesarán como mensajes fallidos.
    6. intercambio de letras muertas (intercambiador de letras muertas):

      • uso:dead-letter-exchange = dlx_exchange
      • Función: Especifique el intercambio al que se deben enviar los mensajes de la cola de mensajes no entregados.
    7. clave de enrutamiento de mensajes no entregados (clave de enrutamiento de mensajes no entregados):

      • uso:dead-letter-routing-key = dlx_routing_key
      • Función: Especifique la clave de enrutamiento que deben usar los mensajes en la cola de mensajes no entregados.
    8. bytes de longitud máxima (número máximo de bytes de mensaje):

      • uso:max-length-bytes = 102400
      • Función: Limitar el número total de bytes de mensajes en la cola. Cuando el número total de bytes de mensajes en la cola alcanza el valor especificado, los nuevos mensajes se descartarán o procesarán como mensajes no entregados.
    9. modo diferido (modo de retardo):

      • Uso: lazy-mode = onolazy-mode = off
      • Función: habilita o deshabilita el modo de retardo, que se utiliza para guardar mensajes en la cola en el disco para reducir el uso de memoria.
    10. modo de cola (modo de cola):

      • Uso: queue-mode = lazyoqueue-mode = default
      • Función: Defina el modo de trabajo de la cola, lazyindicando el modo de retraso y defaultel modo predeterminado.
  3. Prioridad:

    • Se utiliza para especificar la prioridad de la política. Cuando varias políticas coinciden, la política con mayor prioridad anulará la política más baja.
    • La prioridad generalmente se expresa como un número entero, y los valores más pequeños indican una prioridad más alta.
  4. Aplicar para:

    • Se utiliza para especificar a qué objetos (intercambios, colas, enlaces) se debe aplicar la política.
    • Puedes elegir "intercambios", "colas" o "todos".

La razón por la que digo lo anterior es principalmente para implementar nuestro clúster, que es la estrategia que agregué, porque si la cola se crea por separado, de forma predeterminada solo pertenece al nodo actual, por lo que debe depender de la duplicación o esta estrategia. conseguir

docker-compose construye un clúster RabbitMQ

Crear archivo docker-compose.yml

version: '3'
services:
  rabbitmq-node1:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node1
    hostname: rabbitmq-node1
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1.pid"
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node1  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
  rabbitmq-node2:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node2
    hostname: rabbitmq-node2
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node2.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1"
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    ports:
      - "5673:5672"
      - "15673:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node2  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
    depends_on:
      - rabbitmq-node1
  rabbitmq-node3:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node3
    hostname: rabbitmq-node3
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node3.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1"
    ports:
      - "5674:5672"
      - "15674:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
#被废弃了  - RABBITMQ_ERLANG_COOKIE=97c78681-3394-208f-9d04-b86cb68f9c60 # 为了确保集群节点通信,需要设置相同的 erlang-cookie
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node3  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
    depends_on:
      - rabbitmq-node1
networks:
  rabbitmq-network:
    driver: bridge

⚠: El montaje utilizado aquí, el primero es el complemento de cola de retardo implementado, el segundo es necesario para el montaje cookie, esto cookiepuede ser arbitrario, el tercero es el archivo de configuración

Algunas de las declaraciones anteriores se explican a continuación.

  1. entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/[email protected] && rabbitmqctl join_cluster rabbit@rabbitmq-node1": Espere y únase al clúster
  2. RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange: Especifique el complemento que se va a cargar y cargue el descargado previamente
  3. RABBITMQ_DELAYED_MESSAGE_ENABLED=true: Iniciar función de retardo de mensaje

Crear archivo Rabbitmq.conf

# 配置内容
# 这个配置的作用是禁用 "guest" 用户对本地(loopback)的访问。
loopback_users.guest = false
listeners.tcp.default = 5672
# 这个配置指定了集群节点之间的发现机制。`rabbit_peer_discovery_classic_config` 表示使用经典配置方式来进行节点发现。
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
# 这个配置指定了集群中的节点,`rabbit@rabbitmq-node1` 表示第一个节点的名称和主机地址。
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3

⚠: Los archivos anteriores deben estar en el mismo directorio.

Cómo implementar la conexión de clúster en el proyecto

Si se trata de implementar una conexión de clúster, esto sigue siendo diferente en go y java, pero podemos usar nginx para realizar el equilibrio de carga, o RabbitMQ también tiene su propia implementación.

⚠: Para lograr esto, es necesario agregar el módulo de transmisión al módulo nginx, lo mismo que conectarse a mysql.

Supongo que te gusta

Origin blog.csdn.net/Mrxiao_bo/article/details/133380722
Recomendado
Clasificación