Clúster RabbitMQ
Si un productor o consumidor de mensajes se conecta al nodo 1 a través del cliente amqp-client para publicar o suscribirse a mensajes, entonces los mensajes en el clúster solo son relevantes para el nodo 1.
Si el productor del mensaje está conectado al nodo 2 o al nodo 3, y los datos completos de la cola 1 no están en estos dos nodos, entonces la función de estos dos nodos es enviar el mensaje al servidor según en los metadatos de estos dos nodos. El nodo 1 envía el mensaje y el mensaje resultante permanece almacenado en la cola 1 del nodo 1.
Un clúster RabbitMQ es una agrupación lógica de uno o más nodos, cada uno de los cuales tiene usuarios, hosts virtuales, colas, conmutadores, enlaces, parámetros de tiempo de ejecución y otros estados distribuidos.
Algunos sistemas distribuidos tienen nodos líderes y nodos seguidores. Para RabbitMQ, todos los nodos de un clúster RabbitMQ son iguales.
Un clúster RabbitMQ se puede formar de varias maneras:
Los nodos RabbitMQ están vinculados a puertos para aceptar conexiones de clientes y herramientas CLI. Otros procesos y herramientas (como SELinux) pueden impedir que RabbitMQ se vincule al puerto. Cuando esto sucede, el nodo no podrá iniciarse.
Las herramientas CLI, las bibliotecas cliente y los nodos RabbitMQ también abren conexiones (sockets TCP del cliente). Los firewalls impiden que los nodos y las herramientas CLI se comuniquen entre sí. Asegúrese de que los siguientes puertos sean accesibles:
Los nodos RabbitMQ y las herramientas CLI (como Rabbitmqctl) utilizan cookies para determinar si pueden comunicarse entre sí. Para que dos nodos se comuniquen, deben tener la misma clave compartida, una cookie Erlang. Generalmente se almacena en un archivo local. Solo el propietario debe poder acceder al archivo (por ejemplo, con permisos UNIX 600 o similares).
En los sistemas UNIX, las cookies normalmente se encuentran en /var/lib/rabbitmq/.erlang.cookie (utilizado por el servidor) y $HOME/.erlang.cookie (utilizado por la herramienta CLI).
Los nodos RabbitMQ se dirigen entre sí mediante nombres de host
lt;! == Todos los hosts ejecutan ==gt;
lt;! == Todos los hosts ejecutan ==gt;
lt;! == Ejecutar ==gt en todos los hosts;
Archivo de configuración predeterminado/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.17/ebin/rabbit.app
lt; == ejecución del host node01 ==gt;
lt;! == el host node02 se ejecuta ==gt;
lt;!== el host node03 se ejecuta ==gt;
lt;!== todos los hosts==gt;
Porque la sincronización de metadatos del clúster RabbitMQ se basa en el esquema de disfrute de cookies ***
Ruta del archivo/var/lib/rabbitmq/.erlang.cookie
lt;! == ejecución del host nodo02, nodo03 ==gt;
lt;! == Cualquier host se ejecuta ==gt;
Los nodos se dividen en: nodos de disco y nodos RAM
Los nodos RAM son un caso especial que se puede utilizar para mejorar la cola, el intercambio o el enlace. abandono Mayor rendimiento del clúster. Se recomienda oficialmente utilizar únicamente nodos de disco en la mayoría de los casos.
Si el clúster está lleno de nodos RAM, el clúster se detendrá, no podrá iniciarse de nuevo y se perderán todos los datos
Consejo oficial: la duplicación de cola clásica se eliminará en un versión futura; considere utilizar una cola de quórum o una cola clásica no replicada
Cada cola espejo consta de una copia líder y una o más copias espejo. El nodo donde se encuentra el líder se convertirá en el líder. nodo. Todas las operaciones para una cola determinada se aplican primero al nodo líder de la cola y luego se propagan a los nodos espejo.
Si el nodo líder que aloja una cola falla, el espejo más antiguo se promoverá al nuevo nodo líder siempre que esté sincronizado.
Las colas permiten la duplicación a través de políticas y su modelo de política es el siguiente:
Cada vez que cambia la política de una cola, hará todo lo posible para mantener su duplicación existente y aplicar la nueva política.
La cola espejo se puede configurar a través de la política administrador-gt en la página web o mediante comandos.
Interfaz de administración:
Línea de comando:
Para evitar que un nodo en el clúster aloje la mayor parte de la cola líder, lo que resulta en una carga alta, la cola líder debe ser razonable Distribuido uniformemente en cada nodo del clúster. Hay tres estrategias de nodo que se pueden usar para controlar la distribución de las colas líderes. Estas estrategias se pueden configurar definiendo el parámetro queue_master_locator en el archivo Rabbitmq.conf.
La modificación de la estrategia de nodo puede causar colas líderes existentes. para no incluirse en la nueva estrategia Para evitar la pérdida de mensajes, RabbitMQ retendrá el líder existente hasta que se sincronice al menos otro espejo. Una vez que se produzca la sincronización, el consumidor se desconectará del líder y deberá volver a conectarse.
Si el líder falla, el proceso para actualizar otros espejos al líder es el siguiente:
Si el consumidor usa el modo de reconocimiento automático, los mensajes pueden perderse. Esto no es diferente de las colas no reflejadas: el corredor asume que el mensaje ha sido reconocido una vez que se ha enviado al consumidor en modo de reconocimiento automático.
Si el cliente se desconecta repentinamente, es posible que nunca reciba el mensaje. En el caso de colas reflejadas, es posible que esos clientes nunca reciban los mensajes enviados a los consumidores en modo de reconocimiento automático y, si el líder muere, un nuevo líder no lo volverá a poner en cola. Dado que lo más probable es que el cliente consumidor esté conectado a un nodo superviviente, las notificaciones de cancelación del consumidor ayudan a identificar cuándo se produce dicho evento. Por supuesto, en aplicaciones prácticas, si la seguridad de los datos no es tan importante como el rendimiento, entonces el modelo de confirmación automática también es un enfoque factible.
Los nodos pueden unirse al clúster en cualquier momento. Dependiendo de la configuración de la cola, cuando un nodo se une al clúster, la cola puede agregar un espejo en el nuevo nodo. En este punto, la nueva imagen estará vacía: no contendrá ningún contenido existente en la cola. Dicho espejo recibirá nueva información publicada en la cola y, por lo tanto, reflejará con precisión la cola de la cola espejo a lo largo del tiempo. A medida que los paquetes salen de la cola espejo, el tamaño del encabezado de la cola de los paquetes perdidos del nuevo espejo también se reducirá hasta que el contenido final del espejo sea completamente consistente con el contenido LEADER. En este punto, el espejo puede considerarse completamente sincronizado.
Las réplicas recién agregadas no proporcionan formas adicionales de redundancia o disponibilidad del contenido de la cola que existían antes de que se agregara la réplica, a menos que las colas estén sincronizadas explícitamente. Debido a que las colas pueden dejar de responder cuando se produce una sincronización explícita, es mejor dejar que las colas activas que están agotando mensajes se sincronicen de forma natural y solo sincronizar explícitamente las colas inactivas.
Al habilitar la duplicación automática de colas, considere el conjunto de datos de disco esperado para la cola en cuestión. Las colas con grandes conjuntos de datos (como decenas de gigabytes o más) deben replicarse en espejos recién agregados, lo que puede suponer una carga enorme para los recursos del clúster (como el ancho de banda de la red y la E/S del disco).
Para ver el estado de un mirror (si está sincronizado):
Para sincronizar manualmente una cola:
Para cancelar una sincronización en curso:
Si detiene el nodo RabbitMQ que contiene el líder de la cola espejo, algunos espejos en otros nodos serán promovidos a líder. Si continúa deteniendo el nodo, llegará a un punto en el que la cola reflejada ya no tiene espejo: solo existe en un nodo, en el que es el líder. Si se cierra el último nodo restante, pero la cola reflejada se declara persistente, los mensajes persistentes en la cola sobrevivirán al reinicio del nodo.
Sin embargo, el espejo actualmente no tiene forma de saber si el contenido de su cola se ha desviado del LÍDER al que se ha reincorporado. Por lo tanto, cuando el espejo vuelve a unirse a la cola de espejos, descarta cualquier contenido local persistente que tuviera y comienza desde cero.
De forma predeterminada, RabbitMQ se negará a permitir que el nodo líder provoque una duplicación asincrónica durante un apagado controlado (es decir, detenga explícitamente el servicio RabbitMQ o apague el sistema operativo) para evitar la pérdida de mensajes; Toda la cola se desactivará como si el espejo asíncrono no existiera.
El cierre incontrolado del nodo líder (es decir, un fallo del servidor o del nodo o una interrupción de la red) seguirá activando la promoción de réplicas asíncronas.
Si desea que la cola líder se mueva a un espejo asíncrono bajo cualquier circunstancia (es decir, elegiría la disponibilidad de la cola en lugar de evitar la pérdida de mensajes debido a una actualización del espejo asíncrono), desactive la política ha-promote La clave se establece en Siempre en lugar de establecerse en un valor más alto que el predeterminado al sincronizar.
Si la palabra clave de política ha-promote-on-failure está configurada en when-synced, los mirrors no sincronizados no se actualizarán incluso si la palabra clave ha-promote-on-shutdown está configurada en siempre. Esto significa que si el nodo líder falla, la cola dejará de estar disponible hasta que el nodo líder se recupere. Si la cola líder se pierde permanentemente, la cola no estará disponible a menos que se elimine (con todo su contenido eliminado) y se vuelva a declarar.
El líder de una cola puede perderse cuando todos los espejos de la cola están caídos. En funcionamiento normal, el último nodo de la cola que se cerrará será el líder, y ese nodo seguirá siendo el líder cuando se inicie nuevamente (porque puede haber recibido mensajes que otros espejos no vieron).
Sin embargo, cuando llamas a Rabbitmqctl Forget_cluster_node, RabbitMQ intentará encontrar un espejo actualmente detenido para cada cola que tenga un líder en el nodo que olvidamos y lo "promocionará" cuando se inicie nuevamente. Esta imagen se convierte en el nuevo líder. Si hay varios espejos candidatos, se seleccionará el espejo detenido más recientemente.
Es importante comprender que RabbitMQ solo puede promover una duplicación detenida durante Forget_cluster_node, ya que cualquier duplicación reiniciada borrará su contenido, como se describe en "Detener nodos y sincronizar" más arriba. Por lo tanto, al eliminar un líder faltante de un clúster detenido, debe llamar a Rabbitmqctl Forget_cluster_node antes de iniciar la duplicación nuevamente.