On Tue, 01 Oct 2002 09:36:15 +0200, Jens Puruckherr wrote:
Szenario:
- A gibt Datei an Script
- Script prüft, ob Datei soweit korrekt ist und legt sie intern ab
- Script schreibt intern ein log - Datei von A liegt im internen
Puffer 4. Script gibt A sein OK und A ist aus dem Geschäft.
Mein Problem: jetzt geht nach Punkt 4 das Licht aus und die Datei /und oder das Log sind noch nicht auf der Festplatte gelandet, sonden schwirren noch irgendeinem Cache rum (Rechner stehen zwar im teuren Rechenzentrum - aber man weiss ja nie...) Das Script starten irgendwann wieder und findet entweder ein unvollständiges Log oder die Datei nicht an ihrem Platz. Somit kann diese nicht an B übertragen werden und A denkt aber, alles ist OK gelaufen.
Wenn A nur wissen muß, daß B die Daten irgendwann bekommen wird, ist dein Modell OK. Wenn aber A allerdings wissen muß, daß B die Daten bereits bekommen hat, mußt du das Modell ändern. DAnn kannst dein Skipt erst an A des OK geben, wenn du an B geliefert hast.
Wie realistisch ist das Szenario, und was kann man machen, um die Risiken zu minimeren. Kann ich explizit auf die Platte schreiben (Sync) und wirklich darauf vertrauen, dass die Daten weggeschreiben wurden???
Klar geht das. Du hast 3 Puffer beim Schreiben via File auf die Platte: 1. den in Perl und libc 2. den Plattencache des Kernels 3. den Schreibcache in der Festplatte
für 1. gibts in C fflush für 2. gibts in C fsync oder eine mit Option "sync" gemountete Platte (Ich bin nicht sicher, ob Linux sync-gemountete Platten wirklich) synchron bereibt.) für 3. gibt es "Abschalten des Schreibcaches der Festplatte"
Goggle nach "perl fsync" befragt bringt viele Beispiele. z.B. http://search-dev.cpan.org/author/CEVANS/File-Sync-0.09/Sync.pm
Wie machen das die teuren dicken TRX-Server?
Genauso, nur hier und da optimiert und auf verteilte Transaktionen erweitert. Wenn du nur zwei beteiligte Rechner hast, reichen einfache Bestätigungen vom Empfänger um die Daten auf Senderseite zu löschen. Bei Ausfall+Wiederanlauf mußt du nochmal rückfragen.
Reinhard