うるう秒がやって来る!〜 6 月 30 日の ” 1 秒”に備えよう〜
Posted:
2015年5月26日火曜日
* この投稿は、米国時間 5 月 21 日、Site Reliability Engineers の Noah Maxwell & Michael Rothwell によって投稿されたものの抄訳です。
1 秒だって暇はないというあなた。もうすぐ手に入ります。UTC で 2015 年 6 月 30 日の 23 時 59 分 60 秒ちょうどに、世界は 26 回目のうるう秒を迎えます。Google にとっては、今回のうるう秒は 3 回目です。Google Compute Engine をお使いの方は、うるう秒がどのような影響を及ぼすのかを知っておく必要があります。
うるう秒の時期に最悪とも言えるシステム構成は、ぼかし NTP サーバーと非ぼかしNTP サーバー(あるいは、ぼかし方の異なるサーバー)を混ぜて使うことです。どのような動作になるかはわかりませんが、おそらく困ったことになるでしょう。
Google Compute Engine と、うるう秒をぼかさない他のプロバイダーの両方を使用するのであれば、うるう秒の前後に時間の食い違いを起こす可能性があることを認識しておいてください。
Compute Engine インスタンスでの NTP の設定方法に関するドキュメントは、ここにあります。困ったときは Help & Support Center にお越しください。
1 秒だって暇はないというあなた。もうすぐ手に入ります。UTC で 2015 年 6 月 30 日の 23 時 59 分 60 秒ちょうどに、世界は 26 回目のうるう秒を迎えます。Google にとっては、今回のうるう秒は 3 回目です。Google Compute Engine をお使いの方は、うるう秒がどのような影響を及ぼすのかを知っておく必要があります。
うるう秒って何 ?
うるう秒は非常に小さなうるう年のようなものです。一般に、地球の回転は時間とともに遅くなり、1 日が長くなります。うるう年では 2 月に 1 日を追加して暦年を遅らせ太陽年に合わせますが、同様にうるう秒も、ときどき 1 秒を追加して協定世界時を太陽時に合わせます。ちなみに、UNIX 時間のうるう秒は 1 日の最後の秒を繰り返すという形で実現します。うるう秒はどうやって発生するの ?
一般に、うるう秒は 6 月の末か 12 月の末に発生します。しかし、うるう年とは異なり、うるう秒は一定間隔で発生するわけではありません。地球の回転速度は天候や地質学的な条件によって不規則に変化します。たとえば 2011 年の日本の地震により、地球の回転速度が上がって 1 日は 1.8 マイクロ秒短くなっています。Google はうるう秒にどう対処するの ?
2011 年 9 月のブログにもあるとおり、Google は巧妙な方法でうるう秒を処理します。1 秒を反復するのではなく、余分な 1 秒をわかりにくくして消してしまいます。うるう秒を中心として 20 時間のぼかし期間を設け、すべてのサーバーのシステム クロックを少しだけ遅らせるのです(おおよそ 100 万分の 14 ずつ)。ぼかし期間が終わると、ちょうど 1 秒分が追加され、常用時と同期した状態に戻ります(この方法は、2011 年のブログに記載したうるう秒処理よりも少し単純ですが、結果は同じです。時間の不連続は発生しません)。20 時間後には、うるう秒が完全に加えられ、ぼかしの入らない時間と同期するのです。なぜうるう秒をぼかすの ?
イベントを順序正しく並べていくことが必要なシステムは、秒が繰り返されると問題を起こすことがあります。この問題は、マルチノード分散システムでは特に悪化します。1 秒が 2 秒になると、複数のノード間における同期のずれが劇的に拡大してしまうのです。本来なら、片方のイベントがもう片方のイベントよりも先なのに、両方のイベントが同じタイムスタンプでデータベースに書き込まれたらどうなるか、想像してみてください(悪くすると、後のほうのイベントが早いタイムスタンプで書かれることもあります)。では、後で本当の順序を知るにはどうすればよいでしょうか。ほとんどのソフトウェアは、明示的にうるう秒を処理するようには書かれていません(Google の多くのソフトウェアもそうです)。Google は 2005 年のうるう秒のときに、社内システムでこの種のさまざまな問題が起きることに気づきました。そして、時間を参照するすべてのソフトウェアをうるう秒対応に書き換えるのを避けるため、一度にまとめて 1 秒を加えるのではなく、約 1 日をかけてうるう秒のごく一部ずつをサーバーのクロックに追加し、うるう秒が見えなくなるようにしたのです。Google Cloud Platform のどのサービスが影響を受けるの ?
Google Compute Engine 上で実行される仮想マシンだけはマニュアルで時間を同期できるため、時間のぼかしの影響を受けます。Google Cloud Platform のその他のサービスについては、Google が適切な処置を施すので影響はありません。どのような影響を受けるの ?
Google のすべての Compute Engine サービスは、ぼかしの入った時刻を自動的に受け取るため、デフォルトの NTP サービス( metadata.google.internal )かシステム クロックを使っていれば自動的に必要な操作が行われます(デフォルト NTP サービスは Leap Indicator ビットをセットしていないことに注意してください)。しかし、外部のタイム サービスを使っていると、まる 1 秒分のステップか、複数の小さなステップが加わります。Google では外部の NTP サービスがうるう秒をどのように処理するかはわからないので、時刻の同期がどのように行われるかを予測することはできません。Compute Engine 仮想マシンで外部 NTP サービスを使っている場合は、それらのタイム ソースがうるう秒をどのように処理し、それがあなたのアプリケーションやサービスにどのような影響を与えるかを理解することが必要です。可能なら、うるう秒の時期だけでも、Compute Engine で外部の NTP ソースを使うのは避けたほうが賢明です。うるう秒の時期に最悪とも言えるシステム構成は、ぼかし NTP サーバーと非ぼかしNTP サーバー(あるいは、ぼかし方の異なるサーバー)を混ぜて使うことです。どのような動作になるかはわかりませんが、おそらく困ったことになるでしょう。
Google Compute Engine と、うるう秒をぼかさない他のプロバイダーの両方を使用するのであれば、うるう秒の前後に時間の食い違いを起こす可能性があることを認識しておいてください。
Google の NTP サービスはどうなっているの ?
Google Compute Engine で実行されている仮想マシンから使用できる NTP サービスには metadata.google.internal があります。また、単純にシステム クロックを使う方法もあります。システム クロックはうるう秒のぼかし処理と自動的に同期します。Google はうるう秒をぼかし処理する外部 NTP サービスを提供していません。Compute Engine インスタンスでの NTP の設定方法に関するドキュメントは、ここにあります。困ったときは Help & Support Center にお越しください。
-Posted by Noah Maxwell & Michael Rothwell, Site Reliability Engineers