Hallo!
Bevor ich das jetzt schreibe will ich nur eben klarstellen, dass ich hier nichts plane, sondern Überlegungen anstelle, nicht das das missverstanden wird ;-)
Nachdem ich mir jetzt wirklich so einiges zu Clustern durchgelesen habe, bin ich jetzt der Meinung das es mit mosix keinen Sinn macht aus den bekannten Gründeen, und eine gute Alternative die genau das kann was wir brauchen habe ich nicht gefunden. Also habe ich mir was anderes überlegt, und zwar dass man nicht so tief in Kernel und Programmcode eingreifen muss, sondern einfach bekannte Techniken wie Loadbalancing, rsync, NFS... verwendet. Hier meine Gedanken dazu:
Aufbau des Netzwerkes:
___
.-~" "~-.
/
Y Y
| www |
l !
\ /
"-.,___,.-"
|
|
+-------------+ öffentliche IP: 213.139.94.131
| NAT-Gateway |
+-------------+ interne IP: 192.168.0.1
/ / | \
/ / | \
/ / | \
/ / | \
/ / | \
/ / | \
+---+ +---+ +---+ +---+ +---+ Alle Rechner identisch:
| | | | | | | | | | FreeBSD, Apache, PostgreSQL, Forumsserver, rsync...
| 1 | | 2 | | 3 | | 4 | | 5 |
| | | | | | | | | |
+- -+ +---+ +---+ +---+ +---+ IPs: 192.168.0.2 - 192.168.0.6
Logischer Aufbau:
___
.-~" "~-.
/
Y Y
| www |
l !
\ /
"-.,___,.-"
|
|
+---+
| |
| 1 | Load-Balancer: Apache + mod_backhand
| |
+---+
/ |
/ |
/ |
/ |
/ |
/ |
+---+ +---+ +---+
| | | | | |
| 2 | | 3 | | 4 | Worker-Nodes: Apache, fo_view, fo_post...
| | | | | |
+- -+ +---+ +---+
\ | /
\ | /
\ | /
\ | /
\ | /
\ | /
+---+
| |
| 5 | Backend-Server: fo_server, PostgreSQL, NFS
| |
+---+
Auf allen Rechnern ist dasselbe installiert, und mit rsync wird dafür gesorgt dass alle denselben Datenbestand haben. Ziel ist es das jeder Rechner jeden "Job" machen kann, also bei Problemen für einen anderen einspringen kann.
Hierfür sind 2 spezielle Shell-Scripte zu entwickeln, die auf allen Rechern liegen. Das erste um aus der Worker-Node den Backend-Server zu machen, und das 2. um zum Load-Balancer zu werden.
Ich gehe mal von 5 Rechnern aus. Alle 5 Rechner bilden ein eigenes, privates LAN, die HTTP-Anfragen gehen ein NAT-Gateway, wobei, das ist glaube ich der falsche Ausdruck, zumindest sorgt dieses Gerät für Port-Forewarding, so dass Requests an 213.139.94.131:80 an Node 1 weitergeleitet werden. Auf diesem Rechner läuft Apache mit mod_backhand, womit die Anfragen an die Worker-Nodes übergeben werden(recht intelligenter, transparenter Proxy ;-)), und er kann auch selber Requests beantworten, die Verteilung erfolgt automatisch. Die Worker-Nodes bekommen dann also die HTTP-Requests und arbeiten die ab, dort laufen dann auch die Forums-Clients, die mit dem Forumsserver auf Node 5 per Socket kommunizieren. Selbiges gilt für Datenbankverbindungen.
Im Prinzip wird ja nur auf Node 5 was auf die Festplatte geschrieben. Auf den Worker-Nodes wird ein Netzwerklaufwerk von Node 5 gemountet. Hier werden alle Dateien gespeichert, die evtl, von irgendwelchen PHP/PERL... Scripten beschrieben werden.
Wenn man die Session-Dateien von PHP jetzt auch auf dem Netzwerklaufwerk speichert, kann man sogar ganz normal Sessions verwenden, ohne dass es was ausmacht wenn der nächste Request mit derselben SessionID auf einer ganz anderen Node landet.
Es werden ständig (also alle paar Minuten) die Daten auf allen Rechnern synchronisiert, also von Node 5 aus per rsync verteilt, wobei nur die Änderungen komprimiert auf alle anderen Nodes übertragen werden. Die Worker-Nodes überprüfen im Gegenzug den Status der beiden anderen Rechner - mit welcher Technik auch immer, am besten indem alle notwendigen Dienste überprüft werden. Fällt Node 1 oder Node 5 aus, merken das die Worker-Nodes, und einer davon führt das entsprechende Umwandlungs-Script aus, ändert seine eigene IP in die des ausgefallenen Rechners, und schon gehts weiter.
Mit Hilfe von rsync kann man auch dafür sorgen, dass Änderugen z.B. an der Forums-Software oder an HTML-Dateien auf alle Nodes überspielt werden. Man kann auch mehrere Backend-Server verwenden, wenn z.B. die mal die Suche auf PostgreSQL zugreift, wird das ja erheblich mehr belastet als heute. Dann legt man die halt auf einen eigenen Rechner. Hierzu müsste dann die IP in allen die DB verwendenden Programmen verändert werden, und diese Änderung per rsync verteilt werden.
Wenn man dann z.B. 8 von den genannten Pizza-Boxen als Worker-Nodes einsetzt, dazu eine etwas hochwertigere Maschine als Loadbalancer und den aktuellen Server als Backend-Server(ich finde es schon sinnvoll wenn dieser ein DUAL-System ist und ein SCSI-RAID verwendet weil hier alle drauf zugreifen), dann hat man IMHO ein durchaus leistungsfähiges System mit einer sehr hohen Verfügbarkeit, welches noch recht günstig ist, viel mehr als ein einziges leistungsfähiges DUAL-XEON System wird das nicht kosten. OK, wenn man sagt man würde auch etwas mehr ausgeben für 2 XEON Systeme, oder noch ne Ecke mehr für einen "richtigen" Server, dann bekommt man für das Geld dann 20 und mehr "Pizzaboxen" die parallel arbeiten. Ist aber auch mit etwas Arbeit verbunden ;-)
Gegenüber mosix hätte so eine Lösung einige Vorteile:
- man hat einen verteilten Apachen
- man hat weniger Overhead da keine "dynamische" Verteilung von Prozessen und kein Load-Balancing auf jeder einzelnden Node notwendig ist
- es werden nur die nötigsten Daten über das Netzwerk übertragen, bei rsync nur Änderungen
Der Load-Balancer, der ja im Prinzip als Proxy arbeitet, schafft erheblich mehr Requests pro Sekunde als zur Zeit auf dem Server anfallen, da ist noch sehr viel Luft, stellt also in absehbarer Zeit keinen Flachenhals dar. Man könnte noch ein 2. Netzwerk aufbauen, also eines für HTTP, und eines für den Rest, damit die HTTP-Kommunikation nicht unter einer evtl. etwas größeren "rsync-Orgie" leidet.
Gut, soweit meine Theorie ;-)
Was ist denn mit dem Server-Prozess, da kann es ja nur einen geben, oder? Warum? Ist doch kein Windows! ;-)
Ich meinte damit den Forumsserver-Prozess ;-) Aber Christian Seiler hat ja bereits gesagt dass CK da vielleicht doch noch was in der Hinterhand hat ;-)
Wobei das ja egal ist wenn der Cluster in der Lage wäre die Worker-Threads der Serversoftware auf anderen Nodes zu verteilen, oder? Das wäre z.B. eine Möglichkeit.
nur kann mosix das halt nicht.
Es läßt sich einerseits umgehen (die shared memory Problematik) und andererseits ist es kein Problem. Du kannst in jedem ordentlichem OS nachlesen, wie sowas funktioniert: die Verwaltung mehrerer Prozesse auf einmal.
Klar, aber wenn ein Serverprogramm, welches seine Daten im Ram hält, auf mehrere Prozesse verteilt werden soll, braucht man sowas wie shared memory, und eben das lässt sich ja nicht verteilen mit mosix.
Und ich kann mir nicht vorstellen das "distributet shared memory" besonders effektiv ist, gerade der Performance wegen liegen die Daten ja im RAM, und wenn dann andauernd bei RAM-Zugriffen Daten über das Netzwerk austgetauscht werden kann das doch nicht wirklich performant sein, oder?
Angenommen letzteres ist der Fall, wenn man davon ausgeht dass ein Forum immer aus nur einem Serverprozess besteht, wie soll es dann funktionieren auf allen Nodes je einen solchen Server-Prozess zu haben?
Indem man einfach einen startet?
Und wie synchronisierst Du die Daten in den verschiedenen RAMs?
Viele Grüße Andreas