Ich lege eine Architektur, wo wir statsd und Graphit verwenden werden. Ich verstehe, wie Graphit funktioniert und wie ein einzelner statsd Server damit kommunizieren kann. Ich frage mich, wie die Architektur und Einrichtung für das Skalieren von statsd-Servern funktionieren würde. Würden Sie mehrere Knoten-statsd-Server haben und dann einen zentralen statsd-Server, der zu graphite übergeht? Ich konnte nichts über die Skalierung von Statistiken finden, und jede Idee, wie man mehrere statsd-Server haben könnte, wäre willkommen.Skalierung statsd mit mehreren Servern
Antwort
Ich habe das gleiche Problem im Moment. Ein naives Load-Balancing zwischen mehreren statsds funktioniert offensichtlich nicht, da Keys mit demselben Namen in verschiedenen statsds landen würden und somit falsch aggregiert würden.
Aber es gibt ein paar Optionen für die in einer Umgebung mit statsd, die maßstabs benötigt:
für Zähler MetrikenVerwendung clientseitige Probenahme, wie sie in der statsd Dokumentation beschrieben (dh anstatt jeden senden Ereignis zu statsd, sende nur jedes 10. Ereignis und mache statsd multipliziere es mit 10). Der Nachteil ist, dass Sie für jede Ihrer Metriken manuell eine geeignete Abtastrate festlegen müssen. Wenn Sie zu wenige Werte erfassen, werden Ihre Ergebnisse ungenau. Wenn Sie zu viel probieren, werden Sie Ihre (einzelne) statsd-Instanz beenden.
Erstellen Sie einen benutzerdefinierten Lastenausgleich, der nach metrischen Namen in verschiedene statsds zerlegt, um das Problem der fehlerhaften Aggregation zu umgehen. Jeder von ihnen könnte direkt an Graphite schreiben.
Erstellen Sie einen statsd-Client, der Ereignisse lokal zählt und sie nur als Aggregat an statsd sendet. Dies reduziert den Datenverkehr auf statsd erheblich und macht ihn auch konstant (solange Sie keine weiteren Server hinzufügen). Solange der Zeitraum, in dem Sie die Daten an statsd senden, wesentlich kleiner ist als die eigene flush-Periode von statsd, sollten Sie auch ähnlich genaue Ergebnisse erhalten.
Variation des letzten Punktes, den ich mit großem Erfolg in der Produktion umgesetzt habe: eine erste Schicht aus mehrere verwenden (in meinem Fall lokal) statsds, was wiederum alle Aggregate in einen zentralen statsd, die dann im Gespräch mit Graphit. Die erste Schicht von statsds müsste eine viel kleinere Spülzeit haben als die zweite. Um dies zu tun, benötigen Sie ein statsd-to-statsd-Backend. Da ich genau dieses Problem konfrontiert, schrieb ich eine, die als netzwerk effizient wie möglich zu sein, versucht: https://github.com/juliusv/ne-statsd-backend
Wie es ist, wurde statsd leider nicht eine überschaubare Art und Weise zu skalieren in entworfen (nein, I don‘ t siehe Anpassen der Abtastraten manuell als "handhabbar". Aber die oben genannten Problemumgehungen sollten Ihnen helfen, wenn Sie daran festhalten.
Wenn Sie Zugang zu einem Hardware Load Balancer wie einem F5 BigIP haben (ich könnte mir vorstellen, dass es OSS Software-Implementierungen gibt) und den Hostnamen jedes Hosts in Ihren Metriken enthalten (dh Sie zählen Dinge wie " appname.servername.foo.bar.baz "und aggregieren sie auf der Graphit-Ebene) können Sie den Affinitäts-Load-Balancing der Quelladresse verwenden - er sendet den gesamten Datenverkehr von einer Quelladresse zum selben Zielknoten (innerhalb eines angemessenen Zeitlimits). Solange also jeder Metrikname nur von einem Quellenhost stammt, wird dies das gewünschte Ergebnis erzielen.
Die meisten der Implementierungen ich pro Server-Metriken sah, wie: <env>.applications.<app>.<server>.<metric>
Mit diesem Ansatz Sie lokale statsd Instanzen auf jedes Feld haben können, tun, um die UDP-Arbeit vor Ort und lassen statsd seine Aggregate veröffentlichen Graphit.
Wenn Sie wirklich pro-Server-Metriken nicht brauchen, haben Sie zwei Möglichkeiten:
- Kombinieren verwandten Metriken in der Visualisierungsschicht (zB: by configuring graphiti to do so)
- Verwenden Kohlenstoff Aggregation take care of that
- 1. Webserver mit mehreren virtuellen Servern
- 2. PHPStorm arbeitet mit mehreren Servern
- 3. Stapelverarbeitung auf mehreren Servern
- 4. Kommunikation zwischen mehreren Servern
- 5. $ _POST Array auf Servern mit mehreren Standorten
- 6. kube2sky in kubernetes mit mehreren api-Servern
- 7. GitlabCi Bereitstellung auf mehreren Servern
- 8. Asp.net Webapplikation auf mehreren Servern
- 9. Sync Inhalt auf mehreren Servern
- 10. Verteilte Probleme Skalierung von TCP-Servern auf EC2-Instanzen
- 11. Verbinden mit mehreren IRC-Servern mit ExIrc (Elixir)?
- 12. Code in mehreren SVN-Servern halten
- 13. Marklogic DB-Status von mehreren Servern extrahieren?
- 14. replizierte zwischengespeicherte Daten zwischen mehreren Servern
- 15. Gebäude Netzwerk-Topologie-Datei von mehreren Servern
- 16. Java: Synchronisieren von Threads auf mehreren Servern
- 17. Ausführen eines Befehls auf mehreren Windows-Servern
- 18. Synchonise Laravel Taskplaner auf mehreren Servern
- 19. Yii2 CSRF Validierung auf mehreren Servern
- 20. Konvertieren IIS/Tomcat-Webanwendung in eine Umgebung mit mehreren Servern
- 21. Ausführen eines Powershell-Skripts auf mehreren Servern mit Jenkins
- 22. Verwenden von Tomcat Maven Plugin mit mehreren Servern
- 23. Gleichzeitigen Zugriff mit Hibernate und Tomcat auf mehreren Servern
- 24. Einstellen des Energiesparplans auf mehreren Servern mit Powershell
- 25. Synchronisieren von IIS-Servern in aws ec2 mit Best Practices für die automatische Skalierung
- 26. Unterstützt es Anwendungscache in mehreren Servern in asp.net (C#)?
- 27. Gespeicherte Prozedur auf mehreren verbundenen Servern gegenüber separaten Verbindungen ausführen
- 28. Event ID Tracker und CSV-Bericht auf mehreren Servern
- 29. Die beste Methode zum Zusammenfassen mehrerer Protokolldateien von mehreren Servern
- 30. Bash-Skript zum Sammeln von Informationen von mehreren Servern
FWIW , ein benutzerdefinierter Lastenausgleich, wie in Ihrem zweiten Punkt beschrieben, wurde Anfang dieses Jahres entwickelt und ist jetzt Teil der neuesten StatsD-Version (https://github.com/etsy/statsd/blob/master/docs/cluster_proxy.md) – mrtazz