Load Balancer, MySQL Master-Master, Apache, NFS auf nur 2 Maschinen

efanucar

New Member
Hallo zusammen,

ich stehe vor der Aufgabe für ein Webprojekt einen kleinen, redudanten Webserver- und MySQL-Cluster aufzubauen. Nach Recherche in diversen Foren, Blogs und Büchern schwebt mir folgendes Setup vor

- 2 Load-Balancer, die per heartbeat überwacht werden
- 2 Webserver, auf die der aktive Load-Balancer die Anfragen verteilt
- 2 MySQL-Server in Master-Master-Replikation, per heartbeat überwacht
- 2 Storage-Server die ein NFS-Laufwerk exportieren und per DRDB synchron gehalten werden, ebenfalls von hearbeat überwacht

Fällt ein Server im Paar aus, gibt es also immer einen Ersatz.

Da ich jetzt eigentlich nicht 8 echte Server administrieren möchte (neben Wartung ist das natürlich auch eine Kostenfrage, auch das Setup beim Hoster mit eigenem privaten Netzwerk zusätzlich zu den externen IPs ist sicher nicht so trivial) frage ich mich:

Kann man das nicht alles auf 2 dedizierten Servern laufen lassen?

Fällt ein Server aus, merkt heartbeat das uns switched die öffentliche IP auf den Load-Balancer des zweiten Servers. Der Load-Balancer merkt, dass der erste Server keine Anfragen entgegen nimmt und verteilt sie an den zweiten (also Quasi an sich selbst). Währenddessen hat heartbeat auch gemerkt, dass der erste MySQL-Server down ist und die Storage-Server auch.

Kann das funktionieren?

Danke für ein paar Erfahrungswerte und Tipps!

Viele Grüße!
 

elias5000

Site Reliability Engineer
Ggf. einfacher als IPs switchen (muss der Hoster ja auch Unterstützen) wäre es, das per DNS zu regeln. Der DNS-Name löst auf beide LoadBalancer auf.
Wenn einer der Beiden stirbt, sorgt der Überlebende dafür, dass der DNS nur noch eine IP für den Hostname ausliefert. Eine kurze TTL sorgt dafür, dass das auch alle zeitnah mitbekommen.
Bis die DNS-Änderung greift ist auch nicht so schlimm, weil nach RFC bei mehreren IPs für einen Hostname diese durchprobiert werden, bis einer antwortet. Es dauert also einfach nur etwas länger.
Und dann musst du natürlich noch die Fälle abdecken, in denen z.B. die LoadBalancer beide total superhappy sind aber einer der Apache Server nicht funktioniert oder eine der MySQL-Instanzen ausgefallen aber beide Apache Server noch ok und beliebige weitere Kombinationen.
 

timtowtdi6

New Member
Kann man das nicht alles auf 2 dedizierten Servern laufen lassen?

Aber natürlich :)

Such mal im Netz nach DRBD-Pacemaker-Cluster. Es ist da üblich, 2 Server einzusetzen.

Oftmals wird so ein Konstrukt verwendet, um zum Beispiel auf einem Node die Datenbank und auf dem anderen Node den Webserver laufen zu lassen.

Die Daten sowie die Konfiguration der Dienste liegen auf eigenen DRBD-Devices.

Fällt nun ein Node aus, werden die Dienste auf den anderen Node geswitched + Failover-IP. Der Clustermanager Pacemaker verwaltet die Dienste.

Ich selbst habe 8 Cluster auf Basis von DRBD und Pacemaker.
 

PapaBaer

Registered User
Ggf. einfacher als IPs switchen (muss der Hoster ja auch Unterstützen) wäre es, das per DNS zu regeln. Der DNS-Name löst auf beide LoadBalancer auf.
Wenn einer der Beiden stirbt, sorgt der Überlebende dafür, dass der DNS nur noch eine IP für den Hostname ausliefert. Eine kurze TTL sorgt dafür, dass das auch alle zeitnah mitbekommen.

Selbst bei kürzester TTL erreichst du via DNS keine Downtimes <5min + X. Mit Lösungen a la keepalived kommst du real auf ca. 10 Sekunden Downtime.
 

efanucar

New Member
Danke erstmal für die Antworten!

Ich teste derzeit das ganze Setup mit zwei virtuellen Maschinen.

Der Loadbalancer (aktiv auf Server 1) verteilt die Anfragen auf beide Server.

Verabschiedet sich Server 2, verteilt der Loadbalancer nur noch auf Server 1.

Verabschiedet sich Server 1, übernimmt Server 2 den Loadbalancer und die Failover-IP und verteilt nur noch auf Server 2.

Auf jedem Server läuft MySQL, beide Server werden über Master-Master-Replikation synchronisiert und die Applikation greift jeweils über localhost auf seinen eigenen MySQL-Server zu.
Sollte nun nur der MySQL-Server auf einer Maschine ausfallen wird das tatsächlich erstmal nicht erkennt, eventuell kann ich aber dem Loadbalancer das noch beibringen (über eine Check-Seite, die auch MySQL testet)

Bleibt noch das Thema Filesystem.

Mit DRBD habe ich leider bisher keine guten Erfahrungen gehabt, bei einem anderen Setup hat sich regelmäßig die Synchronisierung verabschiedet und ich musste von Hand wieder den Slave neu initialisieren - das Ganze hat auf mich nicht den Eindruck gemacht, dass das für den produktiven Einsatz bereit ist.

Mein Plan: auf einem Server wird ein NFS-Laufwerk exportiert, das die Applikation auf beiden Webservern als Haupt-Datenspeicher verwendet.
Im Hintergrund wird über rsync dieses Datenverzeichnis auf den zweiten Server synchronisiert und von der Applikation als "Nur-Lese-Quelle" verwendet, wenn der Haupt-Datenspeicher nicht erreichbar ist. Auch dieses zweite könnte man über NFS freigeben, dann ist die Konfiguration auf beiden Servern identisch.

Ist sicher etwas mehr Handarbeit als über DRBD, aber mir gefällt daran, dass die Daten auf beiden Server ganz normal im Filesystem liegen und darauf zugegriffen werden kann. Bei DRBD weiß man nicht ob man auf dem Slave auch wieder an die Daten rankommt...

Wie klingt das so für Euch?
 
Top