MySQL服務器時間同步問題

1,調整數據庫服務器時間

因為應用app搖一搖活動發現過時15分鐘,還可以繼續搖一搖,問題根源在于數據庫服務器時間比應用服務器時間蠻了18分鐘,而app取得是數據庫的now(),所以才導致的。2個解決辦法,1是修改程序代碼,不通過數據庫now()去取而是通過應用服務器取;2是直接修改數據庫的時間。經過權衡之后采納第二種方案。

1.1,通過date -s修改時間

 修改linux服務器時間  date -s 2015-08-03  修改時間:  date -s 10:18:00

1.2,使用ntpdate調整手動調整時間

安裝ntpdate      yum install -y ntpdate  手動調整時間(需要ntpdate)      ntpdate us.pool.ntp.org

執行過程: ?

[root@testmysqldb?~]#?ntpdate?us.pool.ntp.org25?Sep?22:33:44?ntpdate[11419]:?the?NTP?socket?is?in?use,?exiting  [root@testmysqldb?~]#??[root@testmysqldb?~]#?service?ntpd?stop關閉?ntpd:????????????????????????????????????????????????[確定]  [root@testmysqldb?~]#?/usr/sbin/ntpdate?10.254.1.21;/sbin/clock?--systohc25?Sep?22:48:12?ntpdate[11445]:?step?time?server?10.254.1.21?offset?814.746911?sec  [root@testmysqldb?~]#

1.3,寫一個自動同步時間的腳本,加入定時計劃任務,每天同步一次

vim /etc/cron.daily/ntpdate   #! /bin/bash  /usr/sbin/ntpdate -s us.pool.ntp.org  /usr/sbin/hwclock --systohc    4,授予權限  # chmod +x /etc/cron.daily/ntpdate    加入crontab任務,每20分鐘同步一次  [root@testmysqldb ~]# crontab -l  */20 * * * * sh /etc/cron.daily/ntpdate    [root@testmysqldb ~]#

原blog地址為:http://www.php.cn/,未經原作者mchdba允許,謝絕轉載

2,Linux時間設置與同步

2.1 關于時間和時區

如果有人問你說現在幾點? 你看了看表回答他說晚上8點了. 這樣回答看上去沒有什么問題,但是如果問你的這個人在歐洲的話那么你的回答就會讓他很疑惑,因為他那里還太陽當空呢
這里就有產生了一個如何定義時間的問題. 因為在地球環繞太陽旋轉的24個小時中,世界各地日出日落的時間是不一樣的.所以我們才有劃分時區(timezone) 的必要,也就是把全球劃分成24個不同的時區. 所以我們可以把時間的定義理解為一個時間的值加上所在地的時區(注意這個所在地可以精確到城市)
地理課上我們都學過格林威治時間(GMT), 它也就是0時區時間. 但是我們在計算機中經常看到的是UTC. 它是Coordinated Universal Time的簡寫. 雖然可以認為UTC和GMT的值相等(誤差相當之小),但是UTC已經被認定為是國際標準,所以我們都應該遵守標準只使用UTC
那么假如現在中國當地的時間是晚上8點的話,我們可以有下面兩種表示方式
20:00 CST ?
12:00 UTC
這里的CST是Chinese Standard Time,也就是我們通常所說的北京時間了. 因為中國處在UTC+8時區,依次類推那么也就是12:00 UTC了.
第一,不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪里).所以當我們設置系統時間的時候,設置好時區是首先要做的工作
第二,很多國家都有夏令時(中國2010年的時候設置過一次),那就是在一年當中的某一天時鐘撥快一小時(比如從UTC+8一下變成UTC+9了),那么同理到時候還要再撥慢回來.如果我們設置了正確的時區,當需要改變時間的時候系統就會自動替我們調整
現在我們就來看一下如何在Linux下設置時區,也就是time zone

2.2 設置Linux Time Zone

在Linux下glibc提供了事先編譯好的許多timezone文件, 他們就放在/usr/share/zoneinfo這個目錄下,這里基本涵蓋了大部分的國家和城市

[root@wgq_idc_mon_1_12?~]#?ls?-F?/usr/share/zoneinfo/Africa/??????Asia/???????Canada/??Cuba???EST??????GB???????GMT-0??????HST??????iso3166.tab??Kwajalein??Mideast/??NZ????????Portugal????PST8PDT??Singapore??US/???zone.tabAmerica/?????Atlantic/???CET??????EET????EST5EDT??GB-Eire??GMT+0??????Iceland??Israel???????Libya??????MST???????NZ-CHAT???posix/??????right/???Turkey?????UTC???ZuluAntarctica/??Australia/??Chile/???Egypt??Etc/?????GMT??????Greenwich??Indian/??Jamaica??????MET????????MST7MDT???Pacific/??posixrules??ROC??????UCT????????WETArctic/??????Brazil/?????CST6CDT??Eire???Europe/??GMT0?????Hongkong???Iran?????Japan????????Mexico/????Navajo????Poland????PRC?????????ROK??????Universal??W-SU[root@wgq_idc_mon_1_12?~]#?[root@wgq_idc_mon_1_12?~]#?ll?/usr/share/zoneinfo/Asia/Shanghai-rw-r--r--.?2?root?root?405?1月??23?2013?/usr/share/zoneinfo/Asia/Shanghai[root@wgq_idc_mon_1_12?~]#?cp?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtimecp:是否覆蓋"/etc/localtime"??y  [root@wgq_idc_mon_1_12?~]#?date2015年?09月?26日?星期六?12:12:20?CST[root@wgq_idc_mon_1_12?~]#

