Mailinglisten-Archive |
Wir bewegen uns schon ein paar Monate mit unserem LAMP-System an den Grenzen von Intel-Hardware. Alle Rechner haben schon 2 Prozessoren und 1 GB Speicher. Wir werden also in nächster Zeit einiges grundsätzlich ändern müssen. Ich stelle mal meine Überlegungen dazu zur Diskussion, in der Hoffnung einige Tipps und Erfahrungsberichte zu bekommen (oder wenigstens selbst Anregungen geben zu können :)) Die webpool-Serverfamilie ist ein Gesamtprojekt aus ca. 40 Domains (single.de, werbung.de,...), bei denen alle Inhalte per PHP dynamisch aus MySQL-Datenbanken erzeugt werden. Jede Seite kann dabei in Inhalt und Layout an jeden User angepasst werden. Alle Seiten müssen also weitgehend on-the-fly erzeugt und können nicht gecacht werden. Die Seiteninhalte werden weitgehend von den Mitgliedern selbst erzeugt. Zur Zeit liegen diese Domains (IP basiert, eigenes Class-C Netz, eigener primary und secondary Nameservice) auf 3 Webservern, die auf 4 Datenbankserver zugreifen. So liegt z.B. werbung.de auf WWW3 und die Benutzerdatenbank auf DB2. Unbefriedigend an dieser Lösung ist die geringe Skalierbarkeit und viele single points of failure. Alleine single.de hat mittlerweile ca. 20 Mio. Pageviews im Monat und wächst weiter stark. Wir brauchen also eine Lösung, die sowohl auf Webserver- als auch auf Datenbankseite skalierbar und ausfallsicherer ist. Unsere Ideen sehen bisher wie folgt aus: 1. Webservercluster Dabei reicht ein einfaches System, das alle Daten auf allen Servern ablegt, da kaum HTML-Dateien sondern fast ausschliesslich über alle Server hinweg identische PHP-Skripte verwendet werden. Dazu kommen nur noch serverspezifische Layout- und Konfigurationsdateien. Die Last könnte sogar zufällig verteilt werden. 2. Shared Memory Um die Datenbanklesezugriffe zu reduzieren, könnten häufig gelesene Informationen im shared memory auch für andere Prozesse bereitgehalten werden. So werden z.B. Benutzerdaten von eingeloggten Usern bei jedem Seitenaufruf aus verschiedenen Tabellen und Datenbanken zusammengetragen und in ein Array geschrieben. Dieses Array könnte auch im Speicher gehalten werden und der Webserver müsste dann nur überprüfen, ob die Daten schon vorhanden und neuer als in der DB sind. Der Webservercluster könnte dann so funktionieren, dass jeder Zugriff auf www.single.de per redirect auf www1.single.de, www2.single.de o.ä. weitergegeben wird. Der Benutzer bleibt dann z.B. auf www1, wo seine Daten schon im shared memory liegen. 3. Master und Slaves bei MySQL Ein Master-DB-Server übernimmt alle Schreib- und die zeitkritischen Lesezugriffe. Er schreibt ein binary-log aus dem die Slave-DB-Server ihre Daten wieder auslesen. Alle anderen Lesezugriffe werden über die Slaves verteilt. Die Slaves schreiben selbst wieder binary-logs, damit sie beim Ausfall des Masters, dessen Rolle übernehmen können. Unsere Datenbanken haben allerdings sehr viele Schreibzugriffe, so dass der Master einen Flaschenhals bilden könnte. Gruß, Reiner Kukulies -- NETZKONZEPTE - http://kukulies.de
php::bar PHP Wiki - Listenarchive