Frage

Wir haben eine GDBM Schlüssel-Wert-Datenbank als die Backend einen Lastausgleich bahnseitige Anwendung, die in in C ++ implementiert ist. Die Daten von der Anwendung gedient hat sehr groß geworden, so dass unsere Administratoren haben die GDBM Dateien von „lokalen“ Speicher (auf den Webservern oder ganz in der Nähe) zu einem großen, gemeinsamen, entfernt, NFS-Dateisystem verschoben.

Das ist die Leistung beeinträchtigt. Unsere Performance-Tests (in einer Testumgebung) zeigen Ladezeiten von Hunderten von Millisekunden springen (für lokale Festplatte) bis zu mehreren Sekunden (über NFS, lokales Netzwerk), und manchmal so hoch wie 30 Sekunden bekommen. Ich glaube, dass ein großer Teil des Problems ist, dass die Anwendung viele Zufälle macht aus den GDBM Dateien liest, und dass diese langsam über NFS, und dies wird noch schlimmer in der Produktion (wo die Front-End- und Back-End haben sogar mehr Netzwerk-Hardware zwischen ihnen) und als unsere Datenbank wird noch größer.

Dies ist zwar keine kritische Anwendung ist, würde Ich mag die Leistung zu verbessern, und haben einige Ressourcen zur Verfügung, einschließlich der Anwendung Entwicklungszeit und Unix-Administratoren. Mein Haupthindernis ist die Zeit nur die Ressourcen für ein paar Wochen haben.

Wie ich es sehe, meine Optionen sind:

  1. Verbessern NFS Leistung durch Tuning-Parameter. Mein Instinkt ist, dass wir aus dieser Gewohnheit viel zu bekommen, aber ich habe vorher falsch gewesen, und ich weiß nicht wirklich viel über NFS-Tuning.

  2. Verschieben auf einen anderen Schlüssel-Wert-Datenbank, wie memcachedb oder Tokyo Cabinet

  3. Ersetzen NFS mit einem anderen Protokoll (iSCSI erwähnt, aber ich bin nicht vertraut mit ihm).

Wie soll ich mich wenden, dieses Problem?

War es hilfreich?

Lösung

Sie nicht bekommen aufgehängt auf dem „relational im Vergleich zu nicht-relational“ Vergleich. Es scheint für dieses Problem irrelevant zu sein.

Die Linie Ihre Anwendung gekreuzt hat, ist ein anderer: aus einer kleinen Datenbank auf einem lokalen schnellen Dateispeicher, auf eine große Datenbank über das Netzwerk zugegriffen . diese Linie überquert bedeutet, dass Sie jetzt besser von einem engagierten, Netzwerk bedient bedient, Datenbank-Management-System. Ob der Management-Server relationale Datenbanken verwaltet, ist für diesen Aspekt nicht relevant.

Für das Aufstehen und läuft schnell, MariaDB (der Nachfolger von MySQL) ist wahrscheinlich die beste Wahl. Wenn Sie es wächst deutlich über voraussehen, wo es jetzt ist, könnten Sie setzen es auch in PostgreSQL denn das ist, wo es wird schließlich sowieso gehen müssen: -)

Andere Tipps

Dies scheint nicht zu sein, was Sie hören wollen, aber ehrlich gesagt, wenn ich Sie wäre ich es in einer MySQL-Tabelle werfen würde. Es ist nicht, als ob es sinnvoll ist schwieriger, mit zu arbeiten, und Sie bekommen eine Menge Vorteile mit sich, nicht zuletzt ein Fernzugriffsprotokoll, das für Ihre Situation tatsächlich beabsichtigt ist, im Gegensatz zu GDBM-over-NFS.

Wenn Sie nicht-relationale Datenbanken bleiben möchten, dass Sie könnten versuchen, BDB oder DJB CDB . Ich habe beide bisher verwendet und ich denke, wenn es um Leistung geht hinunter sie GDBM entwickeln.

Aber Großnasen Antwort im Auge behalten, wie ich auch denken, dass Ihr Engpass nicht die Datenstruktur sein könnte (GDBM) Sie verwenden aber Ihre Infrastruktur.

Datei-System i / o mit flachen Dateien über ein Netzwerk ist keine gute Idee, aber man sollte einen Multi-Threaded-TCP-Server betrachten zu schreiben, die i / o, Abfrage macht usw. auf dieser Maschine, kehrt dann die Ergebnisse zurück. Übertragen Sie kleine Stücke von Daten nicht ganz db Dateien ..

Ich bin ein Cache-Persistenz-Mechanismus Entwerfen einer Hochverfügbarkeits problem.I zu überwinden wird es codieren, in Python.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top