去目錄:/usr/share/zoneinfo/Asia/,看到有許多城市地區的名字,找到上海的為Shanghai,然后可以用zdump來check下,時間正常,如下所示:

[root@wgq_idc_mon_1_12?~]#?zdump?/usr/share/zoneinfo/Asia/Shanghai/usr/share/zoneinfo/Asia/Shanghai??Sat?Sep?26?13:11:23?2015?CST[root@wgq_idc_mon_1_12?~]#

那么我們又怎么來告訴系統我們所在time zone是哪個呢? 方法有很多,這里舉出兩種
第一個就是修改/etc/localtime這個文件,這個文件定義了我么所在的local time zone.

[root@wgq_idc_mon_1_12?~]#?cp?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtimecp:是否覆蓋"/etc/localtime"??y  [root@wgq_idc_mon_1_12?~]#?date2015年?09月?26日?星期六?13:19:00?CST[root@wgq_idc_mon_1_12?~]#

第二種方法也就設置TZ環境變量的值. 許多程序和命令都會用到這個變量的值. TZ的值可以有多種格式,最簡單的設置方法就是使用tzselect命令,如下所示:

[root@wgq_idc_mon_1_12?~]#?tzselectPlease?identify?a?location?so?that?time?zone?rules?can?be?set?correctly.  Please?select?a?continent?or?ocean.?1)?Africa?2)?Americas?3)?Antarctica?4)?Arctic?Ocean?5)?Asia?6)?Atlantic?Ocean?7)?Australia?8)?Europe?9)?Indian?Ocean10)?Pacific?Ocean11)?none?-?I?want?to?specify?the?time?zone?using?the?Posix?TZ?format.#??5Please?select?a?country.?1)?Afghanistan???????18)?Israel????????????35)?Palestine?2)?Armenia???????19)?Japan?????????36)?Philippines?3)?Azerbaijan????????20)?Jordan????????????37)?Qatar?4)?Bahrain???????21)?Kazakhstan????????38)?Russia?5)?Bangladesh????????22)?Korea?(North)?????39)?Saudi?Arabia?6)?Bhutan????????23)?Korea?(South)?????40)?Singapore?7)?Brunei????????24)?Kuwait????????????41)?Sri?Lanka?8)?Cambodia??????????25)?Kyrgyzstan????????42)?Syria?9)?China?????????26)?Laos??????????43)?Taiwan10)?Cyprus????????27)?Lebanon???????????44)?Tajikistan11)?East?Timor????????28)?Macau?????????45)?Thailand12)?Georgia???????29)?Malaysia??????????46)?Turkmenistan13)?Hong?Kong?????????30)?Mongolia??????????47)?United?Arab?Emirates14)?India?????????31)?Myanmar?(Burma)???????48)?Uzbekistan15)?Indonesia?????????32)?Nepal?????????49)?Vietnam16)?Iran??????????33)?Oman??????????50)?Yemen17)?Iraq??????????34)?Pakistan#??9Please?select?one?of?the?following?time?zone?regions.1)?east?China?-?Beijing,?Guangdong,?Shanghai,?etc.2)?Heilongjiang?(except?Mohe),?Jilin3)?central?China?-?Sichuan,?Yunnan,?Guangxi,?Shaanxi,?Guizhou,?etc.4)?most?of?Tibet?&?Xinjiang5)?west?Tibet?&?Xinjiang#??1The?following?information?has?been?given:    ????China  ????east?China?-?Beijing,?Guangdong,?Shanghai,?etc.    Therefore?TZ='Asia/Shanghai'?will?be?used.  Local?time?is?now:??Sat?Sep?26?13:21:14?CST?2015.Universal?Time?is?now:??Sat?Sep?26?05:21:14?UTC?2015.Is?the?above?information?OK?1)?Yes2)?No#??yesPlease?enter?1?for?Yes,?or?2?for?No.#??1You?can?make?this?change?permanent?for?yourself?by?appending?the?line  ????TZ='Asia/Shanghai';?export?TZto?the?file?'.profile'?in?your?home?directory;?then?log?out?and?log?in?again.    Here?is?that?TZ?value?again,?this?time?on?standard?output?so?that?you  can?use?the?/usr/bin/tzselect?command?in?shell?scripts:  Asia/Shanghai  [root@wgq_idc_mon_1_12?~]#?[root@wgq_idc_mon_1_12?~]#?more?/etc/localtime?TZif2  CST-8[root@wgq_idc_mon_1_12?~]#

TZ變量的值會override /etc/localtime. 也就是說當TZ變量沒有定義的時候系統才使用/etc/localtime來確定time zone. 所以你想永久修改time zone的話那么可以把TZ變量的設置寫入/etc/profile里

2.3 Read Time Clock(RTC) and System Clock

說道設置時間這里還要明確另外一個概念就是在一臺計算機上我們有兩個時鐘:一個稱之為硬件時間時鐘(RTC),還有一個稱之為系統時鐘(System Clock);
硬件時鐘是指嵌在主板上的特殊的電路, 它的存在就是平時我們關機之后還可以計算時間的原因;
系統時鐘就是操作系統的kernel所用來計算時間的時鐘. 它從1970年1月1日00:00:00 UTC時間到目前為止秒數總和的值; 在Linux下系統時間在開機的時候會和硬件時間同步(synchronization),之后也就各自獨立運行了 ;
那么既然兩個時鐘獨自運行,那么時間久了必然就會產生誤差了,下面我們來看一個例子;

