Jens Puruckherr wrote:
Hallo,
wir wollen in Perl ein spezielles Kommunkationsscript bauen, welches Datenaustausch zwischen Systemen sicherstellen soll - und später noch mehr. Dabei wollen wir Wert aud Trx-Sichrheit legen - das ist das A und O. Szenario:
- A gibt Datei an Script
- Script prüft, ob Datei soweit korrekt ist und legt sie intern ab
Will heißen, schreibt auf Platte?
- Script schreibt intern ein log - Datei von A liegt im internen
Puffer
Welcher Puffer?
- Script gibt A sein OK und A ist aus dem Geschäft.
Davon kann man ausgehen.
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...)
Dann sollte es ein Problem des Filesystems sein. Wenn ext3 oder ein anderes 'journaled FS' im Einsatz ist, soll's dich nicht weiter kümmern.
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.
Da sicherlich auch der Cache FIFO ist wird trotzdem zuerst das File und dann das Log geschrieben. Es bleibt also nur noch der 2. Fall übrig.
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???
Dann kannst Du nur das Logfile umfangreicher machen, also vor dem Speichern der Datei einen Logfileeintrag 'begin trx', dann Datei schreiben und zum Schluß 'end trx'. Beim Start kannst dur das Logfile auf diese unvollständige TRX wiederfinden und den Zustand überprüfen. Entweder hast du die Chance es zu vollenden oder machst es rückgängig.
Wenn du nach jeder Aktion einen sync einlegst, kann garnix mehr schiefgehen.
Wie machen das die teuren dicken TRX-Server?
Keine Ahnung.
Ciao Rico