Wir haben Docker-Umgebungen mit automatischer Skalierung, in denen wir Consul für die Serviceerkennung verwenden. Diese Umgebungen können alle paar Minuten eine Instanz hinzufügen oder entfernen.
Unsere frühen Konsulentests haben gezeigt, dass es für den Konsul sehr leicht war, sein Quorum zu verlieren. Vielleicht naiv war unser allererstes Experiment ein Setup, bei dem wir auf allen Instanzen einen Consul-Server starten und diesen Consul-Server dem Cluster beitreten lassen. Dieser Teil funktionierte gut.
Consul erntet jedoch nicht schnell erreichbare Knoten schnell (es dauert ungefähr 72 Stunden?) In einer sehr skalierbaren Umgebung, was bedeutet, dass die Liste der Consul-Server ständig wächst und im Laufe der Zeit die meisten von ihnen "nicht erreichbar" sind und zu diesem Zeitpunkt der Cluster verliert sein Quorum.
Wir haben Armons Antwort von vor fast zwei Jahren auf dieses Problem auf GitHub gesehen: https://github.com/hashicorp/consul/issues/454#issuecomment-125767550
Die meisten dieser Probleme werden durch unser Standardverhalten verursacht, einen angemessenen Urlaub zu versuchen. Unser mentales Modell ist, dass Server eine lange Lebensdauer haben und aus keinem anderen Grund als einem unerwarteten Stromausfall oder einer ordnungsgemäßen Wartung heruntergefahren werden. In diesem Fall müssen Sie den Cluster verlassen. Rückblickend war das ein schlechter Standard. Fast all dies kann vermieden werden, indem nur der Consul-Server getötet wird, um den Stromausfall zu simulieren.
Wir haben versucht, die Ausführung dedizierter, langlebiger Knoten zu vermeiden. Beachten Sie, dass wir zu keinem Zeitpunkt N / 2 + 1-Instanzen aus einer Gruppe mit automatischer Skalierung entfernen. Der EC2-Cluster kann zu jedem Zeitpunkt die meisten Knoten erreichen und sollte abstimmen können, ob ein Knoten aus dem Consul-Cluster (oder einem anderen Tool-Cluster) entfernt werden soll.