Jak skonfigurować autoscaling RabbitMQ Cluster AWS
Staram się odejść od SQS do RabbitMQ dla obsługi wiadomości. Chcę zbudować stabilną usługę kolejkowania o wysokiej dostępności. Na razie wybieram cluster.
Obecna Realizacja , Mam trzy maszyny EC2 z RabbitMQ z wtyczką zarządzania zainstalowaną w AMI, a następnie jawnie wchodzę do każdej z maszyn i dodaję
sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>
Z właściwością HA ustawioną na all i synchronizacja działa. I load balancer na szczycie z DNS przydzielony. Jak na razie to działa.
Oczekiwana implementacja : utworzenie klastra automatycznego skalowania, w którym maszyny poruszające się w górę/w dół muszą dynamicznie dołączyć/usunąć klaster. Jaki jest najlepszy sposób, aby to osiągnąć? Proszę o pomoc.
2 answers
2 lata temu miałem podobną konfigurację.
Zdecydowałem się użyć amazon VPC , domyślnie mój projekt miał zawsze uruchomione dwie instancje RabbitMQ i skonfigurowane w klastrze (tzw. master-nodes). Klaster rabbitmq znajdował się za wewnętrznym amazon load balancer.
Stworzyłem AMI z RabbitMQ i wtyczką zarządzania skonfigurowaną (zwaną "master-AMI"), a następnie skonfigurowałem reguły autoscalingu.
Jeśli zostanie wywołany alarm autoskalowania, nowy master-AMI zostanie / align = "left" / AMI wykonuje następujący skrypt przy pierwszym uruchomieniu:
#!/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
Skrypty używają HTTP API " http://internal-myloadbalamcer-xxx.com:15672/api/nodes " aby znaleźć węzły, wybierz jeden i połącz nowy AMI z klastrem.
Jako polityka HA postanowiłem użyć tego:
rabbitmqctl set_policy ha-two "^two\." ^
"{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"
Cóż, połączenie jest "całkiem" łatwe, problemem jest decyzja, kiedy można usunąć węzeł z klastra.
Nie można usunąć węzła w oparciu o regułę autoscalingu, ponieważ możesz mieć Wiadomości do kolejek, które musisz spożywać.
Postanowiłem wykonać skrypt uruchamiany okresowo do dwóch instancji master-node, które:
- sprawdza liczbę wiadomości przez API http://node:15672/api/queues
- jeśli liczba wiadomości dla całej kolejki wynosi zero, mogę usunąć instancję z load balancer, a następnie z klastra rabbitmq.
To jest to, co zrobiłem, mam nadzieję, że pomaga.
[EDIT]
Edytowałem odpowiedź, ponieważ jest ten plugin, który może pomóc:
Proponuję zobaczyć to: https://github.com/rabbitmq/rabbitmq-autocluster
Wtyczka została przeniesiona do oficjalnego repozytorium RabbitMQ i może łatwo rozwiązać tego typu problemy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 16:13:48
Ostatnio mieliśmy podobny problem.
Próbowaliśmy użyć https://github.com/rabbitmq/rabbitmq-autocluster ale okazało się, że to zbyt skomplikowane dla naszego przypadku użycia.
Stworzyłem konfigurację terraform do obracania węzłów X RabbitMQ na podsieciach Y (strefy dostępności) przy użyciu grupy Autoscalingu.
TL;DR https://github.com/ulamlabs/rabbitmq-aws-cluster
Konfiguracja tworzy rolę IAM, aby umożliwić węzłom automatyczne wykrywanie wszystkich innych węzłów w automatycznym skalowaniu Grupa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 06:13:20