データベースサーバーでNTPを開始するリスクはありますか?


27

稼働中にシステム時間を変更すると、データベースとメールサーバーに悪いことが起こるという噂を聞いたことがあります。しかし、実際のリスクに関する具体的な情報を見つけるのに苦労しています。

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

システム時間の変更により敏感な他のサービスはありますか?たぶんメールサーバー(exim、sendmailなど)またはメッセージキュー(activemq、rabbitmq、zeromqなど)?

回答:


23

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

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

このオプションが利用可能になる前に私が使用した代替オプションは、1分ごとに1秒ごとに時計をリセットするループを作成することでした。リセットによって2番目の値が変更されないことを確認する場合、これはおそらく安全です。タイムスタンプを頻繁に使用する場合、シーケンスレコードが正しくない可能性があります。

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


8

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

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


私は進んでおり、約6分だけ後方にジャンプする必要があります。で設定された多くの内部レコードがありnow()ます。時間を変更する安全な方法を回答に追加できますか?
非常にスーペリアマン

6
ntpdが正しくインストールおよび設定されている場合、クロックを遅くすることでシステム時間を徐々に修正できるはずです。正しい時間が達成されると、ドリフトを調整して時間を維持します。エラーを超えて最大の修正を指定する必要がある場合があります。少なくともそれは私が理解する方法ですが、私はNTPの専門家ではありません。
ジョナサンJ

@JonathanJ-NTPには5分を超える時間のずれを修正するのが困難で、「標準」ドキュメント(複数のセットがあります)ごとにセットアップすると、最初に1回のジャンプで時間を同期し、ドリフトを調整して同期を維持します。
ジョン

@ジョン私は数年前にリスを使い果たしました;)
ジョフリー

4

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

通常、時間を追跡するには、独自の時間追跡とシステム時間の比較の2つの方法があります。両方とも、いくつかのプラスとマイナスのトレードオフがあります。

独自の時間追跡

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

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

プロ:

  • システムクロックに依存しない
  • 大きな時間のずれで壊れない
  • 高価なシステムコールなし
  • 小さなカウンタは、完全なタイムスタンプよりも少ないメモリで済みます

短所:

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

システム時間の比較

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

プロ:

  • 正確な時間比較
  • 再起動と長時間の停止を繰り返します

短所:

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

影響を受けるシステム

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

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

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

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

解決策

ゆっくり時間を移動します。これは、お気に入りの時間ソリューションのドキュメントに記載されています。


1
これは素晴らしい反応であり、時間管理についてもっと学ぶことができて感謝しています。運用データベースサーバーの時間を調整するという現在の懸念を明確に解決できないため、選択しませんでした。物事を教えてくれた+1。
広大なスーパーマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.