AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Synchronisation zwischen Datenbanken - Ideen?
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronisation zwischen Datenbanken - Ideen?

Ein Thema von jf_stgt · begonnen am 30. Mai 2011 · letzter Beitrag vom 31. Mai 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#11

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 02:29
Noch eine Zeitstempel-Variation:

Die Daten werden nur mit einem Server synchronisiert und damit kann der eine "Zeit" festlegen: Die Anzahl der bereits erfolgten Synchronisationen.

Angenommen der Server hat eine Zeit von 1337 und der Client wurde zuletzt bei 17 synchronisiert.
  • Wenn ein Datensatz (z.B. ein Eintrag auf der Löschen-Liste) auf dem Client angelegt wird, wird sein Zeitstempel auf Null gesetzt (daher: nicht synchronisiert).
  • Nun lädt der Client alle Datensätze von Server herunter, die einen größeren Zeitstempel als 17 haben.
  • Die mit Null beschrifteten Datensätze sendet er nun an den Server und sie bekommen auf Client wie Server den Zeitstempel 1338.
  • Der Server hat nun die Zeit 1338 und der Client ist auch auf Stand von 1338.

Nett wäre hier, wenn nicht ein anderer Client gleichzeitig auch versucht zu synchronisieren.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 03:10
Hmm ... das "Update-Liste pro Client"-Konzept ist auch eine Lösung.
Allerdings muß hier geklärt sein, welche DB die Master-DB stellt.

Wenn ich den TO richtig verstanden habe, wird auf beiden DBs aktiv gearbeitet.
Die Synchronisation muß also in beiden Richtungen stattfinden. Und da kommt man an einem Zeitstempel nicht vorbei. Allzumal die Synchronisation nicht zeitgleich passiert sondern mit Sicherheit in bestimmten zeitlichen Intervallen.

Wie soll man verhindern, das z.B. Online ein Termin gelöscht und gleichzeitig (im gleichen Zeitintervall) der selbe Termin lokal nur verschoben wird. Oder auch umgekert. Das sind zwei unterschiedliche Vorgänge auf ein und die selbe Information (sprich Datensatz)!

Selbst ein Mischen und Sortieren der Updatelisten beider DBs kann zu Datenverlust führen.

Löschen von Datensätzen, die mit anderen DB's Synchronisiert werden sollen, halte ich daher immer für einen schlechte Idee. Eine Löschmarkierung ist hier der bessere Weg.

Ich glaube grundsätzlich kann man sagen, dass das Synchronisieren von zwei (oder mehreren) DBs immer ein Problem darstellt und sollte immer von Anwendungsfall zu Anwendungsfall neu überdacht werden.

Meines Erachtens ist es das wichtigste, das Termine (Datensätze) auf allen DBs einen eindeutigen ID besitzen, damit man sie jederzeit identifizieren kann.

Zitat von BUG:
Nett wäre hier, wenn nicht ein anderer Client gleichzeitig auch versucht zu synchronisieren.
Das definitiv.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 04:14
Die Update-Liste braucht man eigentlich nur auf dem Server, da dort die ausstehenden Änderungen pro Client gespeichert sind.
Gut so eine Tabelle kann der Client auch führen, dann ist das Handling der gelöschten Sätze einfacher.

Einen Timestamp sollte man bei der Haupttabelle haben.

Ein Löschen kann generell nicht verhindert werden, wenn das Löschen möglich sein muss.
Wie wäre denn der Fall, wenn alle an einem Server arbeiten?
Der Datensatz ist weg.

Selbiges gilt für das Ändern von Datensätzen, da gewinnt die letzte Änderung.
Um die herauszufinden benötigt man den Timestamp vom Client.

Und da wartet schon die nächste Hürde:
Am Client wird die Uhrzeit 3h vor gestellt und schon würden alle jetzt gemachten Änderungen gewinnen.

Das ist aber auch schon fast ein anderes Thema.
Hier ging es ja zunächst um die Sicherstellung, dass alle Objekt repliziert werden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#14

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 07:44
Für eindeutige IDs würde ich eine GUID nehmen. Ohne die geht es nicht.