通過hwclock –help命令查看hwclock的各種用途:
[root@wgq_idc_mon_1_12 ~]# hwclock –show
2015年09月26日 星期六 13時58分34秒 ?-0.219418 seconds
[root@wgq_idc_mon_1_12 ~]#

hwclock –hctosys ?把硬件時間設置成系統時間

hwclock –systohc ?把系統時間設置成硬件時間

hwclock –set –date=”mm/dd/yy hh:mm:ss” ? 設置硬件時間我們可以開機的時候在BIOS里設定.也可以用hwclock命令

date -s “dd/mm/yyyy hh:mm:ss” 修改系統時間用date命令就最簡單了

現在我們知道了如何設置系統和硬件的時間. 但問題是如果這兩個時間都不準確了怎么辦? 那么我們就需要在互聯網上找到一個可以提供我們準確時間的服務器然后通過一種協議來同步我們的系統時間,那么這個協議就是NTP了. 接下去我們所要說的同步就都是指系統時間和網絡服務器之間的同步了

2.4 設置NTP Server前的準備

其實這個標題應該改為設置”NTP Relay Server”前的準備更加合適. 因為不論我們的計算機配置多好運行時間久了都會產生誤差,所以不足以給互聯網上的其他服務器做NTP Server. 真正能夠精確地測算時間的還是原子鐘. 但由于原子鐘十分的昂貴,只有少部分組織擁有, 他們連接到計算機之后就成了一臺真正的NTP Server. 而我們所要做的就是連接到這些服務器上同步我們系統的時間,然后把我們自己的服務器做成NTP Relay Server再給互聯網或者是局域網內的用戶提供同步服務.

1). 架設一個NTP Relay Server其實非常簡單,我們先把需要的RPM包裝上

rpm -ivh ntp-4.2.2p1-5.el5.rpm

2).找到在互聯網上給我們提供同步服務的NTP Server ,http://www.php.cn/是NTP的官方網站,在這上面我們可以找到離我們城市最近的NTP Server. NTP建議我們為了保障時間的準確性,最少找兩個個NTP Server
那么比如在英國的話就可以選擇下面兩個服務器
0.uk.pool.ntp.org
1.uk.pool.ntp.org
它的一般格式都是number.country.pool.ntp.org

中國的ntp服務器地址:

server 133.100.11.8 prefer
server 210.72.145.44
server 203.117.180.36
server 131.107.1.10
server time.asia.apple.com
server 64.236.96.53
server 130.149.17.21
server 66.92.68.246
server www.freebsd.org
server 18.145.0.30
server clock.via.net
server 137.92.140.80
server 133.100.9.2
server 128.118.46.3
server ntp.nasa.gov
server 129.7.1.66
server ntp-sop.inria.fr

server (國家授時中心服務器IP地址)

3).在打開NTP服務器之前先和這些服務器做一個同步,使得我們機器的時間盡量接近標準時間. 這里我們可以用ntpdate命令

ntpdate 0.uk.pool.ntp.org  ntpdate 0.pool.ntp.org

假如你的時間差的很離譜的話第一次會看到調整的幅度比較大,所以保險起見可以運行兩次. 那么為什么在打開NTP服務之前先要手動運行同步呢?
1. 因為根據NTP的設置,如果你的系統時間比正確時間要快的話那么NTP是不會幫你調整的,所以要么你把時間設置回去,要么先做一個手動同步
2. 當你的時間設置和NTP服務器的時間相差很大的時候,NTP會花上較長一段時間進行調整.所以手動同步可以減少這段時間

2.5 配置和運行NTP Server
現在我們就來創建NTP的配置文件了, 它就是/etc/ntp.conf. 我們只需要加入上面的NTP Server和一個driftfile就可以了

?vi?/etc/ntp.confserver?0.uk.pool.ntp.orgserver?1.uk.pool.ntp.orgdriftfile?/var/lib/ntp/ntp.drift

非常的簡單. 接下來我們就啟動NTP Server,并且設置其在開機后自動運行

/etc/init.d/ntpd start   chkconfig --level 35 ntpd on

2.6 查看NTP服務的運行狀況 ?
現在我們已經啟動了NTP的服務,但是我們的系統時間到底和服務器同步了沒有呢? 為此NTP提供了一個很好的查看工具: ntpq (NTP query)
我建議大家在打開NTP服務器后就可以運行ntpq命令來監測服務器的運行.這里我們可以使用watch命令來查看一段時間內服務器各項數值的變化

watch?ntpq?-p  Every?2.0s:?ntpq?-p??????????????????????????????????Sat?Jul?7?00:41:45?2007?????remote???????????refid??????st?t?when?poll?reach???delay???offset?jitter  ==============================================================================+193.60.199.75???193.62.22.98?????2?u???52???64?377????8.578???10.203?289.032*mozart.musicbox?192.5.41.41??????2?u???54???64?377???19.301?-60.218?292.411

