2017-02-08 9 views
0

Wie halte ich die In-Memory-Datenstrukturen synchron zwischen zwei Prozessen. Beide Prozesse sind derselbe Prozess (Server) - einer ist aktiv und der andere ist ein Stand-by. Der Stand-by muss bei einem Crash/o.ä. des Aktiven übernehmen. Damit die Bereitschaftsdatenbank die aktiven übernimmt, müssen die speicherinternen Datenstrukturen synchronisiert bleiben. Kann ich Virtual Synchrony verwenden? Wird es helfen? Wenn es da wäre, könnte ich irgendeine Bibliothek benutzen? Ich schreibe auf C++ unter Windows (Visual Studio).Halten In-Memory-Datenstrukturen von zwei Prozesse synchron

Wenn das keine Lösung ist, was eine gute Lösung ist, ich beziehen kann?

TIA

Antwort

1

Die einfachste Lösung zu implementieren, um den Zustand in einer separaten Datenbank zu speichern, so dass, wenn Sie über fehlschlagen, wird der Standby nur die gleiche Datenbank weiterverwenden. Wenn Sie sich Sorgen machen, dass die Datenbank abstürzt, zahlen Sie das Geld und die Komplexität, die für die Haupt- und Standby-Datenbanken erforderlich sind, wobei die Datenbank ebenfalls ausfällt. Dies ist ein Versuch, die Komplexität der Handhabung von Status über Failover auf die Datenbank zu verschieben. Natürlich können Sie feststellen, dass der Overhead von Datenbanktransaktionen zu einem Engpass wird. Es mag verlockend sein, NoSQL zu verwenden, aber denken Sie daran, dass Sie sich wahrscheinlich auf die ACID-Garantien verlassen, die Sie mit einer herkömmlichen Datenbank erhalten. Wenn Sie diese ablehnen und in der Regel eine Konsistenz erhalten, müssen Sie darüber nachdenken, was dies beim Failover bedeutet. Werden Sie eine kleine Menge neuer Informationen zum Failover verlieren? kümmert es dich?

Virtuelle Synchronität sieht interessant aus. Ich habe nach ähnlichen Dingen gesucht und akademische Seiten wie http://www.cs.cornell.edu/ken/ gefunden, von denen einige Links zu Open-Source-Software haben, die von Forschungsgruppen produziert wurde. Ich habe sie nie benutzt. Ich scheine mich an Berichte zu erinnern, dass sie für eine kleine Anzahl von Maschinen mit sehr guter Konnektivität ziemlich gut funktionierten, aber Leistungsprobleme mit der Skalierung hatten, was vermutlich kein Problem für Sie sein wird.

war einmal Menschen auf Unix-Maschinen Multi-Prozess-Systeme gebaut durch die Prozesse über den gemeinsam genutzten Speicher kommunizieren mit oder Memory-Mapped-Dateien. Für sehr einfache Datenstrukturen kann dies zum Funktionieren gebracht werden. Ein Problem, das Sie haben, ist, wenn einer der Prozesse auf halbem Wege durch die Änderung der gemeinsamen Daten abstürzt - wird das die anderen Prozesse durcheinander bringen? Sie können diese Probleme lösen, aber Sie sind in Gefahr zu entdecken, dass Sie alles in der Datenbank implementiert haben, die ich in meinem ersten Absatz beschrieben habe.

0

Sie für In-Memory-Datenbank wie Memcached oder redis gehen kann. Wow

+0

, Dank! Ich habe deine Antwort gestern gesehen und ich habe über Redis recherchiert. Ich würde das gerne mit riesigem Code verwenden. Wir haben vielleicht 500 Klassen und andere Datenstrukturen. Also müsste ich zum Konstruktor dieser Klassen hinzufügen, um die Informationen von redis zu erhalten und in den destructor/other setter Funktionen die Änderung in redis zu übernehmen? –

Verwandte Themen