複数のサーバーを運用する場合、各マシンの時刻を同期させることは「重要」です。各サーバー間で時刻が一致していないと、運用ログを付き合わせたときに事象の順序などが把握できず不便です。Oracleを使ってクラスタシステムを構築する場合は、クラスタ内の各ノードの時刻合わせは「重要」ではなく、「必須」となります。

◆ サーバー時刻の合わせ方
 複数マシンの時刻合わせには、通常NTP(Network Time Protocol)デーモンを利用します。NTPデーモンは、ネットワーク内のタイムサーバーを参照し、自分のマシンの時刻をそれに合わせて修正します。同じタイムサーバーを参照するように設定すれば、すべてのノードが同一時刻になります。
マシン時刻の同期によりRACサーバーダウン!
 インターネット上で通信販売をしているあるオンライン会員システムでは、Oracle9i Database Real Application Clusters(以下、RAC)を使用しています。そのなかの懸賞プレゼント応募受付システムにおいて、各ノードの時刻が正確に一致していないと「締切時間間際に同時に2人が申し込んだ場合、片方が締切に間に合ったのにもう片方は締切に間に合わなかった」という事態が起こり得るため、ノード間の時刻を正確に同期させていました。このRACシステムで、システムが突然ダウンしてしまいました...。

◆ RACにおける時刻合わせの問題
 システムがダウンした直接の原因は、時刻を同期したときにあるノードの時刻が逆向してしまったためです。つまり、1時23分45秒だった時刻が1時23分44秒に逆向修正されたので、Oracleが矛盾を検知し異常終了したという、RAC構成特有の現象です(RAC構成でない場合は、時刻が逆向しても異常終了しません)。
 このトラブルを紐解いてみましょう。

◆ NTPによる時刻合わせの2つの方法
 NTPサーバーと時刻を合わせるために、NTPデーモンは「settimeofday」と「adjtimex」の2つのシステムコールを使用します。
(a) settimeofday
 指定された時刻に、直ちにマシン時刻を設定します。
 たとえば、NTPサーバーが12:00:00で、RAC上のあるノードが12:00:10の場合、NTPデーモンはそのノードを12:00:00に設定します。よって、今回の問題のように時刻が逆向する可能性があり、Oracleの異常終了につながります。

(b) adjtimex
 Linux固有のシステムコールで、ゆっくりと微調整しながらマシン時刻を合わせていきます。
 たとえば、NTPサーバーが12:00:00で、RAC上のあるノードが12:00:10の場合、NTPデーモンから依頼を受けたOS(Linux)が、時刻をゆっくり進め、数時間かけてNTPサーバーと時刻を一致させます。逆に、11:59:50のように時刻が遅れていた場合、OSは時刻の進み方を早めます。つまり、adjtimexを使う場合、時間が逆向することは絶対にありません。

 では、いつもadjtimexを使えばいいと思われるでしょうが、そう単純にはいきません。OSが時間を微調整するのには限界があります。NTPデーモンのマニュアルには「1秒のずれを2,000秒かけて補正する」とあるので、10秒ずれていた場合には補正に5時間半以上※1かかることになります。そのためNTPデーモンは、0.128秒以上ずれている場合はsettimeofdayを使用し(時刻が逆向する可能性あり)、0.128秒のしきい値よりずれが小さい場合はadjtimexを使用している(時刻は逆向しない)ことがわかりました。
 また、RACがダウンするのは時刻が0.5秒以上逆向した場合であることも判明しました。つまり、通常のNTPデーモンの運用方法では、RACが異常終了してしまう可能性大なのです。
※1 ミラクル・リナックス社の検証では、8〜10秒のずれであれば1時間で補正できることがわかっています。
 次のようにNTPデーモンを運用することで、今回の問題は解決されたのでした。
1) 各ノードのシステム起動時にntpdateコマンドを-bオプションで実行
 最初にsettimeofdayを使用してNTPサーバーの時刻に合わせます。
2) NTPデーモンを-xオプションで起動
 -xオプション※2は、時刻のずれ幅に拘わらずadjtimexを使って時刻を合わせます。これにより、各ノードでの時刻逆向はなくなります。
※2 Red Hat Advanced Server 2.1のNTPデーモンは、-xオプションが有効にならないという不具合がありますので、アップデートをしてください。
3) NTPデーモン起動後にOracleインスタンスを起動
 1)の処理の前にOracleを起動すると時刻が逆向する可能性があるので、この起動順序はかならず守ってください。
 以上の手順により、時刻が狂うことも、Oracleが異常終了することもありません。
 現在では、時刻が逆向してもOracleが異常終了しないような改良がRAC側に施されましたが、ミラクル・リナックスの調査・サポートにより、RACの修正を待たずして早急に問題解決できました。ミラクル・リナックスは、ミラクル・リナックス社製品のサポートとはもとより、Linux版Oracleに関するコンサルティング/サポートに関しては、他社のLinux製品の場合でも対応いたします。
 Oracle on Linuxでお困りの際は、ミラクル・リナックスにぜひご相談ください。
 
ミラクル・リナックス株式会社
製品本部 マーケティング部
03-5562-8300
03-5562-8306
http://www.miraclelinux.com/
mktg@miraclelinux.com

目次へ戻る→