Jak automatycznie usunąć martwy węzeł z klastra RabbitMQ

11

Planuję utworzyć klaster RabbitMQ za pomocą Ansible na AWS VPC z wewnętrznym modułem równoważenia obciążenia Amazon jako interfejsem do połączenia z nim punktów.

Wszelkie sugestie, jak usunąć martwy węzeł z klastra RabbitMQ w oparciu o regułę automatycznego skalowania, w której węzły mogą przesuwać się w górę lub w dół, lub jeśli używasz wystąpień punktowych?

Kiedy węzeł przestaje działać, RabbitMQ nie usuwa go automatycznie z listy replikacji, co widać Node not runningw interfejsie zarządzania.

Udało mi się automatycznie dołączyć do klastra skalowane wystąpienie za pośrednictwem Ansible i danych użytkownika.

Schemat infrastruktury

Berlin
źródło
@ Pierre.Vriens, zmieniłem tylko na 1 pytanie, dzięki.
Berlin
Merci! Mam nadzieję, że nie zniszczyłeś pozostałych 4 (lub mniej więcej) pytań. Może zachowaj je jako pytanie folowup, o ile nadal są aktualne?
Pierre.Vriens
Tak, pytania są nadal aktualne, ale to najważniejsze. Wyślę kolejne pytanie później :) dzięki!
Berlin,
1
@Berlin Narysowałem schemat, który reprezentuje to, co myślę, że opisujesz, jeśli miałeś na myśli coś innego, proszę daj mi znać, a ja się dostosuję.
Richard Slater,
1
Hej @ Pierre.Vriens - nie mam nic przeciwko, że miałem kilka minut i chciałem wyjaśnić swoje założenie, teoretycznie mógłbym dodać je do mojej odpowiedzi i równie dobrze mogę to zrobić.
Richard Slater,

Odpowiedzi:

4

Rozważ użycie wtyczki rabbitmq / rabbitmq-autocluster :

Wtyczka RabbitMQ, która automatycznie grupuje węzły za pomocą wielu mechanizmów wykrywania peer:

  • Konsul ,
  • etcd2
  • Rekordy DNS A.
  • Tagi AWS EC2
  • Grupy skalowania automatycznego AWS

Aby uzyskać tę konfigurację, istnieje sporo konfiguracji, w tym ustawianie zasad IAM i dodawanie znaczników EC2 do instancji, które chcesz być członkiem klastra.

Jeśli miałbyś korzystać z Autoskalowania grup AWS, dodałbyś do swojego rabbitmq.config:

[
  {rabbit, [ ... ]},
  {autocluster, [
    {backend, aws},
    {aws_autoscaling, true},
    {aws_ec2_region, "us-west-2"}
  ]}
].

Jeśli nie korzystasz z grup skalowania AWS, nadal możesz osiągnąć pożądany wynik za pomocą znaczników w instancjach EC2:

[
  {rabbit, [ ... ]},
  {autocluster, [
    {backend, aws},
    {aws_ec2_tags, [{"region", "us-west-2"}, {"service", "rabbitmq"}]},
    {aws_ec2_region, "us-east-1"},
    {aws_access_key, "..."},
    {aws_secret_key, "..."}
  ]}
].

Biorąc to wszystko pod uwagę, zdecydowanie zalecam używanie Consul by HashiCorp jako mechanizmu wykrywania usług, na dłuższą metę zyskujesz znacznie większą elastyczność, jeśli chodzi o oddzielenie części systemu od siebie.

Richard Slater
źródło
dziękuję za szczegółowe wyjaśnienie i schemat, więc AFAIK rabbitmq/rabbitmq-autocluster pluginbędzie wiedział również, aby usunąć węzeł z listy replikacji, gdy węzeł nie działa, jeszcze jedno, jeśli mogę zapytać, pomyślałem, aby zacząć od 2-nodeklastra, czy sugerujesz zacząć od 3-nodeklastra jak opisano na schemacie za pomocą zasady `rabbitmqctl set_policy ha-all" "{{ha-mode": "all", "ha-sync-mode": "automatic"} ''? czy powinienem opublikować to w innym pytaniu?
Berlin,
1
Możliwe, że kolejne pytanie, ponieważ formatowanie komentarzy nie jest wcale takie łatwe w użyciu. Zawsze doradzałem klientom, aby podczas wdrażania chmury korzystali z większej liczby małych instancji, a nie odwrotnie. Wynika to z faktu, że w chmurze oczekuje się awarii, jeśli masz klaster 2-węzłowy, a 1 awaria, straciłeś 50% swojej pojemności, natomiast jeśli masz klaster 3-węzłowy i 1 awaria, tracisz tylko 33%.
Richard Slater
Skonfigurowałem mój klaster rabbitmq/rabbitmq-autocluster plugini działa całkiem nieźle, jednak gdy węzeł nie działa RabbitMQ nie usuwa go z listy replikacji, wiesz, dlaczego?
Berlin
1
Czy włączono opcję konfiguracji czyszczenia klastra?
Richard Slater,
dzięki, znalazłem to https://github.com/aweber/rabbitmq-autocluster/wiki/General-Settings, spróbuję tego.
Berlin