00.背景
最近作業しているときに、ntp時刻の同期に関連するいくつかの問題が発生しました。
- データベースの高可用性アーキテクチャに対するntpサービスの影響(高可用性アーキテクチャの障害)
- ntpとLinuxシステムのタイムゾーン、CPUティックの関係(時間関連プロセスの実行に影響します)
- ntpまたはシステムのタイムゾーンが調整された後、データベース内の既存のデータにどのような影響がありますか?
01. ntpサービスとは何ですか?
NTPは、ネットワーク時刻同期プロトコルであり、ネットワーク内の各コンピューターの時刻を同期するために使用されるプロトコルです。
通信原理:まず、ホストがNTPを起動します。クライアントは、時間調整メッセージをNTPサーバーに送信します。次に、NTPサーバーは現在の標準時刻をクライアントに送信します。クライアントがサーバーから時刻を受信すると、この情報に基づいて時刻を調整します。このようにして、ネットワーク時間同期が実現されます。
2つの特定の同期モードがあります
- サーバーの数は比較的少なく、タイムサーバーと直接同期できます
- 多くのローカルサーバーがあり、クラスター間の時刻同期のためにローカルに自己構築された時刻同期サーバーがあります
通常の操作
- コンピューターの時計の時刻を調整する(特定の時刻を変更する)代わりに、ntpdを使用して時計を調整します(時刻速度を変更します)。
- ntpdateを使用して、コンピューターが起動したばかりで、まだ多くのサービスが開始されていない時刻を同期できます。
- NTPDは、タイムサーバーとの同期中にBIOSタイマーの発振周波数偏差を記録します。このようにして、ネットワークに問題が発生した場合でも、マシンはかなり正確な移動時間を維持できます。
時刻同期のための2つのコマンド
-
ntpd:時間を調整し、少し時間を調整し、最後にゆっくりと時間を修正します。ntpdサービスは、時間を修正しながらCPUティックを修正できます。ティックはハードウェアクロックに属し、時間の速度を比較的変更できます。ntpdには自己保護設定があります。このマシンとソースの時間差が大きすぎると、ntpdは実行されません。
-
ntpdate:他のプログラムに問題があるかどうかを考慮せず、プログラムに影響を与える可能性のあるシステム時刻を同期的に直接調整します。
-
cpuティック:cpuと同様のリフレッシュレート。例:ゲームでは、ゲームの世界の変化は離散的です。つまり、コンピューターは固定された頻度で物事の変化を更新します。レートが遅すぎると、プレイヤーはすべてがジャンプしていると感じることができます。レートが速すぎると、当然スムーズになりますが、CPUを消費します。システム時間は、CPUのリフレッシュレートに関連しています。
02.ntp時刻同期
ntpdateコマンドを直接使用して、タイムサーバーと同期します(クライアントのntpdサービスを最初に閉じる必要があります)。
ntpdate -u x.x.x.x
ここでのxxxxは、パブリックネットワークタイムサーバーのIPアドレス、または自作のntpサーバーのアドレスにすることができます。
いくつかのパブリックネットワークタイムサーバー:Alibaba Cloudタイムサーバー。タイミング信号はGPSおよびBeidou衛星信号から取得され、時間を維持するために原子時計が装備されています。
http://time1.aliyun.com
http://time2.aliyun.com
http://time3.aliyun.com
http://time4.aliyun.com
http://time5.aliyun.com
http://time6.aliyun.com
http://time7.aliyun.com
独自のntpサーバーを構築することもできます(特定の構成は省略され、通常の使用法を直接紹介します)
# 安装
yum install ntp
# 开机自启动
chkconfig ntpd on
# 查看NTP是否正常运行
netstat -tlunp | grep ntp
# 配置防火墙过滤规则
/sbin/iptables -I INPUT -p udp --dport 123 -j ACCEPT
/ etc / sysconfig / ntpdファイルを構成します
- ntpサービスは、デフォルトでシステム時刻のみを同期します。ntpでハードウェア時刻を同時に同期する場合は、/ etc / sysconfig / ntpdファイルを設定できます。/etc/sysconfig/ntpdファイルにSYNC_HWCLOCK = yesを追加して、ハードウェア時刻をシステム時刻。
ntpdサービスを開始します
service ntpd start
NTPクライアントを構成します(その他の詳細は省略されています、ファイアウォールポリシーなど):
すべてのクライアントのvim / etc / ntp.confに、以下を追加します。
server x.x.x.x
xxxxは、上記で構成されたntpサーバーアドレスです。
注:サーバーとクライアント間の時間エラーが大きすぎる場合(1000秒の場合もあります)、時間の変更により、システムとアプリケーションに予測できない問題が発生する可能性があり、NTPは時間の同期を停止します。したがって、NTPの開始後に時刻が同期されない場合は、時差が原因である可能性があることを考慮する必要があります。この場合、時刻ntpdateを手動で同期する必要があります。
NTPサーバーと上位のNTPサーバーのステータスを表示する
ntpq -p
- リモート:ローカルマシンのIPまたはホスト名と上位のntp、「+」には候補となる接続があり、「*」は使用中です
- refid:より高いレベルのntpアドレス
- st:層レベル
- いつ:何秒前に時刻が同期されたか
- ポーリング:次の更新から何秒後
- リーチ:上位のntpサーバーが更新を要求した回数
- ディレイ:ネットワーク遅延
- オフセット:時間補償
- ジッター:システム時間とBIOS時間の違い
# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================================
* time4.aliyun.co 10.137.38.86 2 u 111 128 377 27.480 -5.995 1.852
手動で時間を1回同期します:/ usr / sbin / ntpdate 10.137.38.86(サーバーホストIP、ここではクライアントは最初にNTPサービスを閉じる必要があります)
NTPサービスを開始します。
service ntpd start
時間同期ステータスを観察します。
ntpq -p
同期結果のntpstatコマンドを確認します
# ntpstat
unsynchronised
polling server every 8 s
同期が失敗した場合、同期に時間がかかります。5〜10分待ってから再度クエリを実行します。
Every 2.0s: ntpstat Tue Jul 11 16:55:57 2017synchronised to NTP server (10.10.11.247) at stratum 12 time correct to within 605 ms polling server every 128 s
時刻の同期が完了しました。日付はサーバーのホスト時刻と一致していますか?!!
03.Linuxシステム時間
Linux時間は、システムクロック(システム時間)とリアルタイムクロック(ハードウェア時間、略してRTC)に分けられます。
- システム時間:現在のLinuxカーネルの時間を指します。
- ハードウェア時間:マザーボードにバッテリー電源が供給されている時間。
システム時刻を表示
date
ハードウェア時間を表示する
hwclock --show
或
clock --show
ハードウェア時間とシステム時間の同期。システムを再起動すると、ハードウェア時刻がシステム時刻の同期を読み取ります。システムが再起動されていない場合は、hwclockまたはclockコマンドを使用して同期を実行します。
硬件时钟与系统时钟同步:(hc代表硬件时间,sys代表系统时间)
# hwclock --hctosys
或者
# clock --hctosys
系统时钟和硬件时钟同步:
# hwclock --systohc
或者
# clock --systohc
tzselectコマンドを使用してタイムゾーンを設定します
04.システム時刻はデータベースにどのように影響しますか?
データベース時間フィールドストレージ
- データベースの「時間フィールド」の最下層は、実際にはタイムスタンプに変換され、ディスクに保存されます
- たとえば、現在のデータベースのタイムゾーンに基づいてタイムスタンプに変換されてディスクに保存される時間データフィールドを挿入します(タイムスタンプが直接の場合、変換は無視されます)。
- データベースは自動的に時間関数を生成し(現在はシステム)、現在のLinuxタイムスタンプも取得し、現在のデータベースのタイムゾーンを時間表示に変換して、対応するLinuxタイムスタンプを直接保存します。これらの関数の表示結果は、Linux時間と一致しない可能性があります(Linuxとデータベースのタイムゾーンが異なります)
データベースの時間フィールドの読み取り
- ディスク上のタイムスタンプを現在のデータベースのタイムゾーン時間に変換してから、クライアントに送信して表示します。
- データベース関連の時間関数は、Linuxのタイムスタンプを直接読み取ります
システムの時間またはタイムゾーンを変更する
-
データベースは、タイムゾーンに関連するパラメーターを設定することもできます。通常、これらのパラメーターは展開中に決定する必要があり、後で変更することはありません(時間表示で混乱が発生します)。
-
データベースのタイムゾーンは、通常、Linuxのタイムゾーンと一致しています。一貫性がない場合、同じタイムスタンプはデータベースに表示されているものとは異なります。
-
データベースのシステム時間はLinuxのシステム時間に依存します。現在のデータベースとシステムの一部の時間関数はLinuxのタイムスタンプを読み取ります。タイムゾーンに一貫性がない場合、Linuxとデータベース間で同じタイムスタンプの結果は異なります。
-
Linuxシステム時刻を変更すると、データベースシステム時刻に影響があり、現在とシステムに確実に影響します。ビジネスに固有の時刻要件がある場合は、間違いなくエラーが報告されます(時刻がで変更された場合)未来)。
-
ntpは、別のマシンの時刻を現在のサーバーに同期できます(時刻を将来に調整する場合は、問題ありません)。一部のプロセスまたはビジネスが時系列に依存している場合は、過去に時刻を調整します。エラーになります!!!
-
ntp時刻を同期するか、Linuxシステムのタイムゾーンを変更します。既存のデータには影響せず、保存されるデータのみに影響します。
概要:タイムゾーンの変更にはリスクが伴い、時系列に依存するビジネスがあるかどうかに応じて、時間の変更は将来的になります(たとえば、過去の時間の変更)。