【科普】聽(tīng)過(guò)閏年閏月,可你聽(tīng)過(guò)閏秒嗎?
閏年閏月大家都知道,可是你聽(tīng)說(shuō)過(guò)閏秒這回事情嗎?
閏年是為了彌補(bǔ)是我們的歷法365天和地球?qū)嶋H公轉(zhuǎn)365.25天的差距,所以每4年會(huì)一年是閏年,多出來(lái)的那一天就是2月29日。
閏月則是和陰歷有關(guān),不同于陽(yáng)歷的以公轉(zhuǎn)制定的方式,陰歷以月亮繞地球的時(shí)間來(lái)計(jì)算,所以會(huì)和陽(yáng)歷的365.25天相差10天21小時(shí),于是,多出來(lái)的時(shí)間累積下來(lái)湊成一個(gè)月,也就是閏月了。
那么什么是閏秒?閏秒會(huì)帶來(lái)什么影響?怎么解決閏秒帶來(lái)的問(wèn)題?
閏秒定義
要了解閏秒,首先需要了解幾個(gè)基本的概念。
平均太陽(yáng)日:天空中的太陽(yáng)連續(xù)兩次出現(xiàn)最大仰角(90度)所經(jīng)歷的時(shí)間就是一個(gè)太陽(yáng)日,而又由于太陽(yáng)日的長(zhǎng)短不同,所以取一年內(nèi)的太陽(yáng)日平均值,所以可以大致的認(rèn)為一個(gè)平均太陽(yáng)日就是一天24小時(shí)。
UTC:英文為Coordinated Universal Time,中文叫做協(xié)調(diào)世界時(shí)或者世界標(biāo)準(zhǔn)時(shí)間,相信開(kāi)發(fā)的同學(xué)都很清楚,他是世界上調(diào)節(jié)時(shí)鐘和時(shí)間的主要時(shí)間標(biāo)準(zhǔn),也是最接近格林威治標(biāo)準(zhǔn)時(shí)間GMT的時(shí)間系統(tǒng)之一。
最早的時(shí)候,一秒根據(jù)平均太陽(yáng)日的1/86400來(lái)定義,這個(gè)時(shí)間依賴于地球的自轉(zhuǎn)和公轉(zhuǎn)。后來(lái)直到1967年,秒被物理學(xué)重新定義,以銫133的振蕩頻率來(lái)定義秒,并可以用原子鐘來(lái)測(cè)量。
UTC的時(shí)間就是基于此來(lái)定義,而且他是一個(gè)固定的時(shí)間長(zhǎng)度。
但是由于地球自轉(zhuǎn)的速度受到潮汐加速等眾多因素的影響,平均太陽(yáng)日的時(shí)間并不固定。
為了讓UTC貼近平均太陽(yáng)日的時(shí)間,所以就產(chǎn)生了閏秒。
閏秒分為兩種形式:
正閏秒,也就是在23:59:59之后一秒是23:59:60,然后才是00:00:00,很奇葩很詭異是不是。 負(fù)閏秒,23:59:58的下一秒就是00:00:00,但是目前沒(méi)有出現(xiàn)過(guò)負(fù)閏秒。
閏秒的時(shí)間調(diào)整一般是在6月30日或者12月31日,而離我們最近的一次閏秒的調(diào)整則是在2016年的12月31日。
從1972年到現(xiàn)在,已經(jīng)發(fā)生了20多次閏秒,對(duì)于我們的系統(tǒng)配置來(lái)說(shuō),通過(guò)NTP的服務(wù)來(lái)進(jìn)行時(shí)間同步,如果服務(wù)器收到閏秒的處理通知,則會(huì)一級(jí)級(jí)下發(fā)到最邊緣的NTP服務(wù)器,然后通知到客戶端的操作系統(tǒng),最終由操作系統(tǒng)來(lái)處理閏秒。
下面的表格是歷年發(fā)生閏秒的時(shí)間:
| 年 | 6月30日 | 12月31日 |
|---|---|---|
| 1972年 | +1 | +1 |
| 1973年 | 0 | +1 |
| 1974年 | 0 | +1 |
| 1975年 | 0 | +1 |
| 1976年 | 0 | +1 |
| 1977年 | 0 | +1 |
| 1978年 | 0 | +1 |
| 1979年 | 0 | +1 |
| 1981年 | +1 | 0 |
| 1982年 | +1 | 0 |
| 1983年 | +1 | 0 |
| 1985年 | +1 | 0 |
| 1987年 | 0 | +1 |
| 1989年 | 0 | +1 |
| 1990年 | 0 | +1 |
| 1992年 | +1 | 0 |
| 1993年 | +1 | 0 |
| 1994年 | +1 | 0 |
| 1995年 | 0 | +1 |
| 1997年 | +1 | 0 |
| 1998年 | 0 | +1 |
| 2005年 | 0 | +1 |
| 2008年 | 0 | +1 |
| 2012年 | +1 | 0 |
| 2015年 | +1 | 0 |
| 2016年 | 0 | +1 |
帶來(lái)的影響
雖然閏秒對(duì)普通人的日常生活沒(méi)有任何影響,但是對(duì)于開(kāi)啟NTP服務(wù)的Linux系統(tǒng)來(lái)說(shuō)有致命的風(fēng)險(xiǎn),在Linux kernel 2.6.29之前版本存在bug,在進(jìn)行閏秒調(diào)整時(shí)可能會(huì)引起系統(tǒng)導(dǎo)致ntpd進(jìn)程死鎖,從而導(dǎo)致crash。另外由于應(yīng)用程序不能處理閏秒的問(wèn)題導(dǎo)致時(shí)間的變化,會(huì)導(dǎo)致CPU load激增。
在上一次閏秒產(chǎn)生,國(guó)外Reddit、Mozilla、FourSquare、Yelp、LinkedIn和Gawker都產(chǎn)生了一定的問(wèn)題,其中Reddit宕機(jī)時(shí)間超過(guò)1個(gè)半小時(shí)。其中,或許你能很明顯的看到異常錯(cuò)誤信息:kernel[81951.244556] Clock: inserting leap second 23:59:60 UTC
另外,針對(duì)數(shù)據(jù)庫(kù)方面,23:59:60時(shí)間的問(wèn)題兼容也不盡相同。
PostgreSQL:PostgreSQL可以兼容23:59:60的寫(xiě)法,不會(huì)報(bào)錯(cuò)。
Mysql:Mysql還不支持60秒寫(xiě)法,閏秒時(shí)必須使用unix time來(lái)表示時(shí)間,否則會(huì)報(bào)錯(cuò)。
根據(jù)目前的信息來(lái)看,Linux內(nèi)核版本高于2.6.29修復(fù)了這個(gè)問(wèn)題,NTP版本高于4.2.2p1-9會(huì)把這一秒的時(shí)間分散到大約2000秒中,低于該版本的話則會(huì)直接加一秒或者減一秒。
解決方案
最簡(jiǎn)單直接的方法就是閏秒發(fā)生前停止ntpd服務(wù),閏秒結(jié)束后再開(kāi)啟。
提前一天停止ntp?/etc/init.d/ntpd?stop
重置系統(tǒng)時(shí)間?date?-s?"`date`"
重新開(kāi)啟ntp?ntp/etc/init.d/ntpd?start
但是有一個(gè)很明顯的問(wèn)題就是,大公司一個(gè)服務(wù)上千臺(tái)機(jī)器,操作起來(lái)成功太高,而且停止同步是否會(huì)帶來(lái)其他的問(wèn)題不好評(píng)估影響面。
目前像google、阿里、amazon都有一些具體的應(yīng)對(duì)方案,使用云服務(wù)的話可能不需要用戶關(guān)心這方面的問(wèn)題,如果是自己機(jī)房托管的話那么可能需要運(yùn)維開(kāi)發(fā)人員手動(dòng)處理了。
以國(guó)內(nèi)阿里云的處理方案舉例,amazon同樣也是采用該方案
阿里云的ECS云服務(wù)器的NTP服務(wù)采用忽略閏秒時(shí)刻的跳秒,緩慢同步消除閏秒帶來(lái)的1秒誤差的方案來(lái)面對(duì)閏秒事件,實(shí)際上采用的方案是閏秒發(fā)生前,每秒比UTC慢1/86400,經(jīng)過(guò)12小時(shí)(43200秒)后,會(huì)比UTC慢0.5秒,閏秒發(fā)生之后,每秒和UTC誤差減少1/86400,經(jīng)過(guò)12小時(shí)(43200秒)后,-0.5的誤差消除。國(guó)外Amazon也是這樣的解決方案。
具體時(shí)間同步方案如下表格所示:
| UTC | 阿里云時(shí)間(北京時(shí)區(qū) | 阿里云時(shí)間和UTC誤差 | 備注 |
|---|---|---|---|
| 2016/12/31 11:59:59 | 2016/12/31 19:59:59 | +0 | 和UTC完全同步 |
| 12:00:00 | 20:00:00 | +0 | |
| 12:00:01 | 每秒比UTC慢1/86400,經(jīng)過(guò)12小時(shí)(43200秒)后,會(huì)比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,經(jīng)過(guò)12小時(shí)(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:01 | 0 | |
| … | … | … |
如何預(yù)測(cè)避免
實(shí)際上,由于地球自轉(zhuǎn)的時(shí)間無(wú)法計(jì)算,他有可能變快,也有可能變慢,受到潮汐、天氣和熔態(tài)金屬在地球核心的流動(dòng)等各方面因素的影響,下一次閏秒的時(shí)間無(wú)法預(yù)估,但是國(guó)際地球自轉(zhuǎn)和參考系服務(wù)(IERS)會(huì)提前6個(gè)月公布下一次閏秒的時(shí)間。
巨人的肩膀:
- END -https://zh.wikipedia.org/wiki/%E9%97%B0%E7%A7%92
https://developer.aliyun.com/article/68260
https://yq.aliyun.com/articles/80045?spm=5176.10695662.1996646101.searchclickresult.746332ab0yvJRw
https://www.cnblogs.com/luxianghao/p/6339470.html
往期推薦
點(diǎn)擊二維碼識(shí)別關(guān)注
點(diǎn)在看,讓更多看見(jiàn)。
