注意你的Ceph集羣!~沒有注意這一點你的集羣可能會掛!

睡夢中剛好醒來,瞅了一眼羣,發現羣裏已經炸開了鍋,各個重要系統報來宕機的噩耗。 這一晚的大雪,挺有意思。。。


Q了下運維老朋友,說是遇到了個大坑,某幾臺機器時間走的飛快,基本是每十秒會多出1s的速度。


可不要小看這小小的時間加速,造成的影響是Ceph的集羣某幾個osd節點down掉,然後早就了開頭那一幕。


原因就是因爲時間不同步,Ceph節點健康檢測應該是失敗了(推測)


他的臨時辦法,只能強制30s 調用一次crontab ntpupdate ,ceph恢復。


這番描述感覺挺有意思,印象中一般配置了 ntp同步,基本不需要再去頻繁的配置,麻利的穿好衣服,開始搜索與linux時間相關的 page.


搜索一番感覺除了一個閏秒之坑之外,沒有別的地方可以入手,系統時間速度快肯定是時鐘頻率快了,但是什麼導致的就不得而知了。


於是要了下有問題的機器和環境配置: RHEL 7 , 然後crontab 寫了臨時解決方法 是10s自動 調用ntpupdate 從B機器同步時間,


使用 watch -n 1 date 命令觀察 date變化,發現時間明顯要快速與別的正常機器。


此外 我們發現 B機器時間要慢於實際現實世界的時間大概10分鐘左右

沒有更多的信息了。


抱着試試看的態度,google 了 rhel linux time 相關文章:

https://access.redhat.com/articles/15145


看完這篇文章貌似並沒有什麼太大相關性: 它講述了 RHEL 是怎麼處理 閏秒(可自行百度 谷歌該關鍵詞)


對應於環境 當前RHEL 7版本, 我們除了發現閏秒,還發現官網似乎介紹了一個有別於 ntp服務的東西 叫 chrony


這個chrony幹啥的, 百度谷歌發現 它其實是ntp的另一種實現,最重要的我們發現 rhel7/centos7 開始 內置了這玩意。


於是迅速檢查了下該機器是否運行該服務:

service chronyd status

其配置文件默認位於 /etc/chrony.conf


內容如下:



這一看基本感覺跟 ntp 配置文件類似, 開頭4個地址,查看文檔我們發現,chrony有個客戶端 chronyc,還有守護進程chronyd


通過 chronyc sources -v 得到如下狀態:


發現chrony貌似是在跟這3個地址在同步時間,but 這三個地址,我們並沒有在配置文件中配置,

那麼從哪裏來的? 其實配置裏比如配置的

server 0.rhel.pool.ntp.org iburst


這裏麪包含一個pool基本可以想到這是一個類似LB的地址,實際真正的地址就是上圖裏的這些,可以理解,chrony 會滿世界的找離我們比較近的ntp服務器進行時間同步。


這臺rhel7是可以聯網的,所以時間是可以同步的。

我們注意到chrony的配置有一項叫 makestep:

通過註釋和查閱文檔我們知道:

通常,chronyd將根據需求通過減慢或加速時鐘,使得系統逐步糾正所有時間偏差。在某些特定情況下,系統時鐘可能會漂移過快,導致該調整過程消耗很長的時間來糾正系統時鐘。該指令強制chronyd在調整期大於某個閥值時步進調整系統時鐘,但只有在因爲chronyd啓動時間超過指定限制(可使用負值來禁用限制),沒有更多時鐘更新時才生效


這, 就比較接近事情的真相了


原來chrony真的去幹了! 真的去幹了自動調節時鐘頻率來使本機時間與 配置的幾個server差距最小。


然後注意到我們所說的一個情況就是,我們內網的 ntpserver 要比實際現實時間 慢10分鐘;


所有的這一切幾乎可以解釋的通了, 本機時間慢,chrony 覺得你慢了, 得加快點,於是你的時間跑的飛快:


通過chronyc tracking命令得到如下:


經過分析:

ppm:是一個相對變化量,1ppm指百萬分之一,也就是相對標稱頻率的變化量,這個值越小越好,標準是在25ppm以內,都認爲是正常現象


chrony 通過比對 和配置的ntpserver,計算出差距,然後動態控制本機系統時鐘頻率,根據 makestep的參數來調節(加速/減緩);最終讓時間趨於 上述的server

有了這樣一個東西在內網,而我們的又配置了和內網ntp 同步,內網的時間又慢了10分鐘,這就是衝突所在,考慮chrony是 rhel7內置 ,我們不考慮禁用它(即使你禁用它未必管用,因爲它配置的時鐘頻率已經生效了,所以我們該考慮怎麼使用chrony,擁抱rhel7的這一變化)


其實很簡單嘍, 既然是ntp另一種實現,那麼把配置的server 換成內網 ntpserver不就哦了?


註釋掉外網ntpserver配上內網ntp,重啓 chronyd service chronyd restart

再去使用chronyc相關命令,我們發現天下太平了,時間再也不那麼快了。


chrony到底如何,設置系統始終頻率? 我花了點時間想查看當前 sys clock frequency發現還是不特別好獲得, chrony 通過計算會把當前和server的頻率誤差記錄在 driffile文件裏,上述默認配置在/var/lib/chrony/drift

然後根據代碼https://github.com/mlichvar/chrony/:



嗯,所有一切都解釋的通了。。 集羣什麼的都恢復和平的模樣了。注意這是 RHEL7 ,centos7可能也存在該問題


相關文檔:

  • https://access.redhat.com/articles/15145

  • http://www.techug.com/post/leap-second-cause-linux-down.html

  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-using_chrony


發佈了116 篇原創文章 · 獲贊 60 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章