stumpy2k Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Mahlzeit erstmal, also ich habe eine kleine Denkaufgabe die ich irgendwie nicht lösen kann. Es soll eine Datenbank aufgebaut werden welche gleichzeitig komplett identisch auf mehreren Servern existieren soll um eine sehr hohe Ausfallsicherheit zu gewährleisten. Wie löst man solch ein Problem am besten? Wenn man Primärschlüssel per autoincrement in beiden Datebanken setzen lässt, dann kann es doch durchaus vorkommen dass bei beiden Datenbanken unterschiedliche Werte eingepflegt werden. Ich kann auch nicht zuerst einen Datensatz einpflegen und dann diesen einfach in alle anderen Datenbanken kopieren, da es ja möglich wäre, das in der zwischenzeit ein Server den Dienst verweigert und damit dann natürlich eine inkonsistenz insteht. (Alle Datanbanken müssen zu jeder Zeit komplett identisch sein!). Wäre es vielleicht möglich einen eigenen Primärschlüssel zu implementieren? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Ich würde jetzt einfach mal behaupten das man sowas nicht Programmiertechnisch löst sondern Hardware bzw. Softwaretechnisch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
noptic Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Oder du verzichtest auf den auto increment und verwendest als Primärschlüssel uniqueid Werte und nicht int. Ist übrigens auch sehr praktisch wenn man in einem Programm Daten erfasst die dann erst später in die Datenbank eingespielt werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 14. April 2010 Autor Teilen Geschrieben 14. April 2010 Mal ein konkretes Beispiel: Es soll ein Inventurprogramm entstehen, welches auf einer MSSQL-Datanbank aufsetzt. Diese Datenbanken sollen quasi immer verfügbar sein. Es soll kein Backup-System entstehen (das kommt noch zusätzlich dazu) sondern ein komplett redundanter Server. Wenn man mit dem Programm arbeitet, dann hat man sozusagen eine Liste mit SQL-Servern, welche alle clone - also komplett gleich - sind (erstmal sind es nur zwei, soll aber erweiterbar sein). Nun hat man also mehrere Server. Wenn davon einer ausfällt kann man immernoch auf die anderen zugreifen. Mit welchem die jeweilige Programminstanz nun arbeitet wird zufällig entschieden und falls dieser eine gerade ausfällt, dann wird der nächste genommen. Alle Serverausfälle werden protokolliert und über eine Schnittstelle an ein anderes System weitergegeben welches dann einem Zuständigen Mitarbeiter über den Ausfall berichtet. Das soll die Beschaffenheit des Netzes sein und nun soll eben ein gleichzeitiges schreiben auf mehreren Servern möglich sein - wobei die Primärschlüssel natürlich auf jedem Server dieselben sein müssen! Bin mir nicht sicher ob das Problem nun gut rüber gekommen ist? - stumpy2k Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Vielleicht hilft dir ja sowas. Kann man sicher noch abwandeln. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Moin, Datenbanken spiegeln: Vorgehensweise: Konfigurieren einer Datenbank-Spiegelungssitzung (SQL Server Management Studio) Ob's auch mit dem SQL Server 2005 geht, kann ich jetzt nicht beantworten :-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Oder du verzichtest auf den auto increment und verwendest als Primärschlüssel uniqueid Werte und nicht int. Ist übrigens auch sehr praktisch wenn man in einem Programm Daten erfasst die dann erst später in die Datenbank eingespielt werden. Das bringt auch nichts. a) kann der Server selber sein GUID erzeugen (bei n Servern hat man n GUID's) und wenn es das Programm macht, dann muss der Datensatz auf alle Server verteilt werden. Das sollte nicht der Sinn und Zweck des Programmes sein. Diese Aufgabe würde ich schön dem Server überlassen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Ich seh hier überhaupt keinen Bezug zu C#, ich schieb den Thread mal in die Datenbank-Ecke und pass den Titel an. P.S.: Gibts bei MS-SQL nicht Standby-Datenbanken? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 14. April 2010 Autor Teilen Geschrieben 14. April 2010 Erstmal danke für die große Resonanz @grueni: Danke für den Hinweis. Der Bezug zu C# ist nicht ersichtlich da hier niemand weiß, dass das ganze Programm in C# geschrieben werden soll. Allerdings geht es im Moment um die Planungphase. Durch kurze Recherche hab ich gefunden, dass Microsoft keine Standby-Datenbanken unterstützt - allerdings denke ich, dass die Spiegelsitzung das gleiche bewerkstelligt (mit "Zeuge"). @TDM: dabei geht es - wenn ich richtig verstanden habe - um verteilte Tabellen, also eine Tabelle die auf unterschiedlichen Servern liegt. Oder irre ich mich? @lbm1305: Ich glaube dass das genau das ist was ich Suche Laut Microsoft beherrscht der Server 2005 das auch schon. Hat damit vielleicht jemand Erfahrungen mit so einer Spiegelsitzung? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Ist das nicht unter dem Strich ein Loadbalancer, der die Lasten auf mehrere Server bzw DBMS Instanzen verteilt, die wiederum auf einem redundaten System die DB laufen haben !? Ich muss mich doch als Anwender der GUI nicht darum kümmern welchen Server ich connecte bzw ob diese redundant ausgelegt sind!? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
noptic Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 @lbm1305 Das Problem ist wen du auto increment verwendest musst du die generirte GUID verwenden. Dann muss man Datensätzen die in die Datenbank importiert werden sollen neue IDs geben, ob man will oder nicht. Aktuel Arbeite ich an einem Programm das einzelne Datensätze zwischen verschiedenen Rechnern austauschen und synchronisieren kann, wobei jeder über eine eigene SQL Exprss Datenbank verfügt. Gibt es einen Weg den autoincrement zu "überschreiben":confused:? Das würde mir das leben auch einfacher machen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Hi, das was Du möchtest nennt sich entweder Clustering, Replikation oder Standby Datenbank. Je nachdem was Du implementierst darsft Du keine Auto Inc Schlüssel verwenden, da Du ansonsten doppelte Einträge generieren kannst. In einem Cluster arbeiten mehrere Instancen auf mehreren Servern auf einer physikalischen Datenbank (die natürlich auch per RAID gespiegelt werden kann/sollte). Hier darfst Du Autoinc Schlüssel verwenden. Bei einer Replikation kann entweder nur auf einer DB gearbeitet werden und die Daten werden transaktional repliziert oder die User arbeiten auf beiden Datenbanken und es muss eine Konfliktlösung implementiert werden falls beide gleichzeitig die gleichen Datensätze ändern. Falls auf beiden Servern gleichzeitig arbeiten möchtest darfst Du keinen AutoInc verwenden. Bei einer Standby Datenbank werden die mitprotokollierten Änderungen gesichert und der anderen DB im Fehlerfall zur Verfügung gestellt. Auch hier kannst Du AutoInc verwenden. In allen Fällen ist es keine kleine Denkaufgabe, sondern ein durchaus komplexes Thema mit vielen Fallstricken und Fehlerquellen wenn man keine Erfahrung mit der Materie im allgemeinen und der verwendeten DB im speziellen hat. Um so etwas mit einem externen Programm zu erledigen musst Du zusätzlich dafür sorgen, dass die Änderungen auch wieder irgendwie auf die ausgefallenen DB zurückkommen und dich auch um andere Dinge Locking etc. kümmern. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 @lbm1305 Das Problem ist wen du auto increment verwendest musst du die generirte GUID verwenden. Autoincrement und GUID (UniqueIdentifier) sind zwei verschiedene Dinge. Bei einer Guid gibt es kein increment :-? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Mal ein konkretes Beispiel: Es soll ein Inventurprogramm entstehen, welches auf einer MSSQL-Datanbank aufsetzt. Diese Datenbanken sollen quasi immer verfügbar sein. Es soll kein Backup-System entstehen (das kommt noch zusätzlich dazu) sondern ein komplett redundanter Server. Wenn man mit dem Programm arbeitet, dann hat man sozusagen eine Liste mit SQL-Servern, welche alle clone - also komplett gleich - sind (erstmal sind es nur zwei, soll aber erweiterbar sein). ... Das soll die Beschaffenheit des Netzes sein und nun soll eben ein gleichzeitiges schreiben auf mehreren Servern möglich sein - wobei die Primärschlüssel natürlich auf jedem Server dieselben sein müssen! Durch kurze Recherche hab ich gefunden, dass Microsoft keine Standby-Datenbanken unterstützt - allerdings denke ich, dass die Spiegelsitzung das gleiche bewerkstelligt (mit "Zeuge") Über den Mirroring Mechanismus des SQL Servers ist das zum Teil möglich. Du brauchst für einen automatischen Failover noch einen Witness Server wie du ja schon richtig erkannt hast. Einschränkung hierbei ist aber, dass nur auf dem Principal aktiv gearbeitet werden kann. Gleichzeitiges Schreiben auf mehreren Servern ist also nicht möglich. Ausserdem ist das Mirroring nur mit 3 Servern möglich (Principal, Mirror, Witness). Hinzufügen von weiteren Servern is also nicht. Das Schreiben auf mehreren Servern ist wenn möglich eher zu vermeiden, da passende Konfliktlösungen je nach Anwendung recht komplex sind. Prinzipiell ist das aber über die SQL Server Merge-Replikation machbar, wenngleich diese auch nicht ganz einfach zu Planen und Implementieren ist. Generell lässt sich zumindest viel von deinen Anforderungen verwirklichen, da die Replikation auch mit dem Mirroring verknüpfbar ist. In dem Fall sprechen wir aber von einem Projekt welches du, so wie ich das momentan einschätze, nicht ohne externen Berater und Projektleiter angehen solltest. Abschliessend würde ich dir (vielleicht auch nur aufgrund der eher schwammigen Anforderungen) zu einem Database Mirroring mit Witness Server raten. Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 14. April 2010 Autor Teilen Geschrieben 14. April 2010 Ich bin ja in diesem Fall der Anwendungsentwickler. Mir wurde gesagt, dass es sich um eine Replikation handelt und die User sollen immer auf beide Datenbanken gleichzeitig arbeiten. Daraus ergibt sich logischer weise, dass AutoInc nicht geht. Was mich zu meiner Ursprünglichen Frage zurückwirft. Wie bewerkstellige ich einen selbst generierten Primärschlüssel bei einer Replikation einer Datenbank bei der alle User gleichzeitig auf den Datenbanken schreiben? (Programmiersprache ist C#) Hmm scheinbar haben mir nur die richtigen Fachausdrücke gefehlt um mein Problem zu verdeutlichen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 14. April 2010 Teilen Geschrieben 14. April 2010 Mir wurde gesagt, dass es sich um eine Replikation handelt und die User sollen immer auf beide Datenbanken gleichzeitig arbeiten Das ist keine Replikation, sondern eine verteilte Transaktion. Im Prinzip sind das zwei offenen Connections, über beide Connections werden die gleichen Daten erzeugt (da hast schon mal Schwierigkeiten mit deinem PK egal ob AutoInc oder Guid) bzw. geändert und dann mithilfe eines Transaktionskoordinators gleichzeitig committet. Damit hast Du aber noch lange nicht das Problem gelöst, was passiert wenn eine DB ausfällt und wie später die Daten wieder auf die ausgefallene DB gelangen schließelich will man ja wieder einen gleichen Stand haben. Hmm scheinbar haben mir nur die richtigen Fachausdrücke gefehlt um mein Problem zu verdeutlichen. Ich fürchte es fehlt hier noch mehr. Nämlich auf der einen Seite eine genaue Angabe was man haben will. Auf zwei Datenbanken arbeiten ist keine Beschreibung, denn Ausfallzeiten werdet ihr immer haben wenn eine DB weg ist. Die Frage ist nur handelt es sich um Sekunden(bruchteile) oder dürfen es auch mal ein paar Minuten sein. Von Deiner Seite her kannst Du solche "Anforderungen" auch nicht kommentieren, weil Du leider selbst (noch) nicht weißt wovon die Rede ist. Ich an Deiner Stelle würde mich mit der MSSQL eigenen Replikationstechnik beschäftigen. Idealerweise einen Kurs dazu besuche wenn Du dich eingelesan hast und das passt. Ja ich weiß kostet Geld aber wenn dem AG seine Daten keine 2Tsd Euro wert sind, muss man sich auch überlegen ob sich der Aufwand überhaupt lohnt. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 14. April 2010 Autor Teilen Geschrieben 14. April 2010 Nochmals danke für die vielen Antworten. Das hat mich ein ganzes ende weiter gebracht . Mein Erstes Topic hier und schon bin ich begeistert :uli Weiter so! Bin bis auf weiteres zufriedengestellt und somit /closed Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
noptic Geschrieben 15. April 2010 Teilen Geschrieben 15. April 2010 Prinzipiell sind die genannten ,serverseitigen Methoden vorzuziehen. Aber hier stellt sich wie immer die Frage: Brauch ich das Wirklich? Was willst du den mit dem Programm machen? Wie Sensibel sind die Daten? Ich als Anwendungsendwickler sehe kein Problem dabei Inventur Daten und ähnliches einfach auf zwei Server zu schreiben. Ich würde vorschlagen Du nutzt das MVVM Pattern für dein Programm, dann kamst du die Vergabe der IDs gleich in deine Datenklassen packen, und dir einen eigenen Datacontext schreiben der beide Datenbanken abfragt und auch in beide schreibt. Diese Vorgehensweise hat den Vorteil das du kein complexes Server System brauchst. Aber wie bei allen "schmutzigen" Lösungen hat das ganze auch massive Nachteile: Du musst dir selber eine Lösung für Kollisionen Überlegen.Änderungen an der Datenbank Struktur sind ein AlptraumDu musst selber dafür sorgen das die Datenbanken synchronisiert werden Bei einer Inventur läst sich das einfach lösen: jeder Datensatz bekommt ein Feld "LastModified" und im Zweifelsfall werden immer die neuesten Daten übernommen. Das ganze Modell (samt Datenbank logik) wird dann in eine eigene dll kompiliert und fertig. Wenn du dann doch auf eine saubere serverseitige Lösung umsteigen willst/musst kannst du denn DataContext austauschen (also brav Interfaces nutzen ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 15. April 2010 Teilen Geschrieben 15. April 2010 (bearbeitet) Ich würde vorschlagen Du nutzt das MVVM Pattern für dein Programm, dann kamst du die Vergabe der IDs gleich in deine Datenklassen packen, und dir einen eigenen Datacontext schreiben der beide Datenbanken abfragt und auch in beide schreibt. Das kann ich auch ohne MVVM-Pattern. :-O Das M-V-VM Pattern ist ein Architektur-Pattern welches auf dem MVC-Pattern beruht und eher für WPF / Silverlight Anwendungen gedacht. Es funktioniert aber auch mit WindowsForms. Bearbeitet 15. April 2010 von lbm1305 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 15. April 2010 Autor Teilen Geschrieben 15. April 2010 Nunja ich stehe nun vor diesen beiden Möglichkeiten. Einerseits die "schmutzige" Lösung - welche bisher von der IT im Hause (für dieses Projekt) favorisiert wurde und der Hardwareseitigen Lösung, wobei ich allerdings die Hardwareseitige Lösung erstmal für besser erachte da es natürlich erheblich einfacher ist dafür zu Programmieren . Meine Frage im Moment ist noch wie das bei einer Replikation funktioniert (mit Witness) wenn einer der beiden Server aussteigt bzw. wenn der Witness aussteigt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
noptic Geschrieben 15. April 2010 Teilen Geschrieben 15. April 2010 (bearbeitet) Ja MVVM muss nicht sein. Hauptsache man hat ein Pattern mit einem getrennten Modell. Ich sagte ja auch nur das sich das für diesen Fall anbietet. Wen man schon mit c# arbeitet sollte man sich einen Umstieg auf WPF zumindest gründlich überlegen (aber das würde den Rahmen des Threads sprengen). Und WENN man auf WPF arbeitet sollte man von anfang an ein passendes Pattern wählen. Ich kriege schon eine Gänsehaut wen ich nur an den Quellcode denke der hier in den ersten Monaten einstanden ist(Chef: 1.Das Programm muss in 2 Wochen fertig sein 2.ab sofort wird nur noch wpf verwendet!) Bearbeitet 15. April 2010 von noptic Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stumpy2k Geschrieben 15. April 2010 Autor Teilen Geschrieben 15. April 2010 Nunja das Tool soll mit WindowsForms designt werden . Also ich hatte eben nochmal ein Gespräch mit den verantwortlichen und habe einiges in Erfahrung gebracht ^^. Es wird auf jeden fall eine Merge-Replikation benutzt, da diese Struktur schon vorhanden ist und darauf auch schon andere Software läuft. Es wird immer nur auf einem Server geschrieben, da sich genau diese Merge-Replikation um die Verbreitung kümmert -> Es gibt eine Exeption, wenn der Server den Merge nicht hinbekommt, da bei jedem Einfügen eines Datensatzes dieser Merge ausgeführt wird. Nun muss ich es nur hinbekommen dass ich, wenn der eine Server ausfällt (eine entsprechende Exeption schmeißt) den anderen weiter benutze. Das sollte zu schaffen sein Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.