PHP-Anwendung auf mehrere Server verteilen?

Eli

#5000
ID: 5000
L
1 Mai 2006
89
1
Hallo,

könnt ihr Bücher/Literatur empfehlen, die beschreiben, wie man eine Perl- bzw PHP Anwendung so programmieren kann, dass sie die Ressourcen von mehreren Webservern nutzen können?

z.B. wenn man merkt, dass eine Seite so groß wird und soviele Besucher bekommt, dass ein Server alleine überfordert ist?

vg
eli
 
Ich kenne kein Buch dazu und habe mich mit der Thematik selbst auch nie richtig auseinandergesetzt. Mit PHP allein wirst Du da vermutlich auch keine angemessene Lösung finden.
Einfach mal nach Lastverteilung Suchen. Ich vermute dass das eher Serverseitig geregelt wird.
 
ok, aber wie machen das seiten wie klamm.de oder google.de ? da reicht 1 server ja sicher auch nicht mehr aus
 
Da hängt n Loadbalancer (bei Google wohl n ganzer Haufen davon ;)) davor, der die Anfragen auf die www-Server verteilt. Jeder www-Server is eine identische Kopie der Anwendung (also von deinem Perl- oder PHP-Script).

Natürlich ist Programmierung einer solchen Anwendung wesentlich komplexer, als nur einfach ein Abkopieren auf mehrere Server. Hast du mehrere Server, brauchst du wohl immer eine gemeinsame Datenquelle und hast mit Nebenläufigkeitsproblemen zu tun.
Ein DBMS nimmt dir zwar viel Arbeit ab, aber es bleibt schon noch was zu tun übrig.

Um dem Ganzen die Krone aufzusetzen: Natürlich wird ab einer gewissen Last auch die Datenquelle nicht mehr fertig und muss redundant gemacht werden.

edit:
Die Antwort auf "Wie macht das klamm.de?" findest du in der FAQ:
https://www.klamm.de/partner/unter_faq.php?faq=70
 
Sowas hat mich auch schon immer interessiert.

Aber wie ist das zum Beispiel bei Google zwecks "gemeinsame Datenquelle"? Die haben bestimmt nicht nur eine Datenbank vollgestopft mit Seiten, oder?
 
Bei Google hab ich sogar mal gelesen, dass die ein eigens entwickeltes Dateiformat haben, um riesige Dateien zu verwalten, die sich übere mehrere Festplatten/Rechner erstrecken. Googlen hilft sicher, wenn du da mehr erfahren willst :biggrin:
 
Natürlich ist Programmierung einer solchen Anwendung wesentlich komplexer, als nur einfach ein Abkopieren auf mehrere Server. Hast du mehrere Server, brauchst du wohl immer eine gemeinsame Datenquelle und hast mit Nebenläufigkeitsproblemen zu tun.
Ein DBMS nimmt dir zwar viel Arbeit ab, aber es bleibt schon noch was zu tun übrig.
Wenn eine solche verteilte Anwendung nur auf die DB zugreift, ist das ziemlich einfach, dann hat man keine Probleme, die Datenbank ist auch ausgelegt auf mehrere Verbindungen, von wo die kommen ist egal.
Interessant wird es erst, wenn jeder Webserver auch lokal daten sichern muss, also Dateiuploads, usw. Dann sollte man auf ein verteiltes Datensystem wie ClusterFS setzen.

Um dem Ganzen die Krone aufzusetzen: Natürlich wird ab einer gewissen Last auch die Datenquelle nicht mehr fertig und muss redundant gemacht werden.
Diese Krone ist die einzige richtige Hürde, denn geteilte Datenquellen konsistent zu halten ist eine sehr schwierige Aufgabe.
Da gibt es z.B. die MySQL-Repliaktion (wird nach der Zeit aber inkonsistent), MySQL-Cluster oder der Galera-Cluster. Das nur mal an Möglichkeiten für MySQL. Natürlich gibt es auch Möglichkeiten wie DRBD um eine Art SAN zu simulieren usw.

Sowas hat mich auch schon immer interessiert.
Tipp: Nach clustern, sharding oder high availability suchen. Das zusammen mit Keywords wie MySQL oder PHP. Auf highscalability.com vorbei zu schauen ist auch eine gute Quelle.

