閏年閏月大家都知道,可是你聽說過閏秒這回事情嗎?
閏年是為了彌補是我們的曆法365天和地球實際公轉365.25天的差距,所以每4年會一年是閏年,多出來的那一天就是2月29日。
閏月則是和陰曆有關,不同於陽曆的以公轉制定的方式,陰曆以月亮繞地球的時間來計算,所以會和陽曆的365.25天相差10天21小時,於是,多出來的時間累積下來湊成乙個月,也就是閏月了。
那麼什麼是閏秒?閏秒會帶來什麼影響?怎麼解決閏秒帶來的問題?
要了解閏秒,首先需要了解幾個基本的概念。
平均太陽日:天空中的太陽連續兩次出現最大仰角(90度)所經歷的時間就是乙個太陽日,而又由於太陽日的長短不同,所以取一年內的太陽日平均值,所以可以大致的認為乙個平均太陽日就是一天24小時。
utc:英文為coordinated universal time,中文叫做協調世界時或者世界標準時間,相信開發的同學都很清楚,他是世界上調節時鐘和時間的主要時間標準,也是最接近格林威治標準時間gmt的時間系統之一。
最早的時候,一秒根據平均太陽日的1/86400來定義,這個時間依賴於地球的自轉和公轉。後來直到2023年,秒被物理學重新定義,以銫133的振盪頻率來定義秒,並可以用原子鐘來測量。
utc的時間就是基於此來定義,而且他是乙個固定的時間長度。
但是由於地球自轉的速度受到潮汐加速等眾多因素的影響,平均太陽日的時間並不固定。
為了讓utc貼近平均太陽日的時間,所以就產生了閏秒。
閏秒分為兩種形式:
正閏秒,也就是在23:59:59之後一秒是23:59:60,然後才是00:00:00,很奇葩很詭異是不是。
負閏秒,23:59:58的下一秒就是00:00:00,但是目前沒有出現過負閏秒。
閏秒的時間調整一般是在6月30日或者12月31日,而離我們最近的一次閏秒的調整則是在2023年的12月31日。
從2023年到現在,已經發生了20多次閏秒,對於我們的系統配置來說,通過ntp的服務來進行時間同步,如果伺服器收到閏秒的處理通知,則會一級級下發到最邊緣的ntp伺服器,然後通知到客戶端的作業系統,最終由作業系統來處理閏秒。
年6月30日
12月31日
2023年
+1+1
2023年0+1
2023年0+1
2023年0+1
2023年0+1
2023年0+1
2023年0+1
2023年0+1
2023年+10
2023年+10
2023年+10
2023年+10
2023年0+1
2023年0+1
2023年0+1
2023年+10
2023年+10
2023年+10
2023年0+1
2023年+10
2023年0+1
2023年0+1
2023年0+1
2023年+10
2023年+10
2023年0+1
雖然閏秒對普通人的日常生活沒有任何影響,但是對於開啟ntp服務的linux系統來說有致命的風險,在linux kernel 2.6.29之前版本存在bug,在進行閏秒調整時可能會引起系統導致ntpd程序死鎖,從而導致crash。另外由於應用程式不能處理閏秒的問題導致時間的變化,會導致cpu load激增。
在上一次閏秒產生,國外reddit、mozilla、foursquare、yelp、linkedin和gawker都產生了一定的問題,其中reddit宕機時間超過1個半小時。其中,或許你能很明顯的看到異常錯誤資訊:kernel[81951.244556] clock: inserting leap second 23:59:60 utc
另外,針對資料庫方面,23:59:60
時間的問題相容也不盡相同。
postgresql:postgresql可以相容23:59:60
的寫法,不會報錯。
mysql:mysql還不支援60秒寫法,閏秒時必須使用unix time來表示時間,否則會報錯。
根據目前的資訊來看,linux核心版本高於2.6.29修復了這個問題,ntp版本高於4.2.2p1-9會把這一秒的時間分散到大約2000秒中,低於該版本的話則會直接加一秒或者減一秒。
最簡單直接的方法就是閏秒發生前停止ntpd服務,閏秒結束後再開啟。
提前一天停止ntp /etc/init.d/ntpd stop重置系統時間 date -s "`date`"
重新開啟ntp ntp/etc/init.d/ntpd start
巨人的肩膀:
實際上,由於地球自轉的時間無法計算,他有可能變快,也有可能變慢,受到潮汐、天氣和熔態金屬在地球核心的流動等各方面因素的影響,下一次閏秒的時間無法預估,但是國際地球自轉和參考係服務(iers)會提前6個月公布下一次閏秒的時間。
utc阿里雲時間(北京時區
阿里雲時間和utc誤差
備註2016/12/31 11:59:59
2016/12/31 19:59:59
+0和utc完全同步
12:00:00
20:00:00
+012:00:01
每秒比utc慢1/86400,經過12小時(43200秒)後,會比utc慢0.5秒
20:00:01
+1/86400
12:00:02
20:00:02
+2/86400……
…23:59:59
2017/1/1 07:59:59
+43199/86400
23:59:60
閏秒2017/1/1 08:00:00
-0.5秒
和utc誤差-0.5秒
2017/1/1 00:00:00
每秒和utc誤差減少1/86400,經過12小時(43200秒)後,-0.5的誤差消除
08:00:01
-43199/86400
00:00:01
08:00:02
-43198/86400……
…19:59:59
-1/86400
11:59:59……
2017/1/1 12:00:00
2017/1/1 20:00:00
0再一次和utc同步
12:00:01
20:00:010…
……具體時間同步方案如下**所示:
阿里雲的ecs雲伺服器的ntp服務採用忽略閏秒時刻的跳秒,緩慢同步消除閏秒帶來的1秒誤差的方案來面對閏秒事件,實際上採用的方案是閏秒發生前,每秒比utc慢1/86400,經過12小時(43200秒)後,會比utc慢0.5秒,閏秒發生之後,每秒和utc誤差減少1/86400,經過12小時(43200秒)後,-0.5的誤差消除。國外amazon也是這樣的解決方案。
以國內阿里雲的處理方案舉例,amazon同樣也是採用該方案
目前像google、阿里、amazon都有一些具體的應對方案,使用雲服務的話可能不需要使用者關心這方面的問題,如果是自己機房託管的話那麼可能需要運維開發人員手動處理了。
但是有乙個很明顯的問題就是,大公司乙個服務上千臺機器,操作起來成功太高,而且停止同步是否會帶來其他的問題不好評估影響面。
農曆中閏年閏月的演算法
太陽日 星期日 恆星日 地球自轉一周實際所需的時間,或春分點兩次經過同一子午圈所需的時間,也就是某乙個恆星兩次經過同一子午線所需的時間。乙個恆星日等於23小時56分4秒。恆星年 地球繞太陽一周實際所需的時間,也就是從地球上觀測,以太陽和某乙個恆星在同一位置上為起點,當觀測到太陽再回到這個位置時所需的...
GTK學習筆記 GTK 不懂,沒聽過
vc 剛剛學了個半生不熟,因為工作需要又要轉linux下去了,無奈!在了解了linux三天後,終於可以gtk了,一頭霧水.什麼是gtk?如何安裝?如何使用?無語了.查了半小時資料,終於有點眉目了,呵呵。1 gtk gimp toolkit 是一套用於建立圖形使用者介面的工具包。它遵循 lgpl 許可...
名人名言,你聽過幾句
青年時種下什麼,老年時就收穫什麼。易卜生 人並不是因為美麗才可愛,而是因為可愛才美麗。托爾斯泰 人的美德的榮譽比他的財富的榮譽不知大多少倍。達 芬奇 人的生命是有限的,可是,為人民服務是無限的,我要把有限的生命,投入到無限的為人民服務之中去。雷鋒 人的天職在勇於探索真理。哥白尼 人的知識愈廣,人的本...