web-dev-qa-db-ja.com

起動のリスクNTPデータベースサーバー上?

データベースサーバーとメールサーバーの実行中にシステム時刻を変更すると、データベースサーバーやメールサーバーに悪影響を及ぼすという噂を耳にしました。しかし、実際のリスクに関する具体的な情報を見つけるのに苦労しています。

私は、Debian Wheezyホスト上で稼働している本番Postgres 9.3サーバーを使用しており、時間は367秒ずれています。 Postgresの実行中にntpdateを実行したり、openntpを起動したりできますか、それとも問題が発生する可能性がありますか?もしそうなら、時刻を修正するより安全な方法は何ですか?

システム時刻の変化に敏感な他のサービスはありますか?メールサーバー(exim、sendmailなど)またはメッセージキュー(activemq、rabbitmq、zeromqなど)でしょうか?

27

データベースは時間の逆ステップを好まないので、時間をジャンプするデフォルトの動作から始めたくありません。コマンドラインに-xオプションを追加すると、オフセットが600秒(10分)未満の場合、時間がスルーされます。最大スルーレートでは、時計を1分調整するのに約1日半かかります。これは時間がかかりますが、時間を調整するための安全な方法です。

ntpを実行して時間を調整する前に、ntp-g 2などのオプションで開始して、検出されているオフセットの大きさを確認することができます。これにより、パニックオフセットが2秒に設定されます。これは比較的安全なはずです。

このオプションが利用可能になる前に使用した代替オプションは、毎分程度の秒のクロックバックパーツをリセットするループを記述することでした。リセットしても2番目の設定が変更されないことを確認した場合、これはおそらく安全です。タイムスタンプを頻繁に使用すると、レコードの順序が乱れる可能性があります。

一般的なオプションは、時計の逆戻りがないように十分長い時間サーバーをシャットダウンすることです。 ntpまたはntpdateは、起動時にクロックを正しい時刻にジャンプするように構成できます。これは、データベースを起動する前に行う必要があります。

23
BillThor

データベースは、非常にアクティブで内部レコードにタイムスタンプがある場合、システム時刻の変更に対して特に脆弱になる可能性があります。一般的に、時間が遅れている場合、突然前方にジャンプした場合は、前方にいて突然後方にジャンプした場合よりも、問題がはるかに少なくなります。

Joffreyが指摘しているように、データベース自体よりも、突然のタイムジャンプに問題があるのは、多くの場合アプリケーションです。時刻を修正する最も安全な方法は、N + 1分間(Nはシステムクロックより進んでいる分数)アプリケーションをシャットダウンしてから、時刻を同期し、NTPを起動して、アプリケーションを再起動することです。アプリケーションでそれほど多くのダウンタイムをとることができない場合は、時間を同期する前にデータベースのバックアップを取り、それからコンピュータダムのゴダに死んだリスを提供して、トリガーを引くことをお勧めします。さて、私は少し面倒ですが、アプリケーションを停止する以外に「安全な」方法を考えることはできません。

8
John

通常、インスタントタイムリープが発生したときにエラーが発生するのはデータベースサーバーではなく、その時間を使用するアプリケーションです。

時間を追跡するには、通常、2つの方法があります。それは、独自の時間追跡またはシステム時間の比較です。どちらにもプラスとマイナスのトレードオフがあります。

自分の時間追跡

これは、正確なタイミングがそれほど重要でない一部の組み込みプログラミングやシステムで使用されているのがわかります。メインアプリケーションループでは、「ティック」を追跡する方法が処理されます。これは、カーネル、スリープ、または選択した経過時間を示すアラームによって与えられるアラームである可能性があります。何時が経過したかがわかったら、カウンターにこの時間を加算または減算できることがわかります。このカウンターは、タイミングアプリケーションを発生させるものです。たとえば、カウンターが10秒より高い場合、何かを破棄するか、何かをする必要があります。

アプリケーションが時間を追跡しない場合、カウンターは変更されません。これは、アプリケーションの設計によっては望ましい場合があります。たとえば、長時間実行されているプロセスが何かを処理している時間を追跡することは、開始/停止タイムスタンプのリストよりもカウンターを使用する方が簡単です。

プロ:

  • システムクロックに依存しない
  • 大きな時間のずれで壊れません
  • 費用のかかるシステムコールは不要
  • 小さなカウンターは、完全なタイムスタンプよりも少ないメモリのコストになります

短所:

  • 時間はあまり正確ではない
  • システム時刻の変更により、さらに不正確になる可能性があります
  • タイミングはアプリケーションの実行に関連しており、持続しません

システム時間の比較

これは、より頻繁に使用されるシステムです。タイムスタンプを保存し、システム時間呼び出しを使用してタイムスタンプと比較します。システム時刻の大きなずれは、アプリケーションの整合性を脅かす可能性があり、数秒のタスクは、時計の方向に応じて数時間かかるか、すぐに終了する可能性があります。

プロ:

  • 正確な時間比較
  • 再起動と長時間の停止が続く

短所:

  • システムコールを取得して、他のタイムスタンプと比較する新しいタイムスタンプを取得します
  • アプリケーションはスキューを認識する必要があるか、壊れる可能性があります

影響を受けるシステム

ほとんどのアプリケーションは、スケジュールされたタスクと比較してタイムスタンプを使用します。キャッシュのクリーンアップになる可能性のあるデータベースシステムの場合。

クエリ言語でデータベースと呼び出し時間関数を使用するすべてのアプリケーションは、アプリケーションが適切に検出および処理しない場合、スキューの影響を受けます。アプリケーションは、その目的に応じて、実行を停止したり、無期限のログイン期間を許可したりすることはできません。

メールシステムは、古くなったメールや未配信のメールを処理するためにタイムスタンプやタイムアウトを使用します。クロックスキューはそれに影響を与える可能性がありますが、影響ははるかに小さくなります。サーバーへの再接続に関するバックオフタイマーを逃すと、接続しているサーバーでペナルティが発生する可能性があります。

システム時刻を変更したときにカーネルアラームが鳴るとは思いません(調査していません)。これらを使用するシステムは安全かもしれません。

ソリューション

時間をやさしく動かします。これは、お気に入りの時間ソリューションのドキュメントにあります。

4
Joffrey