Viele der LOB-Anwendungen, die wir unseren Kunden zur Verfügung stellen, haben einen Marketing-/Werbecharakter (Gewinnspiele, Veranstaltungsregistrierung, etc.). Die meisten dieser Anwendungen sind zwar sehr einfach, stellen aber sehr hohe Anforderungen an die Datenbank. Stellen Sie sich eine Website vom Typ "Registrierung" als Hintergrund für einen Werbespot vor, der beispielsweise während des Superbowls ausgestrahlt wird (ja, wir hatten schon mehrere).
Obwohl wir bei der Optimierung des Codes unserer Webanwendungen sehr gut geworden sind, bleibt die Datenbank immer ein Problem, obwohl die Anwendung relativ einfach ist. Der Ablauf ist typischerweise in etwa so:
- Aus der Datenbank lesen, um vorhandene Datensätze zu erkennen
- In die Datenbank schreiben, wenn der Datensatz neu ist
In vielen Fällen ist dies der einzige Datenzugriff, den unsere Anwendung durchführen muss. Da dies jedoch der einzige Zweck der Anwendung ist, ist es sehr wichtig, dass dieser einfache Prozess stark optimiert wird.
Für die Zwecke dieser Frage haben wir einen einzelnen Server mit einem Raid-5-Platten-Array für die Datendateien und einem weiteren Raid-5-Array für die Protokolle. Das Betriebssystem ist zur Zeit Windows 2003 Standard 32bit und der Server hat 4 GB Speicher. Einige Anwendungen verwenden SQL 2005 Standard, während andere MySQL 5.1 verwenden. Ich bin sehr bewusst Ich weiß, dass bestimmte Betriebssystem- und Hardware-Optimierungen hier möglich sind, aber ich möchte meine Bedürfnisse zuerst von der Software-Seite her angehen. Ausführliches Profiling hat uns gelehrt, dass Festplatten-IO ist im Allgemeinen der größte Engpass .
Nachdem ich all das gesagt habe und weiß, dass Caching nicht viel helfen wird, da die meisten Lesevorgänge einmalig sind und nur sehr wenige Daten zurückgeben (oft nur ein bisschen, das angibt, ob ein Datensatz existiert oder nicht), überlege ich, einen Sprung in den Bereich der In-Memory-Datenbanken als eine Art Schreib-Cache-Schicht für die echte Datenbank zu machen. Dies scheint eine gute Lösung zu sein, da der Großteil unseres hohen Datenaufkommens sporadischer Natur ist und sich nicht über mehrere Stunden hinzieht. Außerdem wäre der mögliche Verlust von ein paar Minuten an Daten aufgrund eines Serverabsturzes in den meisten Fällen akzeptabel.
In der einfachsten Form würde ich eine typische Registrierungsanwendung so ändern, dass sie Folgendes tut:
- Abfrage der Festplatten-DB und der Speicher-DB nach vorhandenen Datensätzen
- Wenn nicht, werden Daten in den Speicher-DB geschrieben und zurückgegeben
- Regelmäßiges Flushen der Speicher-DB auf die Festplatten-DB
Meine Frage lautet Was sind meine Optionen für diese In-Memory-Datenbank? Ich habe mit In-Memory-Hashtabellen, Datentabellen und dergleichen experimentiert, aber ich bin auf der Suche nach anderen Optionen oder sogar Vorschläge für einen völlig anderen Ansatz.