現在我就來解釋一下其中的含義:
remote: 它指的就是本地機器所連接的遠程NTP服務器
refid: 它指的是給遠程服務器(e.g. 193.60.199.75)提供時間同步的服務器
st: 遠程服務器的級別. 由于NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端. 所以服務器從高到低級別可以設定為1-16. 為了減緩負荷和網絡堵塞,原則上應該避免直接連接到級別為1的服務器的.
t: 這個…..我也不知道啥意思^_^
when: 我個人把它理解為一個計時器用來告訴我們還有多久本地機器就需要和遠程服務器進行一次時間同步
poll: 本地機和遠程服務器多少時間進行一次同步(單位為秒). 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增加了,可以盡快調整到正確的時間范圍.之后poll值會逐漸增大,同步的頻率也就會相應減小
reach: 這是一個八進制值,用來測試能否和服務器連接.每成功連接一次它的值就會增加
delay: 從本地機發送同步要求到服務器的round trip time
offset: 這是個最關鍵的值, 它告訴了我們本地機和服務器之間的時間差別. offset越接近于0,我們就和服務器的時間越接近
jitter: 這是一個用來做統計的值. 它統計了在特定個連續的連接數里offset的分布情況. 簡單地說這個數值的絕對值越小我們和服務器的時間就越精確
那么大家細心的話就會發現兩個問題: 第一我們連接的是0.uk.pool.ntp.org為什么和remote server不一樣? 第二那個最前面的+和*都是什么意思呢?
第一個問題不難理解,因為NTP提供給我們的是一個cluster server所以每次連接的得到的服務器都有可能是不一樣.同樣這也告訴我們了在指定NTP Server的時候應該使用hostname而不是IP
第二個問題和第一個相關,既然有這么多的服務器就是為了在發生問題的時候其他的服務器還可以正常地給我們提供服務.那么如何知道這些服務器的狀態呢? 這就是第一個記號會告訴我們的信息
* ?:它告訴我們遠端的服務器已經被確認為我們的主NTP Server,我們系統的時間將由這臺機器所提供
+ :它將作為輔助的NTP Server和帶有號的服務器一起為我們提供同步服務. 當號服務器不可用時它就可以接管
– :遠程服務器被clustering algorithm認為是不合格的NTP Server
x :遠程服務器不可用
了解這些之后我們就可以實時監測我們系統的時間同步狀況了

2.7. NTP安全設置

運行一個NTP Server不需要占用很多的系統資源,所以也不用專門配置獨立的服務器,就可以給許多client提供時間同步服務, 但是一些基本的安全設置還是很有必要的
那么這里一個很簡單的思路就是第一我們只允許局域網內一部分的用戶連接到我們的服務器. 第二個就是這些client不能修改我們服務器上的時間
在/etc/ntp.conf文件中我們可以用restrict關鍵字來配置上面的要求
首先我們對于默認的client拒絕所有的操作

然后允許本機地址一切的操作:

restrict?default?kod?nomodify?notrap?nopeer?noquery

最后我們允許局域網內所有client連接到這臺服務器同步時間.但是拒絕讓他們修改服務器上的時間:

restrict?127.0.0.1

把這三條加入到/etc/ntp.conf中就完成了我們的簡單配置. NTP還可以用key來做authenticaiton,這里就不詳細介紹了

restrict?192.168.1.0?mask?255.255.255.0?nomodify

2.8. NTP client的設置

做到這里我們已經有了一臺自己的Relay Server.如果我們想讓局域網內的其他client都進行時間同步的話那么我們就都應該照樣再搭建一臺Relay Server,然后把所有的client都指向這兩臺服務器(注意不要把所有的client都指向Internet上的服務器). 只要在client的ntp.conf加上這你自己的服務器就可以了

代碼:

server?ntp1.leonard.comserver?ntp2.leonard.com

2.9. 一些補充和拾遺

  1. 配置文件中的driftfile是什么?
    我們每一個system clock的頻率都有小小的誤差,這個就是為什么機器運行一段時間后會不精確. NTP會自動來監測我們時鐘的誤差值并予以調整.但問題是這是一個冗長的過程,所以它會把記錄下來的誤差先寫入driftfile.這樣即使你重新開機以后之前的計算結果也就不會丟失了

  2. 如何同步硬件時鐘?
    NTP一般只會同步system clock. 但是如果我們也要同步RTC的話那么只需要把下面的選項打開就可以了

可以通過ps –ef |grep ntp或者使用pgrep –lf ntp查看一下你的ntp服務是否啟動了。然后可以通過snoop命令進行ntp的檢測。
Snoop |grep –i ntp進行檢測。
在建立好ntp服務以后,可以用2個工具命令對ntp服務進行管理。
一個是ntpq是一個交互式應用命令,在它的下面有很多的子命令可以供大家使用.使用peers可以查看同步進程。如果還需要其他的命令可以輸入help 進行查看。還有一個工具命令是ntpdate這個命令一般用于ntp的客戶端使用。可以在/var/adm/messages中看到ntp的同步信息的情況。如果需要更加詳細的ntpq和ntpdate的信息可以使用man幫助進行查詢。

3, 其他網絡時間服務器地址如下:

中國國家北京時間授時中心:
http://www.php.cn/

time.nist.gov(美國)
ntp.fudan.edu.cn(復旦)(國內用戶推薦使用此服務器)
timekeeper.isi.edu
subitaneous.cpsc.ucalgary.ca
usno.pa-x.dec.com
time.twc.weather.com
swisstime.ethz.ch
ntp0.fau.de
ntp3.fau.de
time-a.nist.gov
time-b.nist.gov
time-nw.nist.gov
nist1-sj.glassey.com

參考文章記錄:http://www.php.cn/

1,調整數據庫服務器時間