Die Tabelle der durchgeführten Änderungen (eingefügt, gelöscht, verändert) als Basis für den Synchronisationsprozess ist schon richtig.
Wenn Du dann noch Konflikte behandelst (Änderungen widersprechen sich), bist Du fertig.
Ein Konflikt tritt z.B. dann auf, wenn der eine einen Datensatz löscht, ein Anderer den gleichen DS zwischenzeitlich jedoch verändert hat.
Oder beide verändern ein und das selbe Feld eines DS.

Du kannst hier entweder nach dem Prinzip "Last one wins" vorgehen, oder Du implementierst eine Konfliktbehandlung ("DS xy wurde von Schulze am BLABLA verändert, aber von Ihnen am BLABLUB gelöscht"). Da beim ersten Fall Datenänderungen unbemerkt verschwinden können, würde ich eine Konfliktbehandlung ("reconcile") implementieren. Das ist übrigens das sog. "briefcase model".

Um solche Konflikte sicher erkennen zu können, könntest Du dir merken, "wann" (und vom wem) ein Feld zum letzten Mal geändert wurde. Liegt dieser Zeitpunkt NACH deinem letzten Abgleich (und du hast diesen DS/Feld) verändert, liegt ein Konflikt vor.

Konfliktbehandlungen bekommst Du auch in den Griff, wenn Du dir eine Kopie der DB ("Original") nach erfolgter Synchronisation erstellst und vor der nächsten Synchronisation die Daten mit dieser DB-Version vergleichst: Hat sich ein zu ändernder Datensatz (Von 'A' nach 'B') zwischenzeitlich verändert, war die Änderung nicht exklusiv, es liegt dann also ein Konflikt vor. Du vergleichst also jeden DS VOR dem Abgleich mit dem Original. Damit erkennst Du zwar Konflikte, nicht jedoch, WER der Konfliktpartner ist.

Ich würde den ersten Weg wählen: Man hat auch eine sehr mächtige Änderungshistorie, was bei Geschäftsdaten nicht unerheblich ist. Du kannst dann auch Fragen beantworten, wie: "Wer hat denn damals den Ansprechpartner von Fa. Halmackenreuther geändert".
Das Bild hängt schief.
  Mit Zitat antworten Zitat
jf_stgt

Registriert seit: 26. Sep 2008
33 Beiträge
 
Delphi 2007 Professional
 
#15

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 11:45
Oh, das sind ja viele Antworten. Danke!
Ich werde versuchen auf die wichtigsten Punkte einzugehen...

Zitat von jobo:
Ich kann mir nicht vorstellen, dass soetwas als Clientoperation in einem heterogenen Umfeld robust funktioniert. Allein schon verteilte Transaktionen innerhalb eines Systems können tückisch sein, abgesehen von der Synchronisationslogik.
Ich würde es bei heterogenen DB mit einem Application Server versuchen.
Problem ist, dass sowohl Client1 als auch Client2 spontan mal ohne Internetzugang auskommen muss! Dass es dann natürlich zu Kollisionen kommen kann ist ja klar. Aber da haben wir das Konzept neuester Zeitstempel gewinnt. Nicht ganz toll - aber so ist es im Moment.

Zitat von Lemmy:
Was ich mir vorstellen könnte: Du syncronisierst ja aktuell in 2 Ebenen: Einmal horizontal zwischen den Firebird-Installationen und einmal Vertikal zur MySQLDB. Wie wäre es die MySQL als "Master" zu verwenden ...
Noch mal zur Verdeutlichung. Eine MySQL-Master-DB im Internet. Mehrere Clients (Firebird).
Die Clients haben einen Dienst, der alle 30 Sekunden die Datenbanken automatisch durchkämmt. Also nicht vom Benutzer angestossen.
Zuerst die eine, dann die andere Richtung.

Zitat von Sx2008:
Der Hashvalue wird zusätzlich zu den Adressdaten in einem eigenen, indizierten Feld gespeichert...
Dies scheint mir zur als Zusatz sinnvoll. Wie soll man so Client->Master alle Sätze abgleichen.
Ein update eines Satzes müsste natürlich auch ein Update des MD5 nach sich ziehen.

Zitat von gmc616:
Kurze Frage, damit ich das korrekt verstanden habe: Du synchronisierst EINE Firebird-DB (Win-Client) mit EINER MySQL-DB (online), oder MEHRERE Firebird-DB's (eine pro Client) mit EINER MySQL-DB?
Nochmals kurz. Mehrere Win-Arbeitsplätze (Clients mit Firebird Datenbank) und EINE MySQL Master Datenbank.

Zitat von gmc616:
Dein DB-Konzept zur Synchronisation hört sich recht gut an.
Danke

Zitat von gmc616:
... Das könnte ein System-Dienst auf dem lokalen DB-Server übernehmen.
Passiert schon.

Zitat von gmc616:
Dann brauchen deine Termine einen eindeutigen ID. Deshalb verpasst du den Terminen neben dem Zeitstempel, der die letzte Änderung des Termins beschreibt (nennen wir ihn Änderungsstempel), einen weiteren Zeitstempel, der die Erstellung des Termins beschreibt, mit einer zusätzlichen Kennung in welcher DB der Termin erstellt wurde. Den nennen wir "Erstellstempel" oder einfach ID, dann das wäre dann einer.
Wichtig: Für beide Zeitstempel nutzt du die Zeit des jeweiligen DB-Servers, nicht die des Clients! D.h. im SQL-Statement Now()!!
Die zusätzlich DB-Kennung deswegen, weil die Zeiten der beiden DB's bzw. deren Server nicht zu 100% synchron sein werden.
Das könnte ein Knackpunkt sein. Also die Sätze haben eine eindeutige ID. Die ID ist über ein Generator gesetzt mit jeweils ein Offset (1 Mio.) je Client. D.h. der Nummernkreis der ID (1000000-1999999 Ist Platz 1, 2000000-2999999 Platz 2 usw.).
Brauche ich jetzt noch die zusätzliche DB Kennung und wie meinst Du das genau mit dem Now(). Wenn ich lokal ein Now() mache habe ich ja die lokale Zeit. Du meinst bei jedem Insert die MySQL Zeit einzustempeln (Internertzugang weg - Perfomance?) ???
Sorry aber ich habs net ganz verstanden.

Zitat von Sir Rufo:
Hauptproblem bei der Synchronisierung via Zeitstempel bleibt aber die Auflösung des Zeitstempels.
Ein MySQL Server schafft ja (je nach Hardware) mehr als einen Datensatz pro Millisekunde zu speichern.
xxx1 Client A schreibt Datensatz
xxx2 Client B bekommt die Datensätze geliefert (höchster Zeitstempel xxx)
xxx3 Client A schreibt Datensatz
Bei der nächsten Abfrage bekommt Client B aber nicht den 2. Datensatz von A geliefert, denn dieser Datensatz hat ja auch den Zeitstempel xxx obwohl er nach der Abfrage von Client B geschrieben wurde.

Somit müsste also die Abfrage nicht Zeitstempel > xxx lauten, sondern Zeitstempel >= xxx.
Damit bekommt man aber wieder ein entsprechenden Overhead, den man evtl. vermeiden möchte/muss.
Perfomance spielt hier so eine untergeordnete Rolle (Gefahr beim Löschen dass keine Sätze zurückkommen). Das größer gleich ist drin!

Zitat von Sir Rufo:
Und da wartet schon die nächste Hürde:
Am Client wird die Uhrzeit 3h vor gestellt und schon würden alle jetzt gemachten Änderungen gewinnen.
Ich erkenne die Änderung der Systemzeit und hole bei jedem Sync (alle 30 Sekunden) die Systemzeit kurz vom MySQL Server ab und vergleiche dies mit der aktuellen Uhrzeit. Damit dieser Fehler weitestgehend vermieden wird.

Zitat von FredFesl:
Konfliktbehandlungen bekommst Du auch in den Griff, wenn Du dir eine Kopie der DB ("Original") nach erfolgter Synchronisation erstellst und vor der nächsten Synchronisation die Daten mit dieser DB-Version vergleichst: Hat sich ein zu ändernder Datensatz (Von 'A' nach 'B') zwischenzeitlich verändert, war die Änderung nicht exklusiv, es liegt dann also ein Konflikt vor. Du vergleichst also jeden DS VOR dem Abgleich mit dem Original. Damit erkennst Du zwar Konflikte, nicht jedoch, WER der Konfliktpartner ist.
Ich würde den ersten Weg wählen: Man hat auch eine sehr mächtige Änderungshistorie, was bei Geschäftsdaten nicht unerheblich ist. Du kannst dann auch Fragen beantworten, wie: "Wer hat denn damals den Ansprechpartner von Fa. Halmackenreuther geändert".
Kopien der Datenbanken möchte ich im Moment nicht machen. Die Idee ist gut, aber die Kollisionserkennung scheint mir im Moment nicht das Problem (außer Löschen, s.u.!).
Die Idee mit dem Erkennen der letzten Änderungen für Supportzwecke ist super!

WEITERE ANMERKUNGEN:

Eine Update Liste je Client wie von manchen gefordert hatten wir mal bei einer alten DB Technik. Das war super unperfomant - könnte bei FB jetzt besser gehen. Die Frage ist, ob man beides umsetzten sollte (Zeitstempel und Update-Liste). So könnte man Änderungen vielleicht sicherer erkennen. Sobald ein Satz entweder in der Update-Liste ODER über den Zeitstempel als geändert gilt ist er wirklich geändert. Mal überdenken...

Was ich mir noch vorstellen könnte, dass vielleicht der Satz (Termin) gelöscht wird und(!) auf der anderen Seite verändert??!! Möglicherweise wird diese Kollission nicht erkannt?
Ein Umbau auf ein Flag "IsDeleted" bei jedem Satz statt dem "echten" Löschen scheint mir auf alle Fälle sinnvoll. Aber dies ist natürlich auch nicht sofort erledigt bei ca. 50 Tabellen.

Gruß
Jürgen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 11:58
Zitat:
Ich werde versuchen auf die wichtigsten Punkte einzugehen...

Zitat:
Zitat von jobo:
Ich kann mir nicht vorstellen, dass soetwas als Clientoperation in einem heterogenen Umfeld robust funktioniert. Allein schon verteilte Transaktionen innerhalb eines Systems können tückisch sein, abgesehen von der Synchronisationslogik.
Ich würde es bei heterogenen DB mit einem Application Server versuchen.
Problem ist, dass sowohl Client1 als auch Client2 spontan mal ohne Internetzugang auskommen muss! Dass es dann natürlich zu Kollisionen kommen kann ist ja klar. Aber da haben wir das Konzept neuester Zeitstempel gewinnt. Nicht ganz toll - aber so ist es im Moment.
Mir ist das noch nicht klar, synchronisieren also Client1 und Client2 (ohne Internet) dann untereinander? Also so eine Art Multi-Master System?

Stichwort "zeitweilig ohne Internet"
Das meinte ich eigentlich mit robust. Wie arbeitest Du im Client mit Verbingungstrennung / -Abbruch? Z.B. nachdem Du bereits einige Daten auf mySQL aktualisiert hast. Da muss es doch zu Inkonsistenzen kommen, zwischen den DB hast Du doch keine Transaktionssicherheit.
Gruß, Jo
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#17

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 12:11
Mehrrechner-Datenbanksysteme

Grundlagen der verteilten und parallelen Datenbankverarbeitung
http://dbs.uni-leipzig.de/buecher/mrdbs/index.html
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
jf_stgt

Registriert seit: 26. Sep 2008
33 Beiträge
 
Delphi 2007 Professional
 
#18

AW: Synchronisation zwischen Datenbanken - Ideen?

  Alt 31. Mai 2011, 14:31
Mir ist das noch nicht klar, synchronisieren also Client1 und Client2 (ohne Internet) dann untereinander? Also so eine Art Multi-Master System?
Nein, Client1 und Client2 synchronisieren nie direkt miteinander sondern nur über den Master (MySQL). Sonst muss man die Router konfigurieren wegen eingehenden Verbindungen, ...

Stichwort "zeitweilig ohne Internet"
Das meinte ich eigentlich mit robust. Wie arbeitest Du im Client mit Verbingungstrennung / -Abbruch? Z.B. nachdem Du bereits einige Daten auf mySQL aktualisiert hast. Da muss es doch zu Inkonsistenzen kommen, zwischen den DB hast Du doch keine Transaktionssicherheit.
Da kann es natürlich zu Problemen kommen. Wie gesagt, dass ist klar, aber sobald die Datenbanken wieder on sind, läuft die Synchronisation weiter.
Auf den Clients kommt eine Meldung sobald der "Haupt-Client" nicht mehr am Netz hängt und keine Änderungen gemacht werden sollen. Dies kommt ja nicht sooo häufig vor. Hauptsache auf dem Hauptrechner kann weiter gearbeitet werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz