システム開発時に複数のサーバ間の時刻を同期する必要があるが外部のNTPサーバに接続できない
閉鎖されたネットワーク上で複数のマシンの時刻を同期する環境構築方法を以下に記します。
後述にもありますが、時刻の正確さではなく複数サーバが同一の時刻になるようにする方法です。
NTPは現在の時刻を高精度で同期するためのプロトコルです。
NTPのシステムは階層構造を取り、上位の階層(stratumと呼びます)ほど標準時との同期において信頼性が高いと見なされます。
原子時計など厳密な時刻(協定標準時)を持つものをstratum 0とし、
それと直結したサーバをstratum 1とします。
stratum 1を参照するntpサーバをstratum 2、stratum 2を参照するntpサーバはstratum 3となります。
このようにNTPサーバは階層化されています。
インターネット上で公開されているNTPサーバとの同期設定を行うことで、
Linuxマシンの内部時計は必要十分な精度で協定標準時に同期することができるようになっています。
さて、インターネット上のNTPサーバと接続ができない閉鎖されたネットワークにおいてでも、
そのネットワーク内に存在する複数のマシンで時刻同期を取りたい場合があります。
例えば、複数マシンで分散して動作するプログラムの同期やログの管理のために、
マシン間で時刻が同期されていることが必要なケースなどがあるでしょう。
時刻がバラバラな状態での複数のマシンでのプログラムの連携動作は安全とはいえません。
この場合は時刻の正確さではなく、マシン間で時刻の同期が取れていることが必要となる要件です。
このようなケースにおいて、通常のLinuxマシンの内部時計(RTC: Real Time Clock)を
基準時刻としてNTPサーバを動作させることができます。
無論、標準時としての精度は甚だ低いものですが、
任意のマシンを基準としてマシン間で時刻同期を取ることが目的です。
基準時刻とするマシン(IPアドレスは192.168.2.1です)の
/etc/ntp.confに以下の記述を行い、これ以外のserverの設定は全てコメントアウトします。
127.127.1.0という特殊な表記は内部時計を参照することを意味しています。
server 127.127.1.0 fudge 127.127.1.0 stratum 0
このマシンでNTPの動作状況を確認します。root権限でntpq -pを実行します。
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *LOCAL(0) .LOCL. 0 l 2 64 1 0.000 0.000 0.004 #
自身をstratum 0として参照していることが判ります。
それ以外のマシンの/etc/ntp.confには以下の記述を行い、
これ以外のserverの設定は全てコメントアウトします。
server 192.168.2.1
192.168.2.1に同期するように設定したマシンで、同期の状況を確認します。
root権限でntpq -pを実行します。
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== 192.168.2.1 .LOCL. 1 u 1 64 1 5.794 -41910. 0.002 #
192.168.2.1を参照しています。
以上の手順で、これらのマシンの時刻は192.168.2.1のマシンのRTCと同期されました。
この手順によりインターネット上のNTPサーバと遮断されていても、
複数のマシンでの時刻同期が可能となり、
複数のマシンでのプログラムの連携動作等が安全になります。
以上、インターネット上のntpサーバと接続できない閉鎖されたネットワークで、
ネットワーク内のマシンの時刻同期を行う方法についてでした。