因為應用app搖一搖活動發現過時15分鐘,還可以繼續搖一搖,問題根源在于數據庫服務器時間比應用服務器時間蠻了18分鐘,而app取得是數據庫的now(),所以才導致的。2個解決辦法,1是修改程序代碼,不通過數據庫now()去取而是通過應用服務器取;2是直接修改數據庫的時間。經過權衡之后采納第二種方案。

1.1,通過date -s修改時間

 修改linux服務器時間  date -s 2015-08-03  修改時間:  date -s 10:18:00

1.2,使用ntpdate調整手動調整時間

安裝ntpdate      yum install -y ntpdate  手動調整時間(需要ntpdate)      ntpdate us.pool.ntp.org

執行過程: ?

[root@testmysqldb?~]#?ntpdate?us.pool.ntp.org25?Sep?22:33:44?ntpdate[11419]:?the?NTP?socket?is?in?use,?exiting  [root@testmysqldb?~]#??[root@testmysqldb?~]#?service?ntpd?stop關閉?ntpd:????????????????????????????????????????????????[確定]  [root@testmysqldb?~]#?/usr/sbin/ntpdate?10.254.1.21;/sbin/clock?--systohc25?Sep?22:48:12?ntpdate[11445]:?step?time?server?10.254.1.21?offset?814.746911?sec  [root@testmysqldb?~]#

1.3,寫一個自動同步時間的腳本,加入定時計劃任務,每天同步一次

vim /etc/cron.daily/ntpdate   #! /bin/bash  /usr/sbin/ntpdate -s us.pool.ntp.org  /usr/sbin/hwclock --systohc    4,授予權限  # chmod +x /etc/cron.daily/ntpdate    加入crontab任務,每20分鐘同步一次  [root@testmysqldb ~]# crontab -l  */20 * * * * sh /etc/cron.daily/ntpdate    [root@testmysqldb ~]#

原blog地址為:http://www.php.cn/,未經原作者mchdba允許,謝絕轉載

2,Linux時間設置與同步

2.1 關于時間和時區

如果有人問你說現在幾點? 你看了看表回答他說晚上8點了. 這樣回答看上去沒有什么問題,但是如果問你的這個人在歐洲的話那么你的回答就會讓他很疑惑,因為他那里還太陽當空呢
這里就有產生了一個如何定義時間的問題. 因為在地球環繞太陽旋轉的24個小時中,世界各地日出日落的時間是不一樣的.所以我們才有劃分時區(timezone) 的必要,也就是把全球劃分成24個不同的時區. 所以我們可以把時間的定義理解為一個時間的值加上所在地的時區(注意這個所在地可以精確到城市)
地理課上我們都學過格林威治時間(GMT), 它也就是0時區時間. 但是我們在計算機中經常看到的是UTC. 它是Coordinated Universal Time的簡寫. 雖然可以認為UTC和GMT的值相等(誤差相當之小),但是UTC已經被認定為是國際標準,所以我們都應該遵守標準只使用UTC
那么假如現在中國當地的時間是晚上8點的話,我們可以有下面兩種表示方式
20:00 CST ?
12:00 UTC
這里的CST是Chinese Standard Time,也就是我們通常所說的北京時間了. 因為中國處在UTC+8時區,依次類推那么也就是12:00 UTC了.
第一,不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪里).所以當我們設置系統時間的時候,設置好時區是首先要做的工作
第二,很多國家都有夏令時(中國2010年的時候設置過一次),那就是在一年當中的某一天時鐘撥快一小時(比如從UTC+8一下變成UTC+9了),那么同理到時候還要再撥慢回來.如果我們設置了正確的時區,當需要改變時間的時候系統就會自動替我們調整
現在我們就來看一下如何在Linux下設置時區,也就是time zone

2.2 設置Linux Time Zone

在Linux下glibc提供了事先編譯好的許多timezone文件, 他們就放在/usr/share/zoneinfo這個目錄下,這里基本涵蓋了大部分的國家和城市

[root@wgq_idc_mon_1_12?~]#?ls?-F?/usr/share/zoneinfo/Africa/??????Asia/???????  Canada/??Cuba???EST??????GB???????GMT-0??????HST??????iso3166.tab??Kwajalein??Mideast/??NZ????????  Portugal????PST8PDT??Singapore??US/???zone.tabAmerica/?????Atlantic/???CET??????EET????EST5EDT??GB-Eire??  GMT+0??????Iceland??Israel???????Libya??????MST???????NZ-CHAT???posix/??????right/???Turkey?????UTC???ZuluAntarctica/??Australia/??Chile/?  ??Egypt??Etc/?????GMT??????Greenwich??Indian/??Jamaica??????MET????????MST7MDT???Pacific/??posixrules??ROC??????UCT????????WETArctic/??  ??????Brazil/?????CST6CDT??Eire???Europe/??GMT0?????Hongkong???Iran?????Japan????????Mexico/????Navajo????Poland????PRC?????????ROK?  ???????????Universal??W-SU[root@wgq_idc_mon_1_12?~]#?[root@wgq_idc_mon_1_12?~]#?ll?/usr/share/zoneinfo/Asia/Shanghai-rw-r--r--.?2?root?root?405?1月?  ????????????23?2013?/usr/share/zoneinfo/Asia/Shanghai[root@wgq_idc_mon_1_12?~]#?cp?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtimecp:  ????????????是否覆蓋"/etc/localtime"??y  [root@wgq_idc_mon_1_12?~]#?date2015年?09月?26日?星期六?12:12:20?CST[root@wgq_idc_mon_1_12?~]#

