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
Autoscaling basierend auf? Cloudwatch? – Gabriele
Ja. Dann muss die skalierte Instanz automatisch dem Cluster beitreten. – Karthik
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. –