Schrift
[thread]12380[/thread]

Dateioperation ?!



<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-08-20 10:49
#113730 #113730
Folgendes Szenario:

Eine Maschine stellt eine Datei xyz.txt bereit.
Zwei Suse-Rechner greifen darauf per WebDav zu und sollen die Datei xyz.txt verarbeiten.
In xyz.txt stehen Daten, die auf beiden Susen in eine MySQL-DB importiert werden müssen.

Problem: Wenn sich die erste Suse die xyz.txt schnappt, hat ja die 2. Suse ein Problem oder umgekehrt.

Wie kann ich es hinbekommen, dass so etwas nicht passiert?!
Datenbank auf eine andere Maschine auslagern ist leider keine Lösung!!!!!

Hat hier jemand eine gute Lösung?
pq
 2008-08-20 12:01
#113731 #113731
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Gast+2008-08-20 08:49:20--
Problem: Wenn sich die erste Suse die xyz.txt schnappt, hat ja die 2. Suse ein Problem oder umgekehrt.

warum?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2008-08-20 12:07
#113732 #113732
Na, wenn z.B. per Cronjob beide Susen alle 5min. suchen, ob die xyz.txt da ist, dann schnappen sie sich, arbeiten den SQL-Import ab und löschen die xyz.txt, schauen wieder nach 5min, ob eine neue da ist u.s.w.

D.h., wenn die erste Suse sieht, Ja, Datei ist da gehts los.
Wenn die 2. Suse dann 1 sek. später schaut, gibts keine xyz.txt mehr.

Damit würden die Datenbanken auseinander laufen ...

Das ist das Problem
moritz
 2008-08-20 12:11
#113733 #113733
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Eine Lösung wäre z.B., die verarbeitete Datei erst später zu löschen, wenn beide Rechner sie garantiert verarbeitet haben.
Gast Gast
 2008-08-20 12:32
#113737 #113737
mmmh ...

ja - schon klar, aber eines darf dann nicht passieren:

Die xyz.txt wird ja von einem dritten Rechner den beiden Susen bereitgestellt.

Was passiert, wenn genau während der Verarbeitung eine neue von dem dritten Rechner bereitgestellt wird?

Dann würde es ja auch Ärger geben ...

also so eine richtige Lösung habe ich noch nicht dazu ...
dasa
 2008-08-20 12:33
#113738 #113738
User since
2008-08-19
4 Artikel
BenutzerIn
[default_avatar]
Wie wärs wenn du mit Zeitstempel arbeitest, die Lösung in Pseudocode:

Script eins:

Holt Zeitstempel von xyz.txt
Wenn /tmp/<script1bezeichner><zeitstempelderdatei>.txt nicht vorhanden
Script eins kopiert xyz.txt nach /tmp/xyz<zeitstempelderdatei>.txt
führt txt aus
löscht alle alten /tmp/<script1bezeichner><altezeitstempel>.txt

Script zwei ähnlich, nur halt mit einem anderen Bezeichner.
Linuxer
 2008-08-20 21:54
#113782 #113782
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,
wie wär's mit:

der generierende Rechner teilt den beiden SuSE Rechnern mit, dass es eine neue xyz.txt gibt, die sie verarbeiten können. Jeder verarbeitende Rechner meldet an den generierenden Rechner die erfolgreiche Verarbeitung und erst, wenn alle sich zurückgemeldet haben, kann eine neue xyz.txt abgelegt werden.

Erfolgt innerhalb von X Zeiteinheiten keine erfolgreiche Rückmeldung, so wird eine Fehlerbenachrichtigung ausgelöst.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
topeg
 2008-08-20 23:12
#113784 #113784
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Mit einer Namend-Pipe (fifo) könnte man es auch machen.
Das Script, das die "xyz.txt" datei erzeugt legt stattdessen eine Benannte Pipe an. Wann immer ein Anderes Programm die vermeintliche Datei (die Pipe) ausließt weiß es das Script und kann die neuesten Daten liefern. Ein löschen der Datei wird unnötig.
betterworld
 2008-08-21 00:08
#113785 #113785
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
dasa+2008-08-20 10:33:44--
Wie wärs wenn du mit Zeitstempel arbeitest, die Lösung in Pseudocode:

Script eins:

Holt Zeitstempel von xyz.txt
Wenn /tmp/<script1bezeichner><zeitstempelderdatei>.txt nicht vorhanden
Script eins kopiert xyz.txt nach /tmp/xyz<zeitstempelderdatei>.txt
führt txt aus
löscht alle alten /tmp/<script1bezeichner><altezeitstempel>.txt

Script zwei ähnlich, nur halt mit einem anderen Bezeichner.

Hm, das scheint mir nicht so ganz ausgereift zu sein, aber so aehnlich wuerde ich es auch machen:

1. Verschiebe Datei nach xyz.txt.tmp.$random
2. Fuehre die Datei aus
3. Loesche die Datei (also xyz.txt.tmp.$random)

Wenn man dagegen abgesichert sein will, dass das Script abstuerzt, und die Datei zwar schon umbenannt ist aber nicht bearbeitet, kann man vielleicht als 0. Schritt einführen:

0. Dateien *.tmp.*, welche eine atime von mehr als ein paar Minuten (je nach dem, wie lange das Script typischerweise läuft) haben, werden wieder so umbenannt, dass das .tmp.* nicht mehr am Ende ist.

Alles steht und fällt mit dem Atomarsein von rename(): Es darf nichts anderes passieren zwischen dem Prüfen auf Existenz der Datei und Umbenennen der Datei.

Bei Linux ist rename() afaik hinreichend atomar dafür. Ob das in WebDAV ausgenutzt werden kann, weiß ich nicht.

($random kann natürlich sinnvollerweise aus Zeitstempel und PID und Rechnername bestehen.)
Hagen
 2008-08-21 00:13
#113787 #113787
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Erster Ansatz wäre, in den Daten einen Zeitstempel einbauen und die Datei nie löschen oder zeitweise kürzen. So könnten/müssten die Zielsystem selber entscheiden, welche Daten neu sind.

Ein zweiter Ansatz wäre, pro Zielsystem einen eigenen Ordner/Datei mit den Daten anlegen. So hätte man das gegenseite Löschen-Problem umgangen.

Dritter Ansatz wäre, das Quell-System schreibt neue Daten in jeweils eine neue Datei und löscht diese in regelmäßigen Abständen. Die Zielsystem müssten dann selber entscheiden, welchen Dateien neu sind.

Vierter Ansatz wäre (ähnlich wie der von topeg), es wird ein Skript aufgerufen, welche die Daten übergibt. Als Parameter wird an das Skript eine ID des Zielsystems angegeben. An Hand der ID werden die entsprechenden Daten ausgegeben.

... oder die (neuen) Daten gleich per Email verschicken :-)
Gruß
Hagen
<< >> 10 Einträge, 1 Seite



View all threads created 2008-08-20 10:49.