Linuxの時間同期:なぜChronyがNTPに代わる現代の標準なのか

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

ログファイルの中の「幽霊」を追う

ログの中の「幽霊」を追いかけることほど、フラストレーションの溜まることはありません。3ノード構成のクラスターでデータベースエラーをデバッグしている場面を想像してみてください。サーバーAを確認し、一致するイベントを探すためにサーバーBに移動します。驚いたことに、サーバーBのログでは、そのイベントがサーバーAで始まる2秒に発生したことになっています。このような不整合は、トランザクションやセキュリティイベントの追跡を悪夢に変えてしまいます。

最近、わずか500ミリ秒の時刻のズレが原因で発生した本番環境の障害に対応しました。この小さな差により、認証サーバーがアプリケーションサーバーよりもわずかに進んでいたため、JSON Web Token (JWT) が予定より早く期限切れになってしまったのです。こうした「タイムトラベル」バグは分散システムでは一般的です。これらはデータの破損、バックアップの失敗、認証プロトコルの不備を引き起こします。

Linuxの時計が狂う理由

ズレを直す前に、サーバーが管理する2つの時計を区別する必要があります。

  • ハードウェアクロック (RTC): マザーボード上のバッテリーバックアップ付きの時計です。電源がオフの状態でも時間を刻み続けます。
  • システムクロック: Linuxカーネルによって管理されます。アプリケーション、ログ、cronジョブで使用されるタイムスタンプを提供します。

ハードウェアは完璧ではありません。ほとんどのマザーボードに使用されている水晶発振器は、温度や経年変化に敏感です。一般的なサーバーは、外部同期がない場合、月に10〜20秒ほどズレることがあります。仮想化はこの問題を悪化させます。AWSやGCPの環境ではCPUが共有されています。システムクロックが依存する「ティック(刻み)」が遅延したり消失したりすることがあり、急速なズレを引き起こします。

標準的な Network Time Protocol (NTP) は数十年前に設計されたものですが、現代の課題には苦戦しています。断続的なネットワーク接続や、スリープモードに入るシステムへの対応に失敗することがよくあります。Chronyは、これらの特定の問題を解決するために構築されました。

NTP vs. Chrony:なぜChronyが選ばれるのか

NTPはプロトコルですが、それを実装するソフトウェアは変化してきました。長年、ntpdがデフォルトの選択肢でした。しかし、Ubuntu、RHEL、Fedoraなどの現代的なディストリビューションは、chronyd (Chrony) に移行しました。この切り替えが重要な理由は以下の通りです:

  • 迅速な同期: Chronyは数分ではなく数秒で時刻を同期します。これは、頻繁に起動と停止を繰り返すクラウドインスタンスにとって救世主となります。
  • ドリフト補正: Chronyは時計が進む、あるいは遅れる正確な速度を計算します。ネットワークがダウンしても、時計の補正を継続します。
  • 仮想化への対応: 仮想化されたハードウェア特有の「ジッター」を, 古いNTPデーモンよりもはるかにスムーズに処理します。

私の本番環境のUbuntu 22.04ノードでは、Chronyに切り替えたことで、以前は機密性の高いバックグラウンドタスクをクラッシュさせていた「ステップ状(不連続)」な時刻のジャンプがなくなりました。現在、システムは時計の速度をわずかに早めたり遅くしたりすることで、時刻を滑らかに調整しています。

実践的なセットアップ:Chronyの導入

Chronyはすでにお使いのパッケージマネージャーに含まれているはずです。正しく動作させるために、以下の手順に従ってください。

1. パッケージのインストール

競合を避けるため、まずレガシーなNTPサービスを削除します。その後、Chronyをインストールします。

# Ubuntu/Debianの場合
sudo apt update && sudo apt install chrony -y

# RHEL/CentOS/AlmaLinuxの場合
sudo dnf install chrony -y

2. 信頼できる上位サーバーの設定

設定ファイルは /etc/chrony/chrony.conf (Ubuntu) または /etc/chrony.conf (RHEL) にあります。エディタで開いてください:

sudo nano /etc/chrony/chrony.conf

pool で始まる行を探します。最良の結果を得るには、データセンターから地理的に近いサーバーを使用してください。サーバーが北米にある場合は、以下を使用します:

# pool.ntp.orgプロジェクトの公開サーバーを使用する
pool 0.north-america.pool.ntp.org iburst
pool 1.north-america.pool.ntp.org iburst
pool 2.north-america.pool.ntp.org iburst

iburst ディレクティブは非常に重要です。これは起動時にChronyがリクエストをバースト送信するように指示し、数秒以内に正しい時刻を見つけられるようにします。

3. サービスの再起動

sudo systemctl enable --now chrony
sudo systemctl restart chrony

同期状態の確認

動いていると思い込まないでください。Chronyには、同期状態を確認するための chronyc という便利なコマンドラインユーティリティが付属しています。

タイムソースの確認

このコマンドで上位サーバーへの接続を確認します:

chronyc sources -v

^* 記号を探してください。これは、Chronyがそのサーバーをプライマリソースとして選択したことを意味します。^? が表示される場合は、サーバーに到達できません。^x は「falseticker(嘘つき)」を意味し、時刻が乖離しすぎていて信頼できないサーバーであることを示します。

時計のズレを監視する

ローカルの時計がどの程度正確に動作しているかを確認するには、トラッキングデータをチェックします:

chronyc tracking

RMS offset に注目してください。この値は、システムと実際の時刻との間の長期的な平均的な差を表します。正常なセットアップでは、この値はマイクロ秒または低いミリ秒の範囲内にあるはずです。

クラウド環境での特例:AWSとGCP

クラウドプロバイダーは、独自の高精度なタイムソースを提供していることがよくあります。例えば、AWSは 169.254.169.123 で Amazon Time Sync Service を提供しています。この内部IPは非常に低レイテンシで、通常1ミリ秒未満です。EC2を使用している場合は、設定の先頭に次の行を追加してください:

# 1ミリ秒未満の精度を実現するために、ローカルのAWSタイムソースを使用する
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

まとめ

時刻同期は、単にタスクバーの時計を正しく保つことだけではありません。セキュリティ、ログ記録、データベースの整合性を保つための根本的な requirement です。Chronyに移行し、オフセットを監視することで、時刻のズレによる目に見えにくい、しかし深刻なダメージからインフラを守ることができます。今すぐ chronyc tracking を実行してみてください。あなたのログが感謝することでしょう。

Share: