DBF spiegeln?

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
DelUser01

DBF spiegeln?

Beitrag von DelUser01 »

Hallo

Ausgangssituation:
Eine Applikation läuft als Mehrplatz-Netzwerklösung. Mehrere DBFs und NTX. Hier wird ergänzt, geändert, gelöscht, usw.
Dieselbe Applikation läuft auch auf einem WebServer mit WAA. Hier werden über HTML Listen (Auswertungen usw.) abgerufen.
(Da es sich um das Internet (nicht Intranet) handelt wird zur Sicherheit nicht auf die im Firmen-Netzwerk liegenden Original-DBFs zugegriffen sondern nur auf die Kopie auf dem WWW-Server).

Im Augenblick gehe ich her und kopiere mit Robocopy nachts die Daten (DBF, NTX, DBT) vom lokalen Netzwerk zum Webserver.
(Die EXE, DLL usw. wird schon automatisiert aktualisiert. Das angewandte Verfahren ist aber für Datenbanken nicht sinnvoll...).

Nun möchte ich das Abgleichen im Live-Betrieb durchführen.
Es wäre übertrieben jedes geänderte Feld fast gleichzeitig auch auf dem Webserver zu ändern.
Es reicht ein Synchronisierungslauf alle 5 bis 15 Minuten.
Es soll nur dann auch nur noch abgeglichen werden wenn sich an der jeweiligen DBF etwas geändert hat. Das lässt sich ja an Datum und Zeit der DBF feststellen.

Ergänzung 1:
Auf den Webserver kann vom internen Netzwerk vollständig zugegriffen werden. Die Firewall wird dementsprechend geöffnet.
Das heißt, dass die interne Xbase++-Anwendung die Original-DBF und die gespiegelte gleichzeitig öffnen kann (mit den zugehörigen NTX).
(Die Anfangs geschilderte Ausgangssituation ist für die Lösung damit eigentlich uninteressant).

Frage:
Gibt es da was einfaches was von Xbase++ bereits mit vorhandenen Funktionen unterstützt wird (und ich sehe den Wald vor lauter Bäumen nicht) oder muss ich die Spiegelung neu ausarbeiten?

Ich habe noch nicht den richtigen Ansatz gefunden. Vielleicht hat jemand so etwas auch schon gemacht.
Könnt Ihr mir da Mal einen Denkanstoß geben...Danke!

Gruß
Roland
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBF spiegeln?

Beitrag von brandelh »

Du schreibst, dass der Zugriff vom internen Netzwerk unbeschränkt möglich ist, habt ihr hier eine sicher verschlüsselte VPN Lösung laufen ?
Der aktuelle Abgleich mit Robocopy hat zumindest den Vorteil, dass IMMER die gleichen Daten zum Zeitpunkt des Abgleiches vorliegen. Dateiweise geht schnell !
Danach natürlich nicht mehr ...

Alles was alle 5 Minuten die Daten abgleicht (Satzweise ... ist langsam und benötigt einwandfreie Indexdateien)
Xbase++ sieht hier genausowenig was vor, wie Clipper. Das Änderungsdatum der Datei könnte ein Hinweis sein, dass sich etwas geändert hat, aber was weiß man nicht.
Die interne Funktion die die letzte Änderug im DBF Header speichert ist seit 2000 nicht mehr zuverlässig ... ich habe sogar den Namen vergessen ;-)
Nun zum Update als solchem, du willst doch nicht wirklich die DBF mit NTX über das VPN öffnen unk konkurierend mit dem WAA zugreifen oder ?

Ich würde eher daran denken Listen von Änderungen zu erzeugen und diese zum WWW Server zum Abgleich zu senden, dabei ist aber natürlich NIE ein konsistenter Datenbestand gewährleistet !

Beispiel:

PC 1 schreibt 20 Änderungen und übermittelt auf den WebServer die Auftragsliste (dort sind alte Daten)
WWW-Servertask arbeitet die 20 Änderungen ein ...
gleichzeitig (sagen wir bei Änderung 10) fragt nun ein WWW Client vom Server Daten ab, er erhält nun möglicherweise alte Daten gemischt mit soch geänderten Daten ...

Sicherlich ist es möglich, dass dies kein Problem in deinem konkreten Anwendungsfall darstellt, in meinen Programmen wäre das nicht tragbar.

Vermutlich ist es immer schneller wenn die komplette Datei mit CDX :!: ! Indexen (die sind kleiner und man kann einfach EINE DBF mit EINER CDX Datei verwalten) komplett überträgt,
dazu müsste man aber kurzfristig beide Dateien im exclusiven Zugriff haben ... eventuell gibt es ja Software die das unter Win7 Server 2008/2012 hinbekommt.
Deine Anwendung müsste dann damit klar kommen, dass eventuell die Dateien gesperrt sind.
Gruß
Hubert
DelUser01

