Ich habe Gerüchte gehört, dass auf Datenbank- und Mailservern schlimme Dinge passieren, wenn Sie die Systemzeit ändern, während sie ausgeführt werden. Es fällt mir jedoch schwer, konkrete Informationen zu den tatsächlichen Risiken zu finden.
Ich habe einen Postgres 9.3-Produktionsserver, der auf einem Debian Wheezy-Host ausgeführt wird, und die Zeit ist um 367 Sekunden verschoben. Kann ich ntpdate
openntp einfach ausführen oder starten, während Postgres ausgeführt wird, oder ist dies wahrscheinlich problematisch? Wenn ja, was ist eine sicherere Methode zur Zeitkorrektur?
Gibt es andere Dienste, die empfindlicher auf eine Änderung der Systemzeit reagieren? Möglicherweise Mailserver (exim, sendmail usw.) oder Nachrichtenwarteschlangen (activemq, rabbitmq, zeromq usw.)?
quelle
now()
. Können Sie Ihrer Antwort eine sichere Methode zum Ändern der Uhrzeit hinzufügen?Es ist normalerweise nicht der Datenbankserver, der für Fehler anfällig ist, wenn ein sofortiger Zeitsprung auftritt: Es sind die Anwendungen, die die aktuelle Zeit verwenden.
Es gibt im Allgemeinen zwei Möglichkeiten, die Zeit zu verfolgen: die eigene Zeit zu verfolgen oder die Systemzeit zu vergleichen. Beide haben einige positive und negative Kompromisse.
Eigene Zeiterfassung
Ich sehe dies in einigen eingebetteten Programmen und Systemen, in denen das genaue Timing nicht so wichtig ist. In einer Hauptanwendungsschleife wird eine Möglichkeit zum Verfolgen eines "Häkchens" besorgt. Dies kann ein Alarm sein, der vom Kernel, Sleep oder Select ausgegeben wird und einen Hinweis auf die verstrichene Zeit gibt. Wenn Sie wissen, welche Zeit vergangen ist, können Sie diese Zeit zu einem Zähler addieren oder von diesem abziehen. Dieser Zähler ist es, der Ihre Zeitsteuerungsanwendung ermöglicht. Wenn der Zähler beispielsweise länger als 10 Sekunden ist, können Sie etwas verwerfen, oder Sie müssen etwas tun.
Wenn die Anwendung die Zeit nicht verfolgt, ändert sich der Zähler nicht. Dies kann abhängig vom Design Ihrer Anwendung gewünscht sein. Zum Beispiel ist es mit einem Zähler einfacher zu verfolgen, wie lange ein Prozess dauert, der etwas erledigt, als mit einer Liste von Start- / Stopp-Zeitstempeln.
Profi:
Con:
Systemzeit vergleichen
Dies ist das am häufigsten verwendete System: Speichern Sie einen Zeitstempel und vergleichen Sie ihn mit dem Zeitstempel mithilfe eines Systemzeitaufrufs. Große Zeitverschiebungen in der Systemzeit können die Integrität Ihrer Anwendung gefährden. Je nach Richtung der Uhr kann eine Aufgabe von wenigen Sekunden Stunden dauern oder sofort enden.
Profi:
Con:
Betroffene Systeme
Die meisten Anwendungen verwenden einen Zeitstempel im Vergleich zu geplanten Aufgaben. Für Datenbanksysteme, bei denen es sich um Cache-Bereinigungen handeln könnte.
Alle Anwendungen, die eine Datenbank verwenden und Zeitfunktionen in der Abfragesprache verwenden, sind von Zeitversatz betroffen, wenn sie von der Anwendung nicht erkannt und entsprechend behandelt werden. Anwendungen könnten je nach Zweck niemals aufhören zu laufen oder unbestimmte Anmeldezeiträume zulassen.
Mail-Systeme verwenden Zeitstempel und / oder Zeitüberschreitungen, um veraltete oder nicht zugestellte Mails zu verarbeiten. Ein Zeitversatz könnte das beeinflussen, aber mit einer viel geringeren Auswirkung. Back-Off-Timer für das erneute Herstellen einer Verbindung zu Servern können versäumt werden, was zu Strafen für den Server führt, der die Verbindung herstellt.
Ich glaube nicht (habe nicht recherchiert), dass Kernel-Alarme beim Ändern der Systemzeit ausgelöst werden. Systeme, die diese verwenden, könnten sicher sein.
Lösungen
Zeit sanft verschieben. Dies finden Sie in der Dokumentation Ihrer bevorzugten Zeitlösung.
quelle