Server spiegeln - Server Failover

  • Guten Morgen


    Ich habe die letzten Tage sehr viele zu den Themen recherchiert, und weiss irgendwie nicht was eine gute möglichkeit wäre.


    Was ich bisher habe:

    Ein Rootserver RS 1000 G8. Auf diesem läuft eine MariaDB, ein Webserver mit nginx und php 7.2/7.3 sowie ein E-Mailserver mit Dovecot und Postfix. Das ganze läuft auch sauber und Stabil. Verwaltet wird alles per SSH, da ich mit den Verwaltungsoberflächen nicht warm wurde und es nur sehr selten änderungen oder neue nginx Hosts gibt. Die E-Mails habe ich über eine Datenbank verwaltet, so dass ich die Konten einfach über mySQL erstellen kann.


    Probleme:

    Einerseits gibt es ja mal Probleme das es sonst technische Probleme gibt. Vorallem gibt aber immer mal wieder so doofe selbstverschuldete Probleme - wo selbstverständlich ein vorheriger Snapshot vergessen geht :D - das der Server . Grad vor wenigen Tagen habe ich ein Update zu schnell durchgeführt und nicht gemerkt das etwas deinstalliert wurde. Bei der Reparatur hat er dann jedoch Python deinstalliert was dazu führte das alle Zertifikate von certbot gelöscht sind. Dies ist natürlich sehr ärgerlich. Wenn etwas schief läuft dann alles. Ich hatte entsprechend einige Stunden da alles wieder sauber lief. Backups sind natürlich stündlich vorhanden. Das ist kein Problem.


    Was ich möchte:

    Wenn es ein Ausfall gibt aus technischem oder eigen Verschulden hätte ich gerne das alles möglichst schnell wieder läuft, ohne das ich mich nun stressen muss etwas zu beheben und es da unter umständen noch schlimmer mache. Dazu sind mir mehrere Punkte eingefallen und ich habe sehr viel gefunden. Jedoch weiss ich nicht so recht wo ich anfangen soll, gibt es ggf bessere Möglichkeiten oder überlege ich sogar irgendwo falsch.

    Ich hoffe ihr könnt mir da weiterhelfen.

    An dieser Stelle sei auch erwähnt das alles mehr in den Hobbybereich geht. Trotzdem möchte ich einerseits die Erreichbarkeit verbessern, andererseits aber auch meinen Aufwand bei Problemen mindern.


    1. Fallback IP

    Ich habe mir gedacht die Fallback IPs für IPv4 und IPv6 sind auf jeden Fall etwas gutes welche ich mich zulegen sollte. Es ist ja anscheinend nach wie vor so, dass ein Mailserver damit bewertet wird wie viele "Sinnvolle" Mails angenommen werden. Wenn ich diesen nun 3 Jahre Betreibe, und danach z.B. auf die 9. Generation von Rootservern wechsle habe ich eine neue IP und das ganze "Punkte sammeln" fängt wieder von vorne an. Natürlich nur sofern das wirklich nach wie vor so ist das dies "gemessen" wird.

    Ein weiter Vorteil den ich sehe ist die schnelle Umstellung. Wenn ich später auf einen neuen Server wechsle (Wegen der Leistung oder neue Generation oder was auch immer), kann ich auf dem zweiten einfach alles vorbereiten, und dann binen wenigen Minuten die Fallback IP umstellen. So entfällt die lässtige Aufgabe alle DNS Einträge anzupassen, und ich weiss das per Sofort alle Benutzer auf dem neuen Server sind. Es kommen nicht noch unter umständen Mails auf dem alten Server an oder verspätet weil der DNS Eintrag bei dem anderen noch nicht aktualisiert sind.

    Danach müsste ich es dann nur noch irgendwie hinbekommen das die IP ggf selber umschaltet.


    2. Servertrennung

    Dies finde ich eine der schwersten Fragen. Ich habe so viele Beiträge gelesen das es sinn ergibt den MySQL Server, den E-Mailserver sowie den Webserver zu trennen. Viele dieser Beiträge sind jedoch schon sehr alt. Ich frage mich ob es das wirklich für meine Nutzung wirklich vorteile bringt. Da ich gerne eine Fallback Lösung habe, wäre das argument das die E-Mails gehen auch wenn der Webserver abtaucht ja gar nicht mehr wirklich gegeben. Wenn ihr gute argumente dazu habt, würde für E-Mail und MySQL auch ein kleiner VPS reichen? Bei MySQL denke ich an einen VPS 200 G8, bei den E-Mails wird es eher schwer da ich 20 oder 40GB etwas wenig Speicher finde, und vom Preis her dann gleich einen Root Server verwenden kann.


    3. Fallback

    Und dies ist nun wirklich die schwerste Frage. Ich habe bisher keine wirkliche Idee wie ich dies erreichen könnte. Wenn ich die einzelnen Server trennen würde (Was dann aber 6 Server bedeuten würde und je 3 Fallback IPs), so könnte ich die MySQL so viel ich gefunden habe mit einer Master/Master Konfiguration permanent auf dem selben Stand laufen lassen. Beim Mailserver mit Dovecot müsste dies ja auch recht einfach gehen. Ich habe gelesen das Dovecot von haus aus alles auf einem zweiten Server ala Master/Master mit DRBD kann. Dazu muss ich aber noch anleitungen suchen und mal auf einer Testumgebung damit spielen. Was mir aber Kopfzerbrechen macht sind die Configurationsdateien (Postfix, Dovecot, Nginx, SSL Zertifikate, etc) und dann natürlich auch die Webseitendaten. Mit rsync habe ich keine wirkliche Synchronisierung. Auch hier ist das stichwort DRBD gefallen. Damit sollte es ggf gehen. Auch hier muss ich mich aber erstmal weiter einlesen und damit mal auf einem Testsystem spielen. Bevor ich dies aber mache, wäre es schön wenn ihr mir helfen könntet. Vielleicht bin ich ja auf dem Holzweg, ihr habt bessere Vorschläge oder sonstige Tipps, Anleitungen oder sonst etwas.

    4. Backupstrategie

    Bisher mache ich stündlich ein Backup aller Datenbanken und des webspace mit borg auf einen externen Server. Dies klappt auch ohne Probleme. Hier habe ich einfach zwei Probleme, wo es dann natürlich fraglich ist ob es bessere Lösungen gibt.

    4.1: Die Datenbank wird im laufenden Betrieb mittels mysqldump gesichert. Ich habe schon öfters gelesen das die Datenbank so unterumständen nicht sauber gesichert wird weil Einträge zur selben zeit vorgenommen werden. Dies sei nur bei Oracle DB möglich. Ist dies so? Wenn ja, wäre eine Trennung vom MySQL Server ggf Sinnvoll, damit ich dann auf dem zweiten Server einfach den Dienst stoppe, dann das Backup mache und danach wieder starte und er holt sich durch die Master/Master Konfiguration die daten die seit dem unterbruch neu sind. Hier ist einfach fraglich wie bringe ich borg bei das er die Backups immer auf dem "nicht aktiven" Server macht.

    4.2: Die Backups gehen nun auf einen Server per SSH welcher nicht bei Netcup steht. Dies braucht entsprechend Traffic. Gibt es dazu eine Möglichkeit? Ich nehme nicht an das ich mit dem vLAN auch den "externen" Server einbinden kann.


    Damit das ganze dann vom Traffic her kein Problem wäre habe ich an die Cloud VLans gedacht. Da kann ich es ja anfangs ganz einfach mit Cloud vLAN Free testen. Wenn die Bandbreite zu schmal wäre kann ich dann immer noch erhöhen. Da dies ohne extra NIC funktioniert kann ich mir diese auch sparen.


    Ich bedanke mich schon im Voraus für jede Hilfestellung und entschuldige mich jetzt schon für den Langen Beitrag.


    Gruss


    Oliver

  • Ein paar kurze Anmerkungen zur Anregung:

    - Hängt sicherlich von der Auslastung einzelner Dienste und deren konkreter Kombination ab, aber normalerweise (und als Anhaltspunkt, weil Du einen schon sehr kleinen VPS 200 erwähnst für Deine Zwecke) sollte es bei einem anständig dimensionierten Rechnerknoten kein Problem sein, die genannten Dienste zu kombinieren. Diese lassen sich in eigenen Containern auch voneinander abschotten.

    - Für die Synchronisierung zweier Mailserver (Multi-Master-Betrieb, zwei gleichberechtigte MX-Einträge) verwende ich kein DBRD, sondern das Dovecot-eigene "dsync"

    - Nutzt man verteilte Datenbanken und/oder verteilte Dateisysteme (also hier: keine gespiegelten Block-Devices wie bei DBRD), sollte man in der Regel darauf achten, eine ungerade Anzahl von Knoten einzusetzen (ermöglicht eine Mehrheitsentscheidung als Absicherung bei Inkonsistenzen)

  • Hallo m_ueberall Vielen Dank für deine Ausführungen.

    - Hängt sicherlich von der Auslastung einzelner Dienste und deren konkreter Kombination ab, aber normalerweise (und als Anhaltspunkt, weil Du einen schon sehr kleinen VPS 200 erwähnst für Deine Zwecke) sollte es bei einem anständig dimensionierten Rechnerknoten kein Problem sein, die genannten Dienste zu kombinieren. Diese lassen sich in eigenen Containern auch voneinander abschotten.

    Der VPS war vorallem für den MySQL Server in überlegung. Ich frage mich ja noch ob ein Backup mittels mysqlbackup Inkonsistent sein kann. Wenn ja müsste ich ja fast zwei Server verwenden und einen Dienst Stoppen sobald ein Backup gemcaht wird. Hier habe ich aber keine wirkliche aussage gefunden.

    - Für die Synchronisierung zweier Mailserver (Multi-Master-Betrieb, zwei gleichberechtigte MX-Einträge) verwende ich kein DBRD, sondern das Dovecot-eigene "dsync"

    Super danke dir.

    - Nutzt man verteilte Datenbanken und/oder verteilte Dateisysteme (also hier: keine gespiegelten Block-Devices wie bei DBRD), sollte man in der Regel darauf achten, eine ungerade Anzahl von Knoten einzusetzen (ermöglicht eine Mehrheitsentscheidung als Absicherung bei Inkonsistenzen)

    Ok dann ist mein Szenario nicht so vorteilhaft.


    Im moment überlege ich eh einfach E-Mails zu trennen wobei ich da nicht wirklich Punkte über Vor-/Nachteile gefunden habe damit ich sagen muss "Das muss jetzt sein".

    Ein zweiten Server für die Datenbank wenn dann wegen dem Backup.

  • Ich frage mich ja noch ob ein Backup mittels mysqlbackup Inkonsistent sein kann.

    Ich selbst habe mit "mysqlbackup" bislang nicht gearbeitet (nutze selbst ein MariaDB-Cluster, welches den Befehl standardmäßig nicht kennt), kann also nicht sagen, inwiefern dies ein Ersatz oder ein "Frontend" für mysqldump ist. Allerdings kann ich die folgenden Links zu diesem Thema empfehlen, welche auf Ansätze verweisen, mit welchen sich konsistente Online-Backups erstellen lassen:

  • [...] Persona Xtrabackup mit MariaDB10.3 nicht kompatibel [...]

    Das ist korrekt, vgl. u.a. https://severalnines.com/blog/…up-and-percona-xtrabackup – generell sollte man mariabackup hier immer den Vorzug gegenüber XtraBackup geben, wenn man neuere MariaDB-Features ab v10.1 verwendet.

    Sowohl mariabackup als auch mysqldump lassen sich auch für einen SST (State Snapshot Transfer) verwenden – auch manuell (https://mariadb.com/kb/en/manu…er-node-with-mariabackup/), während dessen Ablauf der Zustand des "Donor"-Knotens bei der blockierenden Variante temporär eingefroren wird: https://mariadb.com/kb/en/libr…/#state-snapshot-transfer.

    Eine Alternative für ein physisches Backup wäre die Erstellung eines Snapshots bei Verwendung des ZFS-Dateisystems (atomare Aktion!)

  • Danke. Dann teste ich dies mal mit mariabackup.

    Ich habe gestern noch etwas gelesen das man einen kleinen Galera Cluster machen soll da Backups einfacher und konsistent seien. Aber finde das nicht mehr:D

    Ist das wirklich so? So drei VPS200 gehen Preislich ja noch. Ich habe dann ja was die DB betrifft eine Ausfallsicherheit. Aber ob das Baclup "einfacher/besser" ist gegenüber einer DB ohne Cluster...

  • Guten Morgen


    Vielen Dank. Dann lese ich mich mal noch genauer ein. Einfach ggf nochmals zu meinem Verständnis:

    • Ein Konsistentes MariaDB10.3 Backup erreiche ich mit mariabackup mit der SST Methode. Dies erreiche ich sowohl bei einem einzelserver als auch bei einem Cluster.
    • Der einzige Vorteil den ich mit einem Cluster erreichen würde wäre eine Ausfallsicherheit wenn ein Server ausfällt da die DB trotzdem noch erreichbar ist und funktioniert.
    • Ein Konsistentes MariaDB10.3 Backup erreiche ich mit mariabackup mit der SST Methode. Dies erreiche ich sowohl bei einem einzelserver als auch bei einem Cluster.

    Anlagemäßig die meines Wissens mit Abstand sicherste Möglichkeit, zumal alles aus von einem Hersteller kommt. "Konsistent" bezieht sich hier jedoch (natürlich) auf den einzelnen Knotenzustand/lokale Transaktionen – wenn aus irgendeinem Grund die Kommunikation mit anderen Knoten abgerissen ist, heißt dies nicht, dass komplexe logische DB-Operationen, die ggf. gerade auf einem anderen Knoten oder im Extremfall via Load-Balancing auf mehreren Knoten verteilt ablaufen, vollständig erfasst werden, wenn ein Online-Snapshot (insbesondere nur von einem der n verfügbaren Knoten) erstellt wird.

    Um dem obigen ("applikationsseitigen") Problem zu begegnen, wäre bei komplexeren/zeitkritischen Anwendungen eine Analyse anzustellen, inwiefern man als zusätzlichen Schutz vor "Teilmodifikationen" während eines längerdauernden Online-Backups die Datenbank doch zwingend in den read-only-Modus versetzt (siehe diese Diskussion). Ein weiterer Ansatzpunkt wäre die explizite Sicherung aller Knoten und die Ausnutzung der Verfügbarkeit von inkrementellen Backups (laufen schneller als ein vollständiges Backup), welche man an die Erstellung des initialen Backups anhängen könnte... (nicht zwangsweise, aber in Kombination zumindest ansatzweise paranoid – was jedoch in diesem Fall nicht zwingend negativ aufzufassen sein muss).


    Will man explizit sicherstellen, dass die Rück-Einspielung eines SSTs funktioniert, geht das eigentlich nur über einen direkten Test mit einer Temporärinstanz.


    Ein zuvor beiläufig erwähnter Ansatz, um den momentanen Zustand des Gesamt-Clusters ohne jegliche Downtime zu sichern (physisches Backup), wäre die gleichzeitige Erstellung eines ZFS-Snapshots auf allen Knoten (und zwar wirklich so gleichzeitig wie möglich, d.h., im Optimalfall liegen die Daten aller Knoten im selben Pool); dies funktioniert natürlich auch mit nur einem Knoten.

    • Der einzige Vorteil den ich mit einem Cluster erreichen würde wäre eine Ausfallsicherheit wenn ein Server ausfällt da die DB trotzdem noch erreichbar ist und funktioniert.

    Neben der Ausfallsicherheit (ein nicht zu unterschätzender Vorteil) ist IMHO hier immer auch ein mögliches Load-Balancing (im vorliegenden Fall: mittels MaxScale) und die einfache Möglichkeit der Skalierung zu sehen (Vorbreitungen dafür wurden ja bereits getroffen, Konfigurationsänderungen sind minimal).

    Was im Cluster-Modus theoretisch als Nachteil anzusehen ist (bei einem "Ein-Knoten-Cluster"), wäre das in diesem Modus zwangsweise per Design zum Tragen kommende "cluster-wide optimistic locking".

  • Auch hier danke m_ueberall .

    Ich habe mir gestern mal einen Cluster sowie ein HAProxy installiert. Wenn ich das einsetze würde ich jedoch voraussichtlich auf MaxScale gehen.


    Ich muss mich wie ich merke noch stärker mit den Backups beschäftigen. Ich hätte nicht gedacht das dies für doe Datenbank so komplex ist.


    Aber mal aus neugierte. Wenn ich ein Cluster aus drei VPS200 hätte und ein VPS200 Proxy: könnte ich theoretisch nicht z.B. Stündlich einen der drei Clusteeserver Herunterfahren (also den MySQL Service) und so das backup machen? Oder wäre das Backup dann auch unter Umständen inkosistent? Wäre ja eigentlich sehr einfach auf diese Art :D

  • Wenn ich ein Cluster aus drei VPS200 hätte und ein VPS200 Proxy: könnte ich theoretisch nicht z.B. Stündlich einen der drei Clusteeserver Herunterfahren (also den MySQL Service) und so das backup machen? Oder wäre das Backup dann auch unter Umständen inkosistent? Wäre ja eigentlich sehr einfach auf diese Art :D

    Das habe ich doch eigentlich genau in einem meiner vorherigen Beiträge diskutiert? Ja, kommt darauf an, ja (selbst die Erstellung physikalischer Backups funktioniert auf modernen Dateisystemen dank der von ihnen unterstützten Snapshots sogar quasi "in Nullzeit"; diese Snapshots können dann "in Ruhe" woandershin gesichert und ggf. lokal wieder gelöscht werden).