Re: DBF spiegeln?

Beitrag von DelUser01 »

Hallo Hubert
Du schreibst, dass der Zugriff vom internen Netzwerk unbeschränkt möglich ist, habt ihr hier eine sicher verschlüsselte VPN Lösung laufen ?
Der Web-Server steht im RZ der Firma in einer DMZ des Firewalls mit Gigabit-Durchsatz( theoretisch).
"Unbeschränktheit" kann ich für den Spiegelungsvorgang einrichten. Sonst ist die Sache dicht.

Die interne Original-DBs wären nicht das Problem. Die könnte ich morgens (sagen wir 4 Uhr) exklusiv öffnen bzw. der Einfachheit halber gleich mit Robocopy schnell kopieren.

Die öffentliche Seite ist das Problem. Da müsste ich die Anwendung stoppen um mit Robocopy die Spiegelung durchzuführen.

Beides wäre nicht möglich bzw. sinnvoll wenn die Änderungen mehrmals am Tag bei Bedarf durchgeführt werden müssten.

Und da hast Du natürlich vollkommen Recht - unklare Zustände beim Abfragen der Daten wären nicht hinnehmbar.
Allerdings könnte ich mir vorstellen, dass während eines Spiegelungslaufs die Internet-Applikation kurz mit einem Hinweis gestoppt wird.
Die hier vorliegende Applikation ist eine Wissensdatenbank und wird häufiger abgefragt als geändert.
Wenn es sich aber wie Du in Deinem Beispiel verwendet hast um eine Art Warenwirtschaft handeln würde müsste die Sache anders aufgebaut werden.
Genau deswegen mache ich mir auch umfangreich Gedanken zu meinem Vorhaben. Ich vermute, dass im Zuge der Weiterentwicklung der Applikation die Abfrageseite nicht mehr einfach Mal für ein paar Minuten abgeschaltet werden kann. Und schon gar nicht mehrmals am Tag.

Vielleicht wäre es am einfachsten eine Art "Änderungs-Tracking" einzubauen. Am einfachsten nur bezogen auf Records. Das Tracking beinhaltet z.B.
den Namen (Alias) der geänderten DB,
die geänderte Record-Nr.,
die Art der Änderung (Feld geändert, Record hinzu, Record gelöscht).
Und der gesamte geänderte Record wird in eine Synchronisierungs-DB abgelegt.
Die Applikation auf dem Webserver liest dann das Tracking und führt die Änderungen durch.
Fast so als würde der User die DBs jeweils getrennt ändern/ergänzen.

Wie das Ganze bei einer Reorganisation mit Pack() aussieht muss dann auch überdacht werden...

Im Prinzip wie ein inkrementelles Online-Backup auf der einen Seite und auf der anderen wie ein Online-Recover.

(viel und laut gedacht...)

Gruß
Roland
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: DBF spiegeln?

Beitrag von georg »

Hallo, Roland -


hänge ein Feld dran, in dem Du Datum und Uhrzeit der Änderung protokollierst. Einen Index darüber, dann hast Du die Datensätze, die geändert werden müssen. Ein zweiter Durchlauf, um gelöschte Sätze abzugleichen, dann sollte es passen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
DelUser01

Re: DBF spiegeln?

Beitrag von DelUser01 »

Hallo Georg

natürlich - Du hast recht - mit so einem Änderungsinfo-Feld würde es auch einfach zu machen sein. Bei einer Neuentwicklung kann ich mir vorstellen dass das permanente mitspeichern jeglicher Änderungsvorgänge machbar ist.
Wenn ich auf längst bestehende Parts zurückgreife bin ich mir nicht sicher ob ich damit das Aktualisieren dieses Änderungsinfo-Feld 100%ig dicht bekomme.

Da wäre es notwendig gewesen schon frühzeitig einen zentralen Schreibvorgang einzubauen welcher immer diese Änderungen an Feldern/Records schreibt.
Das könnte ich allerdings in meiner RLock-Funktion einbauen. Die ist zentral und sollte fast immer benützt werden. Aber eben nur sollte.
Das klappt aber schon bei FLock-Vorgängen, Replace All, Pack usw. nicht mehr. Da müsste zusätzlich ein Abgleichlauf drüber.

Danke für den Tipp - ich mache mir Gedanken...

Gruß
Roland


Allerdings greife ich in meinen Programmen auf viele Funktionen zu deren
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBF spiegeln?

Beitrag von brandelh »

Wenn das alles einem LAN mit Gigabit Leitungen hängt, kann das mit dem kompletten Dateiaustausch (eventuell aufgeteilt auf zusammengehörige Dateien doch nur einige Sekunden benötigen.
Das sollte dann aber z.B. die Anwendung selbst oder eine die als Verwaltungsanwendung auf dem Server läuft handhaben.

Wenn der Webserver bei euch steht, kannst du auf dem Server eine Xbase++ Anwendung (auch als Dienst) laufen lassen die im Hintergrund nach neuen Daten (satzweise oder komplett) sucht und die Daten abgleicht. Hierfür kann man z.B. eine DBF nutzen um per flock() komplett oder mit rlock() Satzweise (eine DBF je Satz) gesperrt die Syncronisation zu übernehmen.

Wenn die WAA Anwendung die Dateien für jeden Zugriff öffnet (so verhält sich meine CGI-EXE immer), musst du nur abprüfen ob die Datei aktuell gesperrt ist ...
wenn nicht, muss der WAA erkennen ob die Datei geschlossen werden muss. In beiden Fällen gibt er eine "Wartungsmeldung" in einigen Sekunden (Minuten) erneut versuchen ...
Gruß
Hubert
DelUser01

Re: DBF spiegeln?

Beitrag von DelUser01 »

Hallo Hubert

so wie Du das Dir vorstellst werde ich das voraussichtlich auch machen.
Auf dem Intranet habe ich auf einem der Server schon ein Steuersystem laufen für Berechnungen, Updates usw. im Batch-Verfahren (in sprachlicher Anlehnung an die alten IBM-Abläufe). Da kann ich den internen DBF-Update-Prozess einbinden der die Original-Daten für das Update aufbereitet/kopiert.
Auf dem Web-Server könnte ich das dann auch machen. Im Moment läuft da schon so etwas für die Aktualisierung meiner Programme (EXE, DLLS usw.).
Dort würden dann die bereitgestellten Original-Dateien kopiert bzw. eingearbeitet.

Mir scheint so ein Verfahren fürs Erste universeller als die permanente Kennzeichnung geänderter Records. Das ist aber auch wieder ein Mittelweg zwischen Aufwand und möglicher Rechnergeschwindigkeit.

Ich sehe nur, dass die eine oder andere DBF im Laufe der Zeit sehr groß werden wird und der Kopiervorgang damit auch der Kopiervorgang merklich länger wird. Vor allem mit den dann auch sehr großen NTX.

Wie ich es auch drehe und wende - jeder Ansatz hat Vor- und Nachteile. Noch sehe ich nicht die (im Augenblick) beste Lösung für das Problem.

(Wie macht das Google? Die müssen doch auch Ihre Datenbanken auf der ganzen Welt ein wenig up-to-date und synchron halten...)

Vielleicht auch zwei Verfahren gleichzeitig?
Für DBFs mit überschaubarer Anzahl Records das direkte Update-Verfahren (auf dem Intranet-Server werden direkt auch die Daten des Web-Servers geändert).
Für große DBFs Nachts/Morgens 1x der Wartungsmodus mit reiner Kopierfunktion der DBFs, NTX usw.

(Uff - das alles nur wegen einer DB-Spiegelung im laufenden System...)

Gruß
Roland
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: DBF spiegeln?

Beitrag von Lewi »

Da xBase keine Funktionen für Datenreplizierungen verfügt, würde ich den Ansatz verfolgen, mittels Web-Service die Daten aus dem Intranet an den externen Web-Server zu übermitteln. Web-Serviceses lassen sich unter xBase mit der Library xb2Net realisieren.

Das WAA schickt die Anfrage an den Web-Service mit den Parameter für die Datenabrage. Der Web-Server nimmt die Anfrage entgegen und liefert die entsprechenen Daten. Wenn, wie geplant, die Datenabfragen über Web halbwegs live-Bedingungen entsprechen sollen, bietet sich unter den von Dir dargelegten Randbedingungen m.E. kein anderer praktikabler Lösungsansatz .

Gruß, Olaf
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: DBF spiegeln?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:(Wie macht das Google? Die müssen doch auch Ihre Datenbanken auf der ganzen Welt ein wenig up-to-date und synchron halten...)
die verwenden aber keine DBF als Datenbank ;)
bei SQL Server nennt man das "Replikation".

der Ansatz von Georg (Timestamp) würde ich noch erweitern um eine Feld "CreateDate",
wie es z.b. der Outlook Calender hat, wo die Problematik "synchronisieren" mit Clients so gelöst wurde.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBF spiegeln?

Beitrag von brandelh »

Wenn die Daten-DBF sehr groß werden können, die Anzahl der User hoch ist oder steigt und eine Replication nötig ist, dann sind DBF Dateien mit NTX/CDX sicher nicht die beste Wahl :!:

In dem Beispiel würde ich mir jemand suchen der sich mit SQL Server auskennt,
den Server nehmen der die nötige Replication SICHER und im HINTERGRUND erledigt und mein System darauf umstellen.

Mir wäre das Risiko zu groß, dass nach einem Anfangserfolg das System nicht mehr handlebar wird.
Gruß
Hubert
Antworten