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.

Author: Josh Durham, 2015-07-10

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

 11
Author: Gabriele,
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.

 0
Author: krotkiewicz,
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