去目錄:/usr/share/zoneinfo/Asia/,看到有許多城市地區的名字,找到上海的為Shanghai,然后可以用zdump來check下,時間正常,如下所示:

[root@wgq_idc_mon_1_12?~]#?zdump?/usr/share/zoneinfo/Asia/Shanghai/usr/share/zoneinfo/Asia/Shanghai??Sat?Sep?26?13:11:23?2015?CST[root@wgq_idc_mon_1_12?~]#

那么我們又怎么來告訴系統我們所在time zone是哪個呢? 方法有很多,這里舉出兩種
第一個就是修改/etc/localtime這個文件,這個文件定義了我么所在的local time zone.

[root@wgq_idc_mon_1_12?~]#?cp?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtimecp:是否覆蓋"/etc/localtime"??y  [root@wgq_idc_mon_1_12?~]#?date2015年?09月?26日?星期六?13:19:00?CST[root@wgq_idc_mon_1_12?~]#

第二種方法也就設置TZ環境變量的值. 許多程序和命令都會用到這個變量的值. TZ的值可以有多種格式,最簡單的設置方法就是使用tzselect命令,如下所示:

[root@wgq_idc_mon_1_12?~]#?tzselectPlease?identify?a?location?so?that?time?zone?rules?can?be?set?correctly.  Please?select?a?continent?or?ocean.?  1)?Africa?  2)?Americas?  3)?Antarctica?  4)?Arctic?Ocean?  5)?Asia?  6)?Atlantic?Ocean?  7)?Australia?  8)?Europe?  9)?Indian?Ocean  10)?Pacific?Ocean  11)?none?-?I?want?to?specify?the?time?zone?using?the?Posix?TZ?format.#??5Please?select?a?country.?  1)?Afghanistan???????  18)?Israel????????????  35)?Palestine?  2)?Armenia???????  19)?Japan?????????  36)?Philippines?  3)?Azerbaijan????????  20)?Jordan????????????  37)?Qatar?  4)?Bahrain???????  21)?Kazakhstan????????  38)?Russia?  5)?Bangladesh????????  22)?Korea?(North)?????  39)?Saudi?Arabia?  6)?Bhutan????????  23)?Korea?(South)?????  40)?Singapore?  7)?Brunei????????  24)?Kuwait????????????  41)?Sri?Lanka?  8)?Cambodia??????????  25)?Kyrgyzstan????????  42)?Syria?9)?China????????  ?26)?Laos??????????  ?43)?Taiwan10)?Cyprus????????  ?27)?Lebanon???????????  ?44)?Tajikistan11)?East?Timor????????  ?28)?Macau?????????  ?45)?Thailand12)?Georgia???????  ?29)?Malaysia??????????  ?46)?Turkmenistan13)?Hong?Kong?????????  ?30)?Mongolia??????????  ?47)?United?Arab?Emirates  ?14)?India?????????  ?31)?Myanmar?(Burma)???????  ?48)?Uzbekistan  ?15)?Indonesia?????????  ?32)?Nepal?????????  ?49)?Vietnam16)?Iran??????????  ?33)?Oman??????????  ?50)?Yemen  ?17)?Iraq??????????  ?34)?Pakistan#??  ?9Please?select?one?of?the?following?time?zone?regions.1)?east?China?-?Beijing,?Guangdong,?Shanghai,?etc.2)?  ?Heilongjiang?(except?Mohe),?Jilin3)?central?China?-?Sichuan,?Yunnan,?Guangxi,?Shaanxi,?Guizhou,?etc.4)?  ?most?of?Tibet?&?Xinjiang5)?west?Tibet?&?Xinjiang#??1The?following?information?has?been?given:    ????China  ????east?China?-?Beijing,?Guangdong,?Shanghai,?etc.    Therefore?TZ='Asia/Shanghai'?will?be?used.  Local?time?is?now:??Sat?Sep?26?13:21:14?CST?2015.Universal?Time?is?now:?  ?Sat?Sep?26?05:21:14?UTC?2015.Is?the?above?information?OK?1)?Yes2)?No#??  ?yesPlease?enter?1?for?Yes,?or?2?for?No.#??1You?can?make?this?change?permanent?for?yourself?by?appending?the?line  ????TZ='Asia/Shanghai';?export?TZto?the?file?'.profile'?in?your?home?directory;?then?log?out?and?log?in?again.    Here?is?that?TZ?value?again,?this?time?on?standard?output?so?that?you  can?use?the?/usr/bin/tzselect?command?in?shell?scripts:  Asia/Shanghai  [root@wgq_idc_mon_1_12?~]#?[root@wgq_idc_mon_1_12?~]#?more?/etc/localtime?TZif2  CST-8[root@wgq_idc_mon_1_12?~]#

TZ變量的值會override /etc/localtime. 也就是說當TZ變量沒有定義的時候系統才使用/etc/localtime來確定time zone. 所以你想永久修改time zone的話那么可以把TZ變量的設置寫入/etc/profile里

2.3 Read Time Clock(RTC) and System Clock

說道設置時間這里還要明確另外一個概念就是在一臺計算機上我們有兩個時鐘:一個稱之為硬件時間時鐘(RTC),還有一個稱之為系統時鐘(System Clock);
硬件時鐘是指嵌在主板上的特殊的電路, 它的存在就是平時我們關機之后還可以計算時間的原因;
系統時鐘就是操作系統的kernel所用來計算時間的時鐘. 它從1970年1月1日00:00:00 UTC時間到目前為止秒數總和的值; 在Linux下系統時間在開機的時候會和硬件時間同步(synchronization),之后也就各自獨立運行了 ;
那么既然兩個時鐘獨自運行,那么時間久了必然就會產生誤差了,下面我們來看一個例子;

