Ho avuto una configurazione simile 2 anni fa.
Ho deciso di utilizzare amazon VPC, per impostazione predefinita il mio progetto aveva due istanze RabbitMQ sempre in esecuzione e configurate in cluster (dette master-node). Il cluster rabbitmq era dietro un internal amazon load balancer.
Ho creato un AMI con RabbitMQ e il plug-in di gestione configurato (chiamato "master-AMI"), quindi ho configurato le regole di scalabilità automatica.
se viene generato un allarme di autoscaling, viene avviato un nuovo master-AMI. Questa AMI esegue lo script seguito viene eseguito per la prima volta:
#!/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 una e lega il nuovo AMI al cluster.
Come politica HA ho deciso di usare questo:
rabbitmqctl set_policy ha-two "^two\."^
"{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"
Ebbene, il join è “abbastanza” facile, il problema è decidere quando è possibile rimuovere il nodo dal cluster.
Non è possibile rimuovere un nodo in base alla regola di scalabilità automatica, poiché è possibile avere messaggi sulle code che si devono consumare.
ho deciso di eseguire uno script periodicamente in esecuzione per le due istanze master-nodo che:
- controlli i messaggi contano tramite l'API http://node:15672/api/queues
- se i messaggi contano per tutti coda è pari a zero, posso rimuovere l'istanza dal servizio di bilanciamento del carico e quindi dal cluster rabbitmq.
Questo è ampiamente quello che ho fatto, spero che sia d'aiuto.
[EDIT]
Ho modificato la risposta, poiché non v'è questo plugin che può aiutare:
suggerisco di vedere questo: https://github.com/rabbitmq/rabbitmq-autocluster
Il plugin è stato spostato al funzionario Repository RabbitMQ, e può facilmente risolvere questo tipo di problemi
basato su scala automatica? CloudWatch? – Gabriele
Sì. Ma poi l'istanza in scala deve unirsi automaticamente al cluster. – Karthik
Attenzione - Erlang in modalità cluster non è tollerante alle partizioni di rete (incluse le micro-partizioni) e potrebbe causare alcuni problemi; Avevo regolari micro-partizioni su AWS che avrebbero ridotto il mio cluster. Raccomanderei di eseguire un cluster di gestione temporanea per un po 'prima di impegnarmi per la produzione. –