【うるう秒】情報システムを止めないための対策まとめ
こんにちは。ソリューション開発部の飯出(いいで)です。
突然ですが、みなさんが扱うサーバーは大丈夫ですか?2017年01月01日、1年6ヶ月ぶりとなるうるう秒の挿入がやってきます。日本時間ですと、2017年1月1日 午前8時59分59秒 と 午前9時00分00秒 の間に通常は存在しない 8時59分60秒 が挿入されます。
次の年末年始は正月の微妙な時間に出社が要求されたり、自宅待機となる人とかも出てきそうですね…ということで、情報システム運用の猛者はさておき、今回初めてうるう秒を迎える情報システム担当者向けに、うるう秒対策について説明します。
うるう秒とは
うるう秒(leap second)とは、「地球の自転周期と原子時計の周期のずれを補正するために数年に一度、1秒を挿入して調整すること」です。ただ、うるう年とは全く関係のない事象なので混同しないように。詳しい内容については、Wikipedia とかを見てみると良いでしょう。
過去に発生したシステム障害
このうるう秒、挿入されたことによって大規模なシステム障害を起こしたことがありました。2012年7月1日のうるう秒ではLinuxカーネルにおけるスレッド関係の不具合によってサーバーが高負荷になったり異常な動作を引き起こしたりしました。また、世界中の様々なインターネットサービスでも障害が発生しました。そして2015年7月1日の調整では世界中の情報システム担当者が事前対策などを施したり、当該時間帯の待機を実施したりと騒ぎました。ちなみに、私もそのうちの1人でした。
対策の方針
さて、次のうるう秒を問題なく迎えるためにはどのような対策が考えられるのでしょうか?よく使われているであろう、Windows OS と Linux OS を例に紹介します。
Windows OS の場合
Windows OS では NTP による時刻同期がサポートされていますが、8時59分60秒(日本時間) は挿入されません。よって標準時から時刻がずれてしまいますが、1秒の誤差は、次回の NTP 参照時に解消される仕組みです。時刻のずれが許容できる情報システムである場合は、安全なOSと言えるでしょう。
Linux OS の場合
Linux OS の場合は確認ポイントがいくつかあります。
Linux カーネルのバージョンを確認
前述したとおり、Linux カーネルには不具合を持つバージョンがあります。不具合を持つバージョンで運用されている場合は、対策版へのアップデートが必要となります。過去の情報ですが、私がよく使っている RHEL/CentOS の情報を記載しておきます。(RHNアカウントが必要。)
ntpd の STEPモード と SLEWモード
ntpd を使って時刻同期をしている場合には STEPモード と SLEWモード という2種類の時刻同期モードがあります。デフォルト動作時において、時刻のずれが128ミリ秒よりも小さかった場合には SLEWモード で動作し、128ミリ秒以上ずれた状態が300秒以上続くと STEPモード に切り替わります。まずは2種類の時刻同期モードについて、簡単に説明しましょう。
- STEPモードによる時刻同期
- NTPサーバーから取得した時刻でシステム時刻を即変更するモードです。そのため、システム時刻が過去に戻る可能性があるのです。ntpd をデフォルト動作させた状態でうるう秒を迎えると、確実に128ミリ秒以上ずれた状態となってしまうのでSTEPモード動作となり、システム時刻をNTPサーバー時刻に合わせます。この場合において、NTPサーバー側はうるう秒で1秒挿入された状態となっているのでシステム時刻が過去に戻ることになります
- SLEWモードによる時刻同期
- NTPサーバーから取得した時刻でシステム時刻をじわじわと補正します。1秒間に最大0.5ミリ秒の時刻補正を行い、じわじわとNTPサーバー時刻に合わせます
- SLEWモードでは、時刻を進めながら(逆行したりせず)時刻の進む速さを早くしたり遅くしたりして調整します。うるう秒が挿入された状態だとNTPサーバーよりシステム時刻が進んでいる状態となるので、ゆっくりとシステム時刻を合わせることになります
- ntpd の -x オプションを使って起動すると、システム時刻とNTPサーバー時刻が600秒以上ずれるまでSLEWモードとして動作します。実質的には、ひたすらSLEWモードで動き続けている状態になります
- ntpd の -x オプションを使って起動しているとうるう秒を挿入しなくなります(後述する予告情報がセットされません)
- SLEWモードでも過去に不具合がありました。SLEWモードで動作しているときにうるう秒が発生した場合、システムクロックが誤って即座に変更されてしまう不具合です。使用しているアプリケーションによってはこの不具合によって、イベント発生順序が狂ってしまうことがあるかもしれません。ntpd 4.2.6 系のバージョンを用いている環境では、ntpd のバージョンアップが必要なことがあります
タイムゾーンの設定(tzdataのはなし)
tzdata はうるう秒だけではなく、サマータイムなどの世界各地の時刻に関するデータをまとめたものです。このパッケージを正しく更新してある場合は、うるう秒の挿入が行われます。逆に、パッケージの更新が行われていない環境では時刻が1秒ずれるので、手動で補正しなければなりません。
詳細には ntpd の使用状況とタイムゾーンの設定によって動作が異なります。以下、日本におけるその違いによる動作です。
- Asia/Tokyo タイムゾーンを使っている場合
- ntpd をデフォルト動作で使っている環境では、8時59分59秒(日本時間) を2周(8:59:59→8:59:59→9:00:00)します
- ntpd を使っていない環境では、システム時刻が1秒進んだ状態(8:59:59→9:00:00→9:00:01)となります
- right/Asia/Tokyo タイムゾーンを使っている場合
- ntpd を使っていない環境であり、かつパッケージの更新が行われている環境では 8時59分60秒(日本時間) という、うるう秒の時刻が取得(8:59:59→8:59:60→9:00:00)できます
上記の問題だけではありません
情報システムが採用しているミドルウェアやアプリケーションが正しくうるう秒を処理することができるか。が問題となります。うるう秒を実装されているプログラムが正しく処理できるか。ということです。時刻を取得している処理が、8時59分59秒を2周しても大丈夫か、8時59分60秒を取得しても大丈夫かどうか、確証を持たないといけません。
事前にできる対策を
今からLinux カーネルや ntpd のバージョンアップ、ミドルウェアやアプリケーションを修正にするには多大な労力を要してしまいます。このように、環境を更新できない場合はどうするべきでしょうか。その一部が更新可能である場合など、扱う情報システムによって状況は違うと思いますが、以下にうるう秒を挿入しない方法について説明します。
ntpd を使っている環境の場合
方法1. ntpd を -x オプションを付けて動かす
Linux カーネル、ntpd の更新が可能な環境で推奨します。うるう秒が挿入された直後、2017年1月1日 午前9時00分00秒(日本時間)の時点では最大1秒のずれが起きていますが、徐々に正しい時間へと調整されていきます。
方法2. ntpd を止めてうるう秒をやり過ごす
Linuxカーネル、または ntpd の更新ができない環境にて推奨します。上位NTPサーバーが予告情報(LIフラグ)を配信してくる前に ntpd を止めておく方法です。うるう秒をやり過ごしたら、ntpd を -x オプションを付けて起動します。(ntpd を起動するまでは、標準時から1秒ずれた状態になります。)
予告情報(LIフラグ)とは…
これからうるう秒を挿入します。という予告情報を定義する値です。これによって、NTPはうるう秒の調整があることを判断しています。最新のRFCでは1カ月前からフラグを立ててもよいことになっていますが、NICT(情報通信研究機構)では以前のRFCも考慮してうるう秒の24時間前からフラグを立てる運用になっています。フラグの値は、
- LI0(00): 時刻は通常通り。調整はありません
- LI1(01): 本日最後の分は、61秒間になる。23時59分60秒(UTC)が存在する
- LI2(11): 本日最後の分は、59秒間になる。23時59分59秒(UTC)が存在しない
です。
ntpd を使っていない環境の場合
ntpd を使っていない環境 = 時刻を重要視した情報システムではない と思われますが、8時59分60秒(日本時間) の挿入を許容できるか。という問題が残ります。そこで、tzdata のタイムゾーン設定を確認し Asia/Tokyo タイムゾーンに設定します。この設定なら、8時59分60秒(日本時間)が挿入されません。
おわりに…
皆さんの扱う情報システム、特に古い情報システムは大丈夫ですか?事前に対策をして、楽しい正月ライフを楽しみましょう!なお、本記事を書くにあたって、以下のサイトを参考にさせて頂きました。ありがとうございました。
【うるう秒】あなたのサーバは大丈夫? - 閏秒を迎えるにあたってLinuxでは何をすべきか?
- セイコーの「うるう秒」対策