7

Ich versuche, von SQS zu RabbitMQ für den Messaging-Dienst zu wechseln. Ich möchte einen stabilen Hochverfügbarkeits-Warteschlangenservice aufbauen. Für jetzt gehe ich mit Cluster.So richten Sie Autoscaling ein RabbitMQ-Cluster AWS

aktuelle Implementierung, Ich habe drei EC2 Maschinen mit RabbitMQ mit dem Management-Plugin in einem AMI installiert ist, und dann gehe ich ausdrücklich jede der Maschine und

sudo rabbitmqctl join_cluster [email protected]<hostnameOfParentMachine> 

Mit HA-Eigenschaft auf alle gesetzt hinzufügen und die Synchronisation funktioniert. Und ein Load-Balancer dazu mit einem DNS zugewiesen. Bis jetzt funktioniert das Ding.

Erwartete Implementierung: Erstellen Sie eine Autoscaling-Clusterumgebung, in der die Computer, die nach oben/unten gehen, dem Cluster dynamisch beitreten/entfernen müssen. Was ist der beste Weg, dies zu erreichen? Bitte helfen Sie.

+0

Autoscaling basierend auf? Cloudwatch? – Gabriele

+0

Ja. Dann muss die skalierte Instanz automatisch dem Cluster beitreten. – Karthik

+1

Vorsicht - Erlang im Clustermodus ist nicht tolerant gegenüber Netzwerkpartitionen (einschließlich Mikropartitionen) und kann einige Probleme verursachen. Ich hatte reguläre Mikropartitionen auf AWS, die meinen Cluster zum Absturz bringen würden. Ich würde empfehlen, einen Staging-Cluster für eine Weile auszuführen, bevor Sie ihn für die Produktion übernehmen. –

Antwort

11

Ich hatte eine ähnliche Konfiguration vor 2 Jahren.

Ich entschied mich, amazon VPC zu verwenden, mein Entwurf hatte standardmäßig zwei RabbitMQ-Instanzen immer ausgeführt und im Cluster (Master-Knoten genannt) konfiguriert. Der rabbitmq Cluster war hinter einem internal amazon load balancer.

I einen AMI erstellt mit RabbitMQ und Management-Plug-in konfiguriert ist („Master-AMI“ genannt), und dann die automatische Skalierung Regeln I konfiguriert.

Wenn ein Autoscaling-Alarm ausgelöst wird, wird ein neuer Master-AMI gestartet. Diese AMI führt die Folge Skript das erste Mal ausgeführt wird:

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

Die Skripte verwendet die HTTP-API „http://internal-myloadbalamcer-xxx.com:15672/api/nodes“ Knoten zu finden, dann ein wählen und bindet die neue AMI zum Cluster.

Als HA Politik habe ich beschlossen, diese zu nutzen:

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

Nun, komme die „ganz“ easy, das Problem ist entscheiden, wenn Sie den Knoten aus dem Cluster entfernen können.

Sie können einen Knoten nicht basierend auf der Autoscaling-Regel entfernen, da Sie Nachrichten für die Warteschlangen haben können, die Sie konsumieren müssen.

I beschlossen, ein Skript periodisch ausgeführt wird, um die beiden Master-Knoteninstanzen auszuführen, dass:

  • prüft die Nachrichten über die API zählen http://node:15672/api/queues
  • , wenn die Nachrichten für alle Warteschlangen-Null-Zählung ist, kann ich Entfernen Sie die Instanz aus dem Load Balancer und dann aus dem rabbitmq-Cluster.

Dies ist weitgehend was ich getan habe, hoffe es hilft.

[EDIT]

ich bearbeitet die Antwort, da dieses Plugin ist, die helfen können:

Ich schlage vor, dies zu sehen: https://github.com/rabbitmq/rabbitmq-autocluster

Das Plugin auf der offiziellen verschoben wurde RabbitMQ Repository und können easly diese Art der Probleme lösen

+0

Ihr Skript funktioniert wie ein Zauber! Danke vielmals . Das Entfernen des Knotens von dem Load Balancer im Verwenden der Autoscaling-Richtlinie basierend auf der Speicherausnutzung, d.h. <40%. – Karthik

+0

Ich konnte dies über benutzerdefinierte Metrik für den Speicher nach AWS-Dokumentation für benutzerdefinierte Metrik tun. Danke für den Code. – Karthik

+3

Ist der Punkt des Clustering nicht so, dass Sie einen Knoten entfernen können, weil die Daten zwischen den Knoten repliziert werden? – Volte

0

Wir haben vor kurzem ähnliches Problem hatte.

Wir haben versucht, https://github.com/rabbitmq/rabbitmq-autocluster zu verwenden, fanden es aber für unseren Anwendungsfall zu kompliziert.

Ich habe Terraform-Konfiguration erstellt, um X RabbitMQ-Knoten in Y-Subnetzen (Verfügbarkeitszonen) mithilfe der Autoscaling-Gruppe zu drehen.

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

Die Konfiguration erstellt IAM Rolle Knoten zu ermöglichen, alle anderen Knoten in der Autoscaling Gruppe selbstständig erkennen.

Verwandte Themen