2009-03-19 5 views
6

Ich schaute auf die Slave/Pool-Module und es scheint ähnlich wie ich wollen, aber es scheint auch wie ich einen einzigen Punkt des Scheiterns in meiner Anwendung (wenn der Master-Knoten ausfällt).Wie kann ich mit Erlang die Last auf einen Cluster verteilen?

Der Client hat eine Liste von Gateways (aus Gründen der Fallback - alle tun die gleiche Sache), die Verbindungen akzeptieren, und man wird zufällig vom Client aus gewählt. Wenn der Client verbindet, werden alle Knoten untersucht, um zu sehen, welche die geringste Last hat, und dann wird die IP des am wenigsten geladenen Servers an den Client weitergeleitet. Der Client verbindet sich dann mit diesem Server und alles wird dort ausgeführt.

Zusammenfassend möchte ich, dass alle Knoten als Gateways und tatsächlich Clientanforderungen verarbeiten. Der Lastenausgleich wird nur durchgeführt, wenn der -Client anfänglich eine Verbindung herstellt - alle tatsächlichen Pakete und verarbeitet auf des "Heim" -Knotens des Clients.

Wie würde ich das tun?

Antwort

6

Ich weiß nicht, ob es diese Module bereits implementiert ist, aber was ich sagen kann, Lastausgleich wird überbewertet. Was ich argumentieren kann ist, dass die zufällige Platzierung von Jobs am besten ist, es sei denn, Sie wissen viel mehr darüber, wie die Last in Zukunft kommt und in den meisten Fällen nicht. Was Sie geschrieben haben:

Wenn der Client verbindet, werden alle Knoten untersucht, um zu sehen, welche die geringste Last hat, und dann wird die IP des am wenigsten belasteten Servers an den Client weitergeleitet.

Wie Sie wissen, dass alle diese am wenigsten geladenen Knoten nicht in den nächsten ms am höchsten geladen werden? Wie Sie wissen, dass all jene hoch geladenen Knoten, die Sie nicht in die Liste aufnehmen werden, die Last nicht einfach in den nächsten ms ablegen werden? Du kannst es wirklich nicht wissen, außer du hast einen sehr seltenen Fall.

Messen Sie (oder berechnen Sie) die Leistung Ihres Knotens und setzen Sie die Wahrscheinlichkeit des Knotens davon abhängig. Wählen Sie den Knoten zufällig, unabhängig von der aktuellen Auslastung. Verwenden Sie dies als ersten Ansatz. Wenn Sie es einrichten, können Sie versuchen, einen ausgeklügelteren Algorithmus zu erstellen. Ich wette, dass es sehr harte Arbeit wird, diesen ersten Ansatz zu übertreffen. Vertrau mir, sehr schwer. Bearbeiten: Um in einem subtilen Detail klarer zu sein, argumentiere ich stark, dass Sie zukünftige Belastung aus aktueller und historischer Last nicht vorhersagen können, aber Sie sollten Wissen über Aufgaben Dauern Wahrscheinlichkeit und aktuelle Zersetzung der Lebensdauer der Aufgabe verwenden. Diese Arbeit ist so schwer zu erreichen.

1

Der Zweck eines Überwachungsbaums ist die Verwaltung der Prozesse nicht unbedingt Anfragen weiterleiten. Es gibt keinen Grund, warum Sie nicht anderen Code verwenden könnten, um Anfragen direkt an Mitglieder der Liste verfügbarer Prozesse zu senden. Siehe den Pool: get_nodes oder pool: get_node() - Funktionen für einen Weg, um diese Listen zu bekommen.

Sie können zulassen, dass das Poolmodul die Verwaltung der Prozesse (Neustart, Überwachung und Abbruchverarbeitung) übernimmt und ein anderes Modul verwendet, um Anforderungen transparent an den Prozesspool umzuleiten. Vielleicht hast du nach verteilten Pools gesucht? Es wird schwierig sein, den Master-Prozess in Erlang zu verlassen, ohne zu verteilten Knoten zu gehen. Das ganze Laufsystem ist so ziemlich ein großer Überwachungsbaum.

0

Ich erinnerte mich kürzlich an das PG-Modul, mit dem Sie Prozessgruppen einrichten können. Nachrichten, die an die Gruppe gesendet werden, werden an jeden Prozess in der Gruppe gesendet.Es könnte dir einen Teil davon geben, was du willst. Sie müssten den Code schreiben, um zu entscheiden, welcher Prozess die Anfrage für real bearbeitet, aber Sie würden einen Pool ohne einen Master erhalten, der sie verwendet.