通過hwclock –help命令查看hwclock的各種用途:
[root@wgq_idc_mon_1_12 ~]# hwclock –show
2015年09月26日 星期六 13時58分34秒 ?-0.219418 seconds
[root@wgq_idc_mon_1_12 ~]#

hwclock –hctosys ?把硬件時間設置成系統時間

hwclock –systohc ?把系統時間設置成硬件時間

hwclock –set –date=”mm/dd/yy hh:mm:ss” ? 設置硬件時間我們可以開機的時候在BIOS里設定.也可以用hwclock命令

date -s “dd/mm/yyyy hh:mm:ss” 修改系統時間用date命令就最簡單了

現在我們知道了如何設置系統和硬件的時間. 但問題是如果這兩個時間都不準確了怎么辦? 那么我們就需要在互聯網上找到一個可以提供我們準確時間的服務器然后通過一種協議來同步我們的系統時間,那么這個協議就是NTP了. 接下去我們所要說的同步就都是指系統時間和網絡服務器之間的同步了

2.4 設置NTP Server前的準備

其實這個標題應該改為設置”NTP Relay Server”前的準備更加合適. 因為不論我們的計算機配置多好運行時間久了都會產生誤差,所以不足以給互聯網上的其他服務器做NTP Server. 真正能夠精確地測算時間的還是原子鐘. 但由于原子鐘十分的昂貴,只有少部分組織擁有, 他們連接到計算機之后就成了一臺真正的NTP Server. 而我們所要做的就是連接到這些服務器上同步我們系統的時間,然后把我們自己的服務器做成NTP Relay Server再給互聯網或者是局域網內的用戶提供同步服務.

1). 架設一個NTP Relay Server其實非常簡單,我們先把需要的RPM包裝上

rpm -ivh ntp-4.2.2p1-5.el5.rpm

2).找到在互聯網上給我們提供同步服務的NTP Server ,http://www.php.cn/是NTP的官方網站,在這上面我們可以找到離我們城市最近的NTP Server. NTP建議我們為了保障時間的準確性,最少找兩個個NTP Server
那么比如在英國的話就可以選擇下面兩個服務器
0.uk.pool.ntp.org
1.uk.pool.ntp.org
它的一般格式都是number.country.pool.ntp.org

中國的ntp服務器地址:

server 133.100.11.8 prefer
server 210.72.145.44
server 203.117.180.36
server 131.107.1.10
server time.asia.apple.com
server 64.236.96.53
server 130.149.17.21
server 66.92.68.246
server www.freebsd.org
server 18.145.0.30
server clock.via.net
server 137.92.140.80
server 133.100.9.2
server 128.118.46.3
server ntp.nasa.gov
server 129.7.1.66
server ntp-sop.inria.fr

server (國家授時中心服務器IP地址)

3).在打開NTP服務器之前先和這些服務器做一個同步,使得我們機器的時間盡量接近標準時間. 這里我們可以用ntpdate命令

ntpdate 0.uk.pool.ntp.org  ntpdate 0.pool.ntp.org

假如你的時間差的很離譜的話第一次會看到調整的幅度比較大,所以保險起見可以運行兩次. 那么為什么在打開NTP服務之前先要手動運行同步呢?
1. 因為根據NTP的設置,如果你的系統時間比正確時間要快的話那么NTP是不會幫你調整的,所以要么你把時間設置回去,要么先做一個手動同步
2. 當你的時間設置和NTP服務器的時間相差很大的時候,NTP會花上較長一段時間進行調整.所以手動同步可以減少這段時間

2.5 配置和運行NTP Server
現在我們就來創建NTP的配置文件了, 它就是/etc/ntp.conf. 我們只需要加入上面的NTP Server和一個driftfile就可以了

?vi?/etc/ntp.confserver?0.uk.pool.ntp.orgserver?1.uk.pool.ntp.orgdriftfile?/var/lib/ntp/ntp.drift

非常的簡單. 接下來我們就啟動NTP Server,并且設置其在開機后自動運行

/etc/init.d/ntpd start   chkconfig --level 35 ntpd on

2.6 查看NTP服務的運行狀況 ?
現在我們已經啟動了NTP的服務,但是我們的系統時間到底和服務器同步了沒有呢? 為此NTP提供了一個很好的查看工具: ntpq (NTP query)
我建議大家在打開NTP服務器后就可以運行ntpq命令來監測服務器的運行.這里我們可以使用watch命令來查看一段時間內服務器各項數值的變化

watch?ntpq?-p  Every?2.0s:?ntpq?-p??????????????????????????????????Sat?Jul?7?00:41:45?2007?????remote???????????refid??????st?t?when?poll?reach???delay???offset?jitter  ==============================================================================+193.60.199.75???193.62.22.98?????2?u???52???64?377????8.578???10.203?289.032*mozart.musicbox?192.5.41.41??????2?u???54???64?377???19.301?-60.218?292.411

現在我就來解釋一下其中的含義:
remote: 它指的就是本地機器所連接的遠程NTP服務器
refid: 它指的是給遠程服務器(e.g. 193.60.199.75)提供時間同步的服務器
st: 遠程服務器的級別. 由于NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端. 所以服務器從高到低級別可以設定為1-16. 為了減緩負荷和網絡堵塞,原則上應該避免直接連接到級別為1的服務器的.
t: 這個…..我也不知道啥意思^_^
when: 我個人把它理解為一個計時器用來告訴我們還有多久本地機器就需要和遠程服務器進行一次時間同步
poll: 本地機和遠程服務器多少時間進行一次同步(單位為秒). 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增加了,可以盡快調整到正確的時間范圍.之后poll值會逐漸增大,同步的頻率也就會相應減小
reach: 這是一個八進制值,用來測試能否和服務器連接.每成功連接一次它的值就會增加
delay: 從本地機發送同步要求到服務器的round trip time
offset: 這是個最關鍵的值, 它告訴了我們本地機和服務器之間的時間差別. offset越接近于0,我們就和服務器的時間越接近
jitter: 這是一個用來做統計的值. 它統計了在特定個連續的連接數里offset的分布情況. 簡單地說這個數值的絕對值越小我們和服務器的時間就越精確
那么大家細心的話就會發現兩個問題: 第一我們連接的是0.uk.pool.ntp.org為什么和remote server不一樣? 第二那個最前面的+和*都是什么意思呢?
第一個問題不難理解,因為NTP提供給我們的是一個cluster server所以每次連接的得到的服務器都有可能是不一樣.同樣這也告訴我們了在指定NTP Server的時候應該使用hostname而不是IP
第二個問題和第一個相關,既然有這么多的服務器就是為了在發生問題的時候其他的服務器還可以正常地給我們提供服務.那么如何知道這些服務器的狀態呢? 這就是第一個記號會告訴我們的信息
* ?:它告訴我們遠端的服務器已經被確認為我們的主NTP Server,我們系統的時間將由這臺機器所提供
+ :它將作為輔助的NTP Server和帶有號的服務器一起為我們提供同步服務. 當號服務器不可用時它就可以接管
– :遠程服務器被clustering algorithm認為是不合格的NTP Server
x :遠程服務器不可用
了解這些之后我們就可以實時監測我們系統的時間同步狀況了

2.7. NTP安全設置

運行一個NTP Server不需要占用很多的系統資源,所以也不用專門配置獨立的服務器,就可以給許多client提供時間同步服務, 但是一些基本的安全設置還是很有必要的
那么這里一個很簡單的思路就是第一我們只允許局域網內一部分的用戶連接到我們的服務器. 第二個就是這些client不能修改我們服務器上的時間
在/etc/ntp.conf文件中我們可以用restrict關鍵字來配置上面的要求
首先我們對于默認的client拒絕所有的操作

然后允許本機地址一切的操作:

restrict?default?kod?nomodify?notrap?nopeer?noquery

最后我們允許局域網內所有client連接到這臺服務器同步時間.但是拒絕讓他們修改服務器上的時間:

restrict?127.0.0.1

把這三條加入到/etc/ntp.conf中就完成了我們的簡單配置. NTP還可以用key來做authenticaiton,這里就不詳細介紹了

restrict?192.168.1.0?mask?255.255.255.0?nomodify

2.8. NTP client的設置

做到這里我們已經有了一臺自己的Relay Server.如果我們想讓局域網內的其他client都進行時間同步的話那么我們就都應該照樣再搭建一臺Relay Server,然后把所有的client都指向這兩臺服務器(注意不要把所有的client都指向Internet上的服務器). 只要在client的ntp.conf加上這你自己的服務器就可以了

代碼:

server?ntp1.leonard.comserver?ntp2.leonard.com

2.9. 一些補充和拾遺

  1. 配置文件中的driftfile是什么?
    我們每一個system clock的頻率都有小小的誤差,這個就是為什么機器運行一段時間后會不精確. NTP會自動來監測我們時鐘的誤差值并予以調整.但問題是這是一個冗長的過程,所以它會把記錄下來的誤差先寫入driftfile.這樣即使你重新開機以后之前的計算結果也就不會丟失了

  2. 如何同步硬件時鐘?
    NTP一般只會同步system clock. 但是如果我們也要同步RTC的話那么只需要把下面的選項打開就可以了

可以通過ps –ef |grep ntp或者使用pgrep –lf ntp查看一下你的ntp服務是否啟動了。然后可以通過snoop命令進行ntp的檢測。
Snoop |grep –i ntp進行檢測。
在建立好ntp服務以后,可以用2個工具命令對ntp服務進行管理。
一個是ntpq是一個交互式應用命令,在它的下面有很多的子命令可以供大家使用.使用peers可以查看同步進程。如果還需要其他的命令可以輸入help 進行查看。還有一個工具命令是ntpdate這個命令一般用于ntp的客戶端使用。可以在/var/adm/messages中看到ntp的同步信息的情況。如果需要更加詳細的ntpq和ntpdate的信息可以使用man幫助進行查詢。

3, 其他網絡時間服務器地址如下:

中國國家北京時間授時中心:
http://www.php.cn/

time.nist.gov(美國)
ntp.fudan.edu.cn(復旦)(國內用戶推薦使用此服務器)
timekeeper.isi.edu
subitaneous.cpsc.ucalgary.ca
usno.pa-x.dec.com
time.twc.weather.com
swisstime.ethz.ch
ntp0.fau.de
ntp3.fau.de
time-a.nist.gov
time-b.nist.gov
time-nw.nist.gov
nist1-sj.glassey.com

參考文章記錄:http://www.php.cn/

?以上就是MySQL服務器時間同步問題的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享