Komplette Redundanz

  • Sehr geehrte Community,


    ich nutze meinen kleinen Server aktuell für meine eigene Cloud, sowie für einen eigenen VPN.

    Leider kommt es hin und wieder mal vor, dass es dank dem von mir eingesetzten OS (Arch Linux) zu einem Ausfall der Dienste kommt, manchmal auch des gesamten Systems.

    Da ich aber nicht gewillt bin mein OS zu wechseln und auch nicht auf die häufigen Updates verzichten möchte, habe ich mir überlegt einen weiteren Server zuzulegen und somit die Dienste zu "spiegeln".


    Ich habe mir folgendes Szenario überlegt:


    - RS 1000 SSD G7SEa1 "Master" mit IP 1.2.3.4

    - RS 1000 SSD G7SEa1 "Slave" mit IP 2.3.4.5

    - Failover IP 3.4.5.6 welche jeweils zum funktionierenden System routet


    Wie erreiche ich aber ein komplett synchrones System ? Ist dies überhaupt möglich oder müsste ich alles manuell auf den "Slave" kopieren ?


    Ich habe so etwas noch nie gemacht und hoffe auf Antworten von Kunden die bereits Erfahrungen in dem Bereich gesammelt haben.


    Mit freundlichen Grüßen,

    Lukas

  • Es hängt von den Anwendungen ab und ob/wie diese gespielt werden können / müssen.

    In der Regel will man nicht, dass auch Systemeinstellungen etc. direkt gespielt sind, da dann Fehler gleich auf beiden Nodes passieren und man nichts gewonnen hat.


    Ich habe für die FailOverIP ein Corosync/Pacemaker aktiv/passiv-Setup, welches die FailOverIP übernimmt, wenn der aktive Node nicht erreichbar ist (allerdings fehlt mir hier noch ein richtiges STONITH: https://forum.netcup.de/admini…ith-device-per-netcup-api).


    Das Hauptproblem ist halt die Anwendungen die darauf laufen "synchron" zu halten, sodass diese im FailOver-Fall übernehmen können und das hängt von den eingesetzten Anwendungen selbst ab... Lässt sich leider nich pauschal beantworten.

  • Benutzt du das Standard-FileSystem-Backend von ownCloud oder praktischerweise ein S3-Bucket-Backend (dann können ja beide Container sogar jetzt schon parallel drauf zugreifen)? Im Standard-Fall dürfte deine Aufgabe hauptsächlich darin bestehen zu schauen wie du das Volume, das du in deinen Docker-Container mountest zwischen den beiden Hosts teilst, sodass es entweder gleichzeitig gemoutet werden kann (master/master) oder zumindest wenn ein Container / Host ausfällt gemountet werden kann (active/passive).


    Hat ownCloud noch Abhängigkeiten z.B. auf eine Datenbank (mysql) oder ähnliches?

  • Nein leider habe ich alles Standard eingerichtet, vermutlich unter anderem weil ich neu bei ownCloud bin, aber OneDrive und Dropbox nicht mehr vertraue.


    ownCloud läuft alleine in einem eigenen Container, MariaDB und Webserver jeweils in einem eigenen.

    Grundsätzlich kann man nur von localhost auf meine Cloud zugreifen, eine Verbindung von zuhause erreiche ich über einen Tunnel welcher mir der Server liefert, somit habe ich jederzeit volle Transparenz über die Zugriffe weil alles über den Host muss.

  • Hm. Also es gibt verschiedene Ansätze, die du meines Erachtens nach fahren könntest.


    Entweder du sorgst dafür, dass die in die Container gemouteten Nutzdaten (vermutlich bei ownCloud das Data-Dir, bei MariaDB /var/lib/mysql und beim Webserver ggf. Configs oder /var/www) auch verfügbar sind, wenn dein Host abstürzt (z.B. NFS / rbd). Wenn das dann der Fall ist, könntest du die Container auf deinem zweiten Host starten sobald der erste abstürzt. Du hast dann trotzdem natürlich eine Ausfallzeit und es ist keine echte Redundanz.


    Der andere, echte Redundanzansatz, erfordert, dass du die Komponenten an sich redundant auslegst. Also:

    • der MariaDB-Container müsste ein MariaDB-Cluster (master/master) aus mehreren Containern werden (von denen jeweils einer auf unterschiedlichen Hosts laufen muss)
    • ownCloud muss mehrfach laufen (ein Container je Host) und auf die selben Nutzdaten zugreifen können. Hier kommt entweder ein Shared-Filesystem (wie NFS) im Hintergrund als Storage in Frage, wobei man dort dann natürlich eine Redundanz schaffen müsste; glaube das ist heutzutage aber einfacher. Oder aber ein objektbasiertes Storage-Backend (ich z.B. habe ein Ceph-Cluster mit RADOS-Gateway und S3-kompatibler API), auf das in der Regel "gleichzeitig" zugegriffen werden kann (natürlich nicht uneingeschränkt)
    • der Webserver kann - je nach Network-Setup - einfach doppelt laufen, stört ja keinen; ggf. ist hier aber ein haProxy-Setup sinnvoll


    Habe ich richtig verstanden, dass das VPN quasi auf Docker-Ebene genutzt wird? Also die Container hängen im VPN?

  • So wie ich das sehe müsstest Du sowohl die Datenbank als auch das Dateisystem fürs Docker-Volume clustern. Für ein MySQL-Cluster brauchst Du im Regelfall 2+ Cluster Nodes + 1 Management Cluster. Für Docker Swarm gibt es Software, die eine Art shared volumes ermöglicht (https://github.com/ClusterHQ/flocker), damit habe ich mich bisher aber nicht genauer befasst. Dann hast Du noch Deinen Tunnel/VPN, der identisch eingerichtet werden muss (ok, das ist sicher nicht schwer).


    Für eine private Cloud wäre mir der Aufwand entschieden zu hoch.


    (Ich schreibe zu langsam ^^ zumindest der Docker Swarm Teil ist aber trotzdem vielleicht relevant)

  • Da kommt ja immer mehr dazu :D

    Ich hab deinen ersten Beitrag nochmal gelesen


    Also im Prinzip könntest du jeden Host für sich isolieren: je ein eigens VPN (mit gleicher Config und Zugangdaten), Webserver und ownCloud. Und nehmen wir mal an für ownCloud bekommst du es hin ein geshartes NFS zu nutzen, das auf beiden Hosts gleichzeitig in den jeweiligen Container gehängt werden kann. Dann kannst du die FailOver-IP entsprechend zuweisen lassen und hättest diese Parts quasi gegen einen Ausfall abgesichert.


    Das Problem was bleibt ist die MySQL / MariaDB. Die kann nicht parallel auf dem gleichen FileSystem laufen... Und da müsste dann ein MariaDB-Cluster her (was direkt im master/master läuft). Dafür wiederum müssten die Container über die Host-Grenze hinweg miteinander kommunizieren können, was (glaube ich) ausschließt, dass es zwei parallele / redundante VPNs gibt...


    Du könntest die MySQL-Datenbank vielleicht externalisieren, sodass du dich darum nicht kümmern musst. Dann würde das so schon gehen... Nagut, das (redundante) NFS muss auch noch irgendwo her kommen...

  • Der Aufwand scheint hoch ja, aber natürlich hat man als begeisterter Bastler Spaß daran alles zum laufen zu bringen.

    Außerdem bin ICH dann der Allmächtige über meine Cloud, und nicht MS oder Dropbox.


    Ausfallsicherheit ist mir trotzdem wichtig, ich mache zwar zusätzlich natürlich auch Backups lokal bei mir, aber es gäbe nichts dooferes als unterwegs schnell was in die Cloud hochladen zu wollen und die ist dann down.


    Edit:


    Wäre folgendes Setup denn im Rahmen ?


    - Server A Cloud und VPN

    - Server B Cloud und VPN

    - Server C Management inkl. MySQL


    Ich würde dann einfach die Failover auf Server A und Server B routen, Server C könnte dann die DB liefern und nur von den beiden Hosts erreichbar sein, komplett öffnen will ich eine DB einfach nicht.

    Wie ich die Docker Volumes teile muss ich mich dann nochmal einlesen..

  • Ich bin übrigens an dem Thema auch semi-Interessiert, da ich private (redundante) ownCloud Instanzen (als Container) an meine Kunden vermieten können will; aktuell scheitert es aber am Backup der eigentlichen Daten, weil ich am liebsten mein Ceph-Cluster per S3-API einsetzen will, aber nicht weiß wie ich für das radosgw vernünftig Backups machen kann (außer den ganzen Pool zu snapshotten...)...

  • Ich bin aktuell noch sehr von Freizeit gesegnet, deshalb versuche ich mich mal diese Woche noch intensiver, sollte ich ein zufriedenstellendes Ergebnis erreichen, werde ich mich natürlich sofort hier melden, ausführlichst.


    Zusätzlich spiele ich mit dem Gedanken, das ganze auch nochmal mit debian zu versuchen, denn ich nehme an Sie nutzen kein Arch ?

  • Debian habe ich lange Zeit genutzt, jedoch bin ich mittlerweile im Bereich Sicherheit sehr rum gekommen ( auch durch viele Fehltritte und daraus resultierende Angreifer die Erfolg hatten ) und fühle mich erfahren genug für eine Distribution mit neueren Paketen und deutlich weniger automatische Konfiguration.


    Bis jetzt auch sehr sehr abgehärtet und sicher, allerdings ist es schon deutlich mehr Aufwand.

  • Ich glaube ich habe gefunden was ich suche.


    https://docs.docker.com/engine/swarm/#feature-highlights


    Mit Docker Swarm kann ich mehrere Maschinen zu einem großen Docker Pool machen, das macht zusätzlich auch failover ip überflüssig weil ich nun einen pool nutzen kann.


    Ich stelle mir nun also folgendes Szenario vor:


    - Root als Controlling System

    - Storage Server 1

    - Storage Server 2


    Die beiden Storage Server würden dann als Cluster "Swarm" laufen und dort würden dann alle Container erstellt werden und demnach auch ownCloud.


    Mit einem VLAN könnte ich nun die Sicherheit noch mehr erhöhen, aber die Kosten wären für 3+ Server zu hoch für den Zweck ^^



    Es sieht sehr sehr einfach aus, sollte es wirklich so funktionieren dann schreibe ich dem Entwickler von Docker einen Dankesbrief ^^

  • Docker Swarm ist prima, bringt Dich aber nicht weiter was Deine "stateful" Container angeht. Um die Replizierung der Daten musst Du Dich nach wie vor selbst kümmern, sprich MySQL/MariaDB-Cluster + entweder NFS oder etwas wie das von mir oben verlinkte Flocker, was für den Swarm-Betrieb ausgelegt ist.

    Und die Failover IP wird auch nicht überflüssig (außer Du benutzt DNS load balancing oder sowas).