Come impostare autoscaling RabbitMQ Cluster AWS

Sto cercando di allontanarsi da SQS a RabbitMQ per il servizio di messaggistica. Sto cercando di costruire una stabile ad alta disponibilità del servizio. Per ora sto andando con il cluster.

Implementazione Corrente ,
Ho tre EC2 macchine con RabbitMQ con gestione plugin installati in un AMI , e poi ho esplicitamente andare per ogni macchina e aggiungere

sudo rabbitmqctl join_cluster [email protected]<hostnameOfParentMachine>

Con HA proprietà è impostata per tutti e la sincronizzazione funziona. E un sistema di bilanciamento del carico sulla parte superiore con un DNS assegnati. Finora funziona questa cosa.

Previsto Attuazione: Creare un autoscaling ambiente cluster, dove le macchine che vanno su/Giù gilda/Rimuovere il cluster in modo dinamico. Qual è il modo migliore per raggiungere questo obiettivo? Si prega di aiuto.

  • autoscaling base? ur?
  • Sì . Ma poi la scalata dell’istanza di partecipazione al cluster automaticamente.
  • Attenzione, Erlang in modalità cluster non è tollerante alla rete partizioni (compresi i micro-partizioni), e può causare alcuni problemi, ho dovuto regolare micro-partizioni su AWS, che avrebbe portato il mio cluster verso il basso. Vorrei raccomandare l’esecuzione di una messa in scena cluster per un po ‘ prima di confermarlo per la produzione.
InformationsquelleAutor Karthik | 2015-07-10

 

2 Replies
  1. 12

    Avevo una configurazione simile 2 anni fa.

    Ho deciso di utilizzare amazon VPC, per impostazione predefinita, il mio progetto aveva due RabbitMQ istanze sempre di corsa, e configurati in cluster (master-nodi).
    Il cluster rabbitmq era dietro un interno di amazon di bilanciamento del carico.

    Ho creato un AMI con RabbitMQ e di gestione dei plug-in configurato (chiamato “master-AMI”), e poi ho configurato l’autoscaling regole.

    se un autoscaling viene generato l’allarme di un nuovo master-AMI è lanciato.
    Questo AMI esegue il follow-script per la prima volta viene eseguita:

    #!/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

    Gli script utilizza l’API HTTP “http://internal-myloadbalamcer-xxx.com:15672/api/nodes” per trovare i nodi, quindi scegliere uno e lega i nuovi AMI per il cluster.

    Come HA politica ho deciso di usare questo:

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

    Bene, il join è “abbastanza” semplice, il problema è decidere quando è possibile rimuovere il nodo del cluster.

    Non è possibile rimuovere un nodo di base autoscaling regola, perché si può avere messaggi per le code che si deve consumare.

    Ho deciso di eseguire uno script di eseguire periodicamente ai due master-nodo istanze:

    • controlla il contatore messaggi tramite l’API http://node:15672/api/queues
    • se il contatore messaggi per tutte coda è zero, posso rimuovere l’istanza dal sistema di bilanciamento del carico e quindi dal cluster rabbitmq.

    Questo è sostanzialmente quello che ho fatto, spero che aiuta.

    [MODIFICA]

    Ho modificato la risposta, dal momento che c’è questo plugin che possono aiutare:

    Suggerisco di vedere questo: https://github.com/rabbitmq/rabbitmq-autocluster

    Il plugin è stato spostato ufficiale RabbitMQ repository, e può facilmente risolvere questo tipo di problemi

    • Il tuo script funziona come un fascino! grazie una tonnellata . Per quanto riguarda l’assunzione di nodo di distanza dal sistema di bilanciamento del carico im utilizzando l’autoscaling politica basata sull’utilizzo della memoria io.e <40% .
    • Sono stato in grado di farlo via metrica personalizzata per memoria per aws documentazione metrica personalizzata . Grazie per il codice .
    • Non è il punto di clustering, in modo tale che può rimuovere un nodo, in quanto i dati vengono replicati tra i nodi?
    • potete per favore spiegare come hai fatto a gestire con la rimozione di nodi del cluster automaticamente?
    • Sì che è qualcosa che ho messo in sospeso durante la corsa contro il tempo e havent trovato il tempo di guardarlo ancora. Attualmente quelli soggiorno inattivi i nodi del rabbitmq pagina di amministrazione. 😛 mi dispiace
    • è possibile pulire morti nodi con autocluster plugin, funziona molto bene
    • Ciao a tutti, questo post è un po ‘ vecchio, ci stanno lavorando su: github.com/rabbitmq/rabbitmq-autocluster quindi suggerisco di utilizzare per la scala su AWS
    • Bello vedere come un plugin @Gabriele. Sarà sicuramente utile.

  2. 1

    Abbiamo recentemente avuto un problema simile.

    Abbiamo cercato di utilizzare https://github.com/rabbitmq/rabbitmq-autocluster, ma è troppo complicata per il nostro caso d’uso.

    Ho creato terraforma configurazione di spin X RabbitMQ nodi Y subnet (zone di disponibilità) utilizzando Autoscaling Gruppo.

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

    La configurazione crea IAM ruolo per consentire i nodi di individuazione automatica di tutti gli altri nodi del Autoscaling Gruppo.

Lascia un commento