【原創】見微知著看技術誤解?--從裸光纖和NTPD談起
第一. 裸光纖的故事
前幾天和朋友聊天,談到一根裸光纖可以分波分多大的問題。
幾個業內好友都明確說一根裸光纖最多跑10G帶寬,而於老闆明確表示裸光纖任何一個波分(或者不做波分)都可以跑100G以上。
後來我和於老闆深究原因,不可能幾個朋友都騙我或者都蠢,很可能前些年光纖波分機自己只能甩出10G口,或運營商租光纖套餐里只有10G規格,給大家造成了裸光纖只能跑10G帶寬的印象。同樣固有的印象是光纖必須從運營商那裡租,而且價格很貴還必須買波分設備等等;其實現在企業專線的市場競爭很充分,拉同城裸纖一公里也就小几百塊錢,而且短距離裸纖也不值得上波分設備,直接對接模塊即可。
第二. NTD是試金石
我對裸光纖是門外漢,但同樣的技術誤解讓我想到了NTP,我一直拿ntpd和ntpdate當做初中級系統工程師的試金石,分不清就月薪五千,分得清就八千以上(2014年市價)。但很多貨真價實的IT專家也在此事上跌倒,我也希望通過聊清楚一層誤會,說明高級工程師該少迷信多思考。
NTP是網路時間協議,它是多項傳輸、計算、加密技術的核心參數。
- 假設我認為TCP連接超時斷開鏈接了,你怎麼給我傳輸數據;
- 玩各種定時給獎勵收益的花園經營類遊戲,我經常通過修改時間快速刷分;
- 你的系統時間不對網銀都會拒絕登陸,因為加密程序算不出雙方認可的Token。
第三.正確的時間是向量
Linux環境下有兩個常用工具,NTPD和ntpdate。NTPD是一個時間同步服務,ntpdate是個時間同步命令。很多工程師都會採用Crond+ntpdate的方式同步時間,究其原因是「NTPD不太好用」。
而我不喜歡用ntpdate同步時間的工程師,NTPD是一個體系化的服務,而ntpdate只是一個動作,大部分人沒做好為ntpdate這個動作負責。
正常的時間是個持續增長的向量,即老時間t1肯定小於新時間t2,新時間t2也小於最新的時間t3,而且t1必定會漸進增長到t2和t3。除了少數商業資料庫服務自帶時鐘源以外,大部分業務服務對系統時間是盲目信任,不相信t1會越過t2直接達到t3(即斷檔躍變),而t2減去t1會得到負數或者0(即時鐘停滯和回逆)。
第四. NTPD的優勢
如果我們用ntpdate同步時間,可能會帶來時間的斷檔躍變或者停滯和回逆。時間不穩會威脅到的程序健壯性和業務安全性,甚至部分程序崩潰的稀里糊塗。
ntpdate只是個命令不是服務,它對遠端時鐘源是盲目信任;假設一個根NTP服務不穩定,所有的伺服器獲得了錯誤的時間,雖然現在業務層可以包容異常,不會出現算出負利息或倒扣費的情況,但業務混亂是免不了的。我們就說聯機調試分散式日誌,幾個節點的時間有錯可能日誌就看不懂了。
NTPD服務做時間調整會有效減少這類情形,它不是簡單的龜速調整時間,而是有柔性時間調整策略,讓時間線的躍變和調整盡量少影響業務(詳情見附錄實驗);也不會盲目信任遠端時鐘源,甚至固執的拒絕同步時間。NTPD服務相信本機時刻有可能不對,但不會忽快忽慢甚至停滯,NTPD通過多次收發包選擇權威穩定的時間源,算出雙方間的網路延遲,然後才會採信新的時刻進行時鐘同步。
第五.誤解的根源和影響
因為NTPD不盲從其他時間源,讓老一輩IT人會留下NTPD不好用、不靠譜的誤會。2005年個人測試用虛擬機的時間經常走慢,到2010年虛擬機還要防範時間停滯的Bug。即使你用物理機投入生產,網路延遲仍然不確定,且要觀測NTPD同步效果需要時間。我們很難成功調試NTPD服務,會裝NTPD又沒有會裝LAMP可以拿去吹牛,時間長了NTPD服務就背上黑鍋了。
真有TOP10的互聯網公司和上億國家級項目里用ntpdate+crond,上一代架構師為什麼有這個誤會無人深究,下一代人將誤會固化為偏見,新一代人將偏見神化為迷信。
但無論誤會、偏見還是迷信,時間躍變、回退和停滯對應用健壯性和業務安全性的威脅始終存在,時間不僅僅是我玩遊戲時用的魔法,忽視問題並不能掩埋問題。
第六.見微知著和防微杜漸
我講NTPD和裸纖並不是為賣弄知識,也不是為做偏門科普,而是希望進階工程師們多考慮一下如何規避這類誤會?我們在做技術工作時,是不是只關注客戶和同事能提出的需求?客戶永遠不知道裸纖的物理特性,同事也不會知道時間也能錯誤和波動,他們能說清楚業務邏輯就不錯了。
把所有的精力都用到做業務邏輯,你只是個編程語言翻譯機而已;自己主動觀測技術環境依賴,有資格有能力做出技術選型決策,才是給Coder群集做技術校準的人。即使你不想做技術決策人和管理者,多懷疑和觀察環境,也能少些溝通成本,少走一些冤枉路,多一份自信和自尊。
------附錄,NTPD時間躍變不遺漏Crond的實驗------
1. 當前系統時間是 23點35分。
[root@instance-6ot6pwji ~]# date
Wed Nov 8 23:35:02 CST 2017
2. 我故意把系統時間調整到 23點32分;注意這個時間不能和真實時間差太久,差太久了ntpd認為網路時鐘源不權威,很久都不會進行時間同步。
[root@instance-6ot6pwji ~]# date-s 23:32:00
Wed Nov 8 23:32:00 CST 2017
3.做好日誌列印的crond,設置每分鐘列印一次時間,到第35分鐘時列印一次時間:
注意不能時間太近,因為crond服務可能還沒來得及載入新配置,ntpd服務也沒完成時間校準,這些字我必須搶在2分鐘內打完。
[root@instance-6ot6pwji ~]#crontab -l
*/1 * * * * echo"current" `date` >> /tmp/clock.log
### 上文是一個檢證時間戳
35 * * * * echo "Hit time!!!" `date` >>/tmp/clock.log
### 這是一個命中測試時間戳。
4. 用watch ntpq -p 查看ntpd對時鐘源的校準狀態。
5. 如果在35分之前時鐘校準完成,比如說現在時間是23點37分,則,/tmp/clock.log 里有個23點37分的時間戳。
[root@instance-6ot6pwji ~]# cat/tmp/clock.log
current Wed Nov 8 23:37:14 CST 2017
Hit time!!! Wed Nov 8 23:37:14 CST 2017
current Wed Nov 8 23:37:14 CST 2017
current Wed Nov 8 23:37:14 CST 2017
6. 如果到了本地第34分(實際第38分)ntpd還沒完成時間同步,因為馬上和crontab里的35分打日誌撞車了,可以快速修改crontab -e ,把列印hit日誌的時間改為37分。中間隨著時間的推遲可能多次修改hit的時間點,但不影響測試結果。
這次實驗好玩的地方在於:
我定個35分的任務計劃,結果ntpd將時間躍變越過了第35分直接到了37分,但該任務計劃仍然執行了。而從執行輸出結果是37分來看,這不是小步快跑的踩過35分,而是第35分被越過了不存在。
這個實驗里坑很多,個人要和時間賽跑才能完成實驗,我做了8次實驗成功了3次,每次都等了10分鐘以上。這個實驗也不夠嚴謹,我只是拿crond做實驗,我在夢裡記得其他有歷史守規矩的程序也能和ntpd聯動,但我沒時間做實驗了,也希望有朋友能幫我答疑解惑。
----附錄2,網上能找到一個寫NTPD和ntpdate的水文和本文內容有些類似,那個是我多年以前寫的,不是借鑒和抄襲,嚴肅臉。
----附錄3,於總的公司叫聯雲易通,就是做雲交換和混合雲的,落地產品就是能統管多個公有雲、私有雲的多雲管理軟體,以及往一個個機房拉專線。算個小廣告小尾巴,有業務需求的我可以幫轉。。
推薦閱讀: