In vereinfachter Form kann meine Java-Anwendung wie folgt beschrieben werden:
Es ist eine Webanwendung, die auf einem Tomcat-Server mit einer SOAP-Schnittstelle ausgeführt wird. Die Anwendung verwendet JPA / Hibernate zum Speichern von Daten in einer MySQL-Datenbank. Die gespeicherten Daten bestehen aus einer Liste von Benutzern, einer Liste von Hosts und einer Liste von URIs, die auf riesige Dateien (10 GB) im Dateisystem verweisen. Das ganze System besteht aus einem zentralen Server, auf dem meine Anwendung läuft, und einer Reihe von Worker-Hosts. Ein Benutzer kann sich mit der SOAP-Schnittstelle verbinden und das System bitten, die ihm gehörenden Dateien auf einen bestimmten Worker-Host zu kopieren, wo er dann die Daten auf irgendeine Weise analysieren kann (Wir können NFS nicht verwenden, wir müssen die Daten in die lokaler Plattenspeicher eines Worker-Hosts). Die Datenbank speichert dann für jeden Benutzer, auf welchem Worker-Host seine Dateien gespeichert sind.
Momentan läuft das System mit einem zentralen Server mit der Tomcat-Anwendung und der MySQL-Datenbank und 10 Worker-Hosts und ungefähr 30 Benutzern, die 100 Dateien (im Durchschnitt 10 GB) über die Worker-Hosts verteilt haben.
>Aber in Zukunft muss ich das System um den Faktor 100-1000 skalieren. Also muss ich vielleicht mit 10000 Benutzern, 100000 Dateien und 10000 Hosts umgehen. Und das System sollte auch fehlertolerant werden, so dass ich keinen einzigen zentralen Server habe (was jetzt der einzige Fehlerpunkt im System ist), aber vielleicht mehrere. Wenn einer der Worker-Hosts ausfällt, sollte das System außerdem benachrichtigt werden, sodass es nicht versucht, Dateien auf diesem Server zu kopieren.
Meine Frage lautet jetzt: Mit welchen Java-Technologien kann ich meine Anwendung skalierbar und fehlertolerant machen? Welche Art von Architektur würdest du empfehlen? Sollte ich noch eine riesige Datenbank haben, die alle Informationen über alle Dateien, Hosts und Benutzer im System an einem Ort speichert, oder sollte ich meine Datenbank besser auf mehrere Hosts verteilen und sie irgendwie synchronisieren?
Die Technologie, die Sie brauchen, heißt Architektur.
Ganz gleich, für welche Technologie Sie sich entscheiden, Sie müssen ein gut durchdachtes System für Skalierbarkeit und Redundanz haben. Erstellen Sie ein Diagramm der gesamten Architektur des Systems, so wie es derzeit funktioniert. Markieren Sie jede Komponente mit ihren Einschränkungen für Benutzer, Jobs, Bandbreite, Festplattenspeicher, Speicher oder andere Teile, die Ihre Anwendung einschränken. Dadurch erhalten Sie das Basisdesign.
Zeichnen Sie jetzt dasselbe Diagramm, das Ihren Anforderungen an Skalierbarkeit und Redundanz entspricht. Sie müssen Teile auseinander brechen, damit es funktioniert, oder ganz neue Teile entwickeln. Dieses Diagramm wird deutlich machen, was Sie brauchen.
Eine spezifische Sache, die ich ansprechen möchte, ist die Datenbank. Wenn Sie die Datenbank über Logistiklinien aufteilen können, so dass Sie keine Abfragen von einer zu einer anderen verknüpfen, sollten Sie separate Datenbanken haben. Darüber hinaus besteht die beste Konfiguration für eine Datenbank darin, jede Datenbank auf einer schnellen Maschine mit viel Speicher und sehr schnellen Zugriffszeiten zu haben. Wenn Sie dies tun, wird die Datenbank nur durch schlechte Abfragen oder schlecht indizierte Tabellen gebremst. Meiner Erfahrung nach sollte das Synchronisieren von Datenbanken vermieden werden, es sei denn, Sie haben eine Master-Datenbank mit Schreibzugriff und replizieren diese in andere Datenbanken, die schreibgeschützt sind. Unabhängig davon kann dies ein letzter Schritt sein, nachdem Sie alle Ihre Abfragen profiliert haben und Sie buchstäblich zusätzliche Hardware benötigen.
Tags und Links java scalability redundancy