Aber wie ist das zum Beispiel bei Google zwecks "gemeinsame Datenquelle"? Die haben bestimmt nicht nur eine Datenbank vollgestopft mit Seiten, oder?
Google verfolgt da eine Art MapReduce (Wikipedia) Ansatz, als OpenSource Software ist da Hadoop sehr bekannt.

Bei Google hab ich sogar mal gelesen, dass die ein eigens entwickeltes Dateiformat haben, um riesige Dateien zu verwalten, die sich übere mehrere Festplatten/Rechner erstrecken. Googlen hilft sicher, wenn du da mehr erfahren willst :biggrin:
Google hat viel selbst entwickelt, weil sie ziemlich spezielle Anforderungen haben :biggrin:
Du beziehst dich wahrscheinlich auf Googles BigTable, das ist ein Konzept von Google Daten auf mehrere Server zu replizieren und diese trotzdem konsistent zu haben. Das ganze auch möglichst ausfallsicher, wobei der Koordinator in Googles BigTable-Ansatz ein Single Point of Failure ist. Aber Google hat gesagt, ihnen ist der SPoF nicht so wichtig, ein korrekt funktionierendes absolut verteiltes System ohne SPoF zu entwickeln ist viel zu komplex und fehleranfällig und brauch wieder ein verteiltes Konsens-System (distributed consensus) welches nicht gerade einfach und auch nicht so effizient ist.




Wirkliche richtige Literatur gibt es dafür nicht, die meisten schaffen es eben irgendwie die Datenbank nur auf einem Server zu lassen, darüber hinaus gelten eben die oben genannten Dinge. Wenn man im Netz aber sucht und auch mal auf Slideshare vorbeischaut, findet man ziemlich viel.
Aber das Problem ist damit ja noch gar nicht gelöst, denn wie verteilt man effizient ein Update auf x Maschinen? Oder wie verwaltet man effizient x Server? Verteilte Systeme sind ein Herausforderung per Design.
 
Wenn eine solche verteilte Anwendung nur auf die DB zugreift, ist das ziemlich einfach, dann hat man keine Probleme, die Datenbank ist auch ausgelegt auf mehrere Verbindungen, von wo die kommen ist egal.
Sag das nicht :p

Ich hab auf der Arbeit neulich so ne lustige Situation gehabt, wo auf www1 einer auf der Datenbank (InnoDB) ne Transaktion startet und Daten insertet, die per ForeignKey-Constraint dann Zeilen in einer anderen Tabelle locken, weswegen auf www2 dann keiner mehr was einfügen kann, weil über weitere Contraints die gelockte Zeile gecheckt wird.

Dumm wirds dann, wenn die besagte Transaktion ne halbe Stunde dauert, www2 nicht so lange warten will, die Arbeit verweigert und sich beschwert, dass er das Lock nicht kriegt :ugly:

(www1 und www2 sind natürlich nur exemplarisch. Das Problem findet sich auch auf nur einer Maschine mit mehreren gleichzeitigen Transaktionen an die Datenbank. Das Beispiel soll nur zeigen, dass auch gern mal Probleme auftauchen, wo eigentlich alles "einfach" aussieht.)
Du beziehst dich wahrscheinlich auf Googles BigTable, [...]
Wahrscheinlich. Is schon ne Weile her und vielmehr als die Grobinfo, dass Google geile Sachen baut, hab ich auch nicht mehr im Kopf. Ich wollte es nur ansprechen, weil hier gleich nach der Google-Keule gefragt wurde :biggrin:
 
:)

da fällt mir noch ne frage ein: wie geht man mit dem problem 'gleichzeitgen' mysql-abfragen um?

klamm hatte das problem ja früher auch mal glaube ich in bezug auf lose-konten und buchungen.

gibt es da literatur/stichworte?
 
@thacker: wie du sagst tritt das "Locking-Problem" auch bei einem Server auf, ist also etwas, worüber man sich längst im klaren sein sollte - erst Recht wenn man so hohe Performanceanforderungen hat, dass man den DB-Server skalieren muss.

@Eli: Wie theHacker schon sagte ist ACID die Lösung, ist in InnoDB drinne. MyIsam sollte man eh nicht mehr verwenden, viel zuviele Nachteile.