Estoy tratando de alejarse de SQS para RabbitMQ para el servicio de mensajería. Yo estoy buscando para construir estable y de alta disponibilidad de servicio de cola. Por ahora voy con el grupo.

Implementación Actual ,
Tengo tres EC2 máquinas con RabbitMQ con la gestión de plugin instalado en un IAM , y luego me explícitamente ir a cada uno de la máquina y agregar

sudo rabbitmqctl join_cluster [email protected]<hostnameOfParentMachine>

Con HECTÁREAS de propiedad establecidos para todos y la sincronización de las obras. Y un equilibrador de carga en la parte superior con un DNS asignado. Hasta ahora, esta cosa funciona.

Espera que la Implementación: Crear una autoescala agrupado entorno donde las máquinas que ir Arriba/Abajo tiene que unirse a Quitar el clúster de forma dinámica. ¿Cuál es la mejor manera de lograr esto? Por favor, ayudar.

  • autoescala basado en? cloudwatch?
  • Sí . Pero, a continuación, la escala de instancia ha de unirse al clúster de forma automática.
  • Tenga cuidado – Erlang en modo agrupado no es tolerante a la red de particiones (incluyendo las particiones), y puede causar algunos problemas; tuve regular micro-particiones en AWS que iba a traer a mi clúster de abajo. Yo recomendaría la ejecución de una puesta en escena de clúster para un tiempo antes de comprometerse a que para la producción.
InformationsquelleAutor Karthik | 2015-07-10

2 Comentarios

  1. 11

    Yo tenía una configuración similar de 2 años.

    Decidí usar amazon VPC, por defecto mi diseño tenía dos RabbitMQ instancias siempre corriendo, y configurados en cluster (llamado maestro-nodos).
    El rabbitmq cluster fue detrás de un internas de amazon equilibrador de carga.

    He creado un IAM con RabbitMQ y plug-in de administración configurado (llamado «master-AMI») y, a continuación, he configurado la autoescala reglas.

    si una autoescala de alarma se eleva a un nuevo maestro-AMI se puso en marcha.
    Este AMI ejecuta el seguimiento de secuencia de comandos de la primera vez que se ejecuta:

    #!/usr/bin/env python
    import json
    import urllib2,base64
    
    if __name__ == '__main__':
        prefix =''
        from subprocess import call
        call(["rabbitmqctl", "stop_app"])
        call(["rabbitmqctl", "reset"])
        try:
            _url = 'http://internal-myloadbalamcer-xxx.com:15672/api/nodes'
            print prefix + 'Get json info from ..' + _url
            request = urllib2.Request(_url)
    
            base64string = base64.encodestring('%s:%s' % ('guest', 'guest')).replace('\n', '')
            request.add_header("Authorization", "Basic %s" % base64string)
            data = json.load(urllib2.urlopen(request))
            ##if the script got an error here you can assume that it's the first machine and then 
            ## exit without controll the error. Remember to add the new machine to the balancer
            print prefix + 'request ok... finding for running node'
    
    
            for r in data:
                if r.get('running'):
                    print prefix + 'found running node to bind..'
                    print prefix + 'node name: '+ r.get('name') +'- running:' + str(r.get('running'))
                    from subprocess import call
                    call(["rabbitmqctl", "join_cluster",r.get('name')])
                    break;
            pass
        except Exception, e:
            print prefix + 'error during add node'
        finally:
            from subprocess import call
            call(["rabbitmqctl", "start_app"])
    
    
        pass

    Las secuencias de comandos utiliza la API HTTP «http://internal-myloadbalamcer-xxx.com:15672/api/nodes» para encontrar los nodos, a continuación, elija uno y se une a la nueva AMI para el clúster.

    Como HA de política decidí usar este:

    rabbitmqctl set_policy ha-two "^two\." ^
       "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"
    

    Bien, la combinación es «relativamente» fácil, el problema es decidir cuándo se puede retirar el nodo del clúster.

    No se puede quitar un nodo que se basa en autoescala de la regla, ya que puede tener que los mensajes de las colas que tienen que consumir.

    Me decidí a ejecutar una secuencia de comandos ejecutando periódicamente a los dos master-nodo instancias que:

    • comprueba el recuento de mensajes a través de la API de http://node:15672/api/queues
    • si el recuento de mensajes para todos los de la cola es igual a cero, puedo eliminar la instancia del equilibrador de carga y, a continuación, a partir de la rabbitmq clúster.

    Esto es a grandes rasgos lo que yo hice, espero que ayude.

    [EDITAR]

    He editado la respuesta, ya que existe este plugin que puede ayudar:

    Sugiero ver este: https://github.com/rabbitmq/rabbitmq-autocluster

    El plugin ha sido trasladado a un oficial de RabbitMQ repositorio, y puede fácil resolver este tipo de problemas

    • El script funciona como un encanto! un millón de gracias . Con respecto a tomar el nodo lejos fro y equilibrador de carga de im utilizando la autoescala política basada en la utilización de la memoria que yo.e <40% .
    • Yo era capaz de hacer que a través de custom métrica para la memoria como por aws documentación a la medida métrica . Gracias por el código .
    • No es el punto de la agrupación tales que puede eliminar un nodo, ya que los datos se replican entre los nodos?
    • puede por favor compartir cómo manejaste con la eliminación de los nodos del cluster de forma automática?
    • Sí que es algo que me puso en la pendiente, mientras que correr contra el tiempo y he encontrado tiempo para mirar en ello todavía. En la actualidad esos estancia como los nodos inactivos en el rabbitmq de la página de administración. 😛 lo siento
    • usted puede limpiar muertos nodos con autocluster plugin, que funcionan muy bien
    • Hola a todos, este post es un poco viejo, estamos trabajando en: github.com/rabbitmq/rabbitmq-autocluster por lo que yo sugiero utilizar a escala en AWS
    • Es agradable ver como un plugin @Gabriele. Sin duda será de utilidad.

  2. 1

    Recientemente hemos tenido un problema similar.

    Intentamos utilizar https://github.com/rabbitmq/rabbitmq-autocluster, pero encontraron demasiado complicado para nuestro caso de uso.

    He creado opción de modificar la configuración de spin X RabbitMQ nodos Y subredes (zonas de disponibilidad) uso de Autoscaling Grupo.

    TL;DR https://github.com/ulamlabs/rabbitmq-aws-cluster

    La configuración crea función de IAM para permitir que los nodos de detección automática de todos los otros nodos en la Autoescala Grupo.

Dejar respuesta

Please enter your comment!
Please enter your name here