2018-03-16 10:25:36 來(lái)源:高效運(yùn)維
運(yùn)小宇 百度高級(jí)研發(fā)工程師
什么是命令
首先回顧一下“命令”的具體含義,發(fā)令以使之,謂發(fā)令而使其做某事,這是“命令”一詞的基礎(chǔ)釋義。從這里我們可以看命令的三個(gè)最基本的要素:命令內(nèi)容(令)、命令傳遞(發(fā))、命令執(zhí)行(使)。如果將這三要素限定在服務(wù)器上,它們又是如何運(yùn)作的呢?
圖1 windows與linux下的命令
命令內(nèi)容(令)
無(wú)論是windows還是linux操作系統(tǒng),都會(huì)提供相應(yīng)的CLI(不要吐槽windows的CLI難用),供使用者交互執(zhí)行命令或運(yùn)行批處理腳本。仔細(xì)觀察,所有命令行都有一個(gè)相同的特點(diǎn):固定詞+選項(xiàng)+參數(shù),無(wú)出其右。因CLI伴隨著操作系統(tǒng)的誕生,且命令行處理又是一個(gè)復(fù)雜但相似的過程,因此各種語(yǔ)言也都提供了相應(yīng)的庫(kù)支持,如C語(yǔ)言提供了getopt/getopt_long等函數(shù),C++的boost提供了Options庫(kù),shell中處理此事的是getopts和getopt。
命令傳遞(發(fā))
命令傳遞有兩種方式,一種是文件形式,將bat/shell腳本上傳到服務(wù)器然后執(zhí)行。另外一種就是交互式,通過telnet/ssh等方式遠(yuǎn)程連接服務(wù)器后,直接在命令行界面執(zhí)行。雖然從形式上我們將命令傳遞分為了兩種方式,但從本質(zhì)上來(lái)說(shuō),服務(wù)器上的命令傳遞,都沒有逃脫網(wǎng)絡(luò)傳輸這個(gè)過程。
命令執(zhí)行(使)
對(duì)于操作系統(tǒng)來(lái)說(shuō),命令的執(zhí)行,其實(shí)就是啟動(dòng)一個(gè)進(jìn)程并傳遞相應(yīng)的參數(shù),運(yùn)行完成后得到相應(yīng)的結(jié)果。這里我們并不關(guān)心進(jìn)程如何創(chuàng)建,PBC的結(jié)構(gòu)如何等細(xì)節(jié),我們只關(guān)心命令進(jìn)程的啟動(dòng)方式以及結(jié)果的獲取方式。
為什么要執(zhí)行命令
在分布式產(chǎn)品的開發(fā)維護(hù)過程中,有三個(gè)主題是無(wú)法繞過的,分別是配置管理、部署升級(jí)和監(jiān)控采集。
配置管理
配置管理的目標(biāo)是為了標(biāo)識(shí)變更、控制變更、確保變更正確實(shí)現(xiàn)并向其他有關(guān)人員報(bào)告變更。從某種角度講,配置管理是一種標(biāo)識(shí)、組織和控制修改的技術(shù)。通常情況下,配置管理都會(huì)統(tǒng)一部署配置服務(wù)器來(lái)同步所有節(jié)點(diǎn)的配置。但是在開發(fā)測(cè)試過程中,總會(huì)出現(xiàn)臨時(shí)修改某個(gè)或某一批節(jié)點(diǎn)的配置的情況,這時(shí)通過人工逐個(gè)登錄來(lái)完成修改顯然是不太可能的。
部署升級(jí)
DevOps的概念如今日趨流行,部署升級(jí)越發(fā)成為開發(fā)運(yùn)維過程中重要的一環(huán),頻繁的交互意味著頻繁的部署。部署過程可以拆解為兩個(gè)小的步驟,一是新軟件包的上傳,二是服務(wù)進(jìn)程的重新啟動(dòng)。服務(wù)進(jìn)程的重新啟動(dòng)不必多說(shuō),軟件包的上傳可能有多種方式,如sftp的集中式,p2p的點(diǎn)對(duì)點(diǎn)式等。
監(jiān)控采集
軟件運(yùn)維過程需要時(shí)刻監(jiān)控系統(tǒng)及業(yè)務(wù)軟件的運(yùn)行狀態(tài),各種運(yùn)維決策都是以這些數(shù)據(jù)為依據(jù)進(jìn)行的。隨著自動(dòng)化運(yùn)維的發(fā)展,很多運(yùn)維動(dòng)作都從人工執(zhí)行變?yōu)榱俗詣?dòng)執(zhí)行,自動(dòng)執(zhí)行的決策過程更是需要采集大量的實(shí)時(shí)信息(前期文章《百度大規(guī)模時(shí)序數(shù)據(jù)存儲(chǔ)》中介紹的TSDB就是為了解決這些數(shù)據(jù)的存儲(chǔ)問題而研發(fā)的)。監(jiān)控?cái)?shù)據(jù)的來(lái)源主要分兩種,一種是通過業(yè)務(wù)軟件提供的接口直接讀取狀態(tài)數(shù)據(jù),另一種是通過日志/進(jìn)程狀態(tài)/系統(tǒng)狀態(tài)等(如使用grep提取日志,通過ps查詢進(jìn)程狀態(tài),通過df查詢磁盤使用等)方式間接查詢。
無(wú)論是配置管理、部署變更還是監(jiān)控采集,都有一個(gè)共同的目的 :控制服務(wù)器。在現(xiàn)階段,要想對(duì)服務(wù)器進(jìn)行控制,離不開“在大量服務(wù)器上執(zhí)行命令并收集結(jié)果”這一基礎(chǔ)能力,這也是今天我們的主題“如何執(zhí)行一條命令”的意義所在。
面臨的困難
命令行的三要素,也是如何執(zhí)行一條命令行面對(duì)的三個(gè)問題,如前文所述,對(duì)于單機(jī)環(huán)境來(lái)說(shuō),這三個(gè)問題在前人的努力下已經(jīng)被很好的解決??墒侨绻趲资f(wàn)臺(tái)機(jī)器上每天執(zhí)行幾十億條命令,同時(shí)保證時(shí)效性,保證執(zhí)行成功率,保證結(jié)果正確收集,保證7*24小時(shí)穩(wěn)定運(yùn)行,就不是一件簡(jiǎn)單的事情了。所謂遠(yuǎn)行無(wú)輕擔(dān),量大易也難,在構(gòu)建這樣的執(zhí)行系統(tǒng)的過程中要面臨諸多困難,此處舉幾個(gè)突出的例子如下:
信息存儲(chǔ)問題:為了支持水平擴(kuò)展,需要高效的內(nèi)存數(shù)據(jù)庫(kù)作為緩存。為了做到執(zhí)行命令的可追溯、可統(tǒng)計(jì),需要對(duì)執(zhí)行過的命令信息持久化。日均幾十億的熱數(shù)據(jù),年均上萬(wàn)億的冷數(shù)據(jù),需要仔細(xì)選擇存儲(chǔ)方案。
任務(wù)調(diào)度問題:為了達(dá)到在任意多臺(tái)服務(wù)器上執(zhí)行命令的要求,需要確定何時(shí)分發(fā)命令、何時(shí)回收結(jié)果以及怎么樣的并發(fā)度批量下發(fā)。
消息傳輸問題:為了保證命令高效正確送達(dá)目標(biāo)服務(wù)器,需要構(gòu)建一個(gè)可靠的命令傳輸網(wǎng)絡(luò),使命令信息在準(zhǔn)確送達(dá)的前提下保障傳輸?shù)目煽颗c高效,畢竟百度的幾十萬(wàn)臺(tái)服務(wù)器分布在世界各地。
代理執(zhí)行問題:為了更好的處理權(quán)限、單機(jī)并發(fā)等單機(jī)執(zhí)行問題,需要在目標(biāo)機(jī)構(gòu)建執(zhí)行代理,以應(yīng)對(duì)單機(jī)的復(fù)雜執(zhí)行環(huán)境。
圖2 簡(jiǎn)單問題放大后也變得困難
百度目前擁有分布在世界各地的幾十萬(wàn)臺(tái)服務(wù)器,并且隨著業(yè)務(wù)的不斷擴(kuò)張,這個(gè)數(shù)字還在持續(xù)增長(zhǎng),構(gòu)建一個(gè)高效穩(wěn)定通用可擴(kuò)展的命令描述、傳遞、執(zhí)行系統(tǒng)在這樣的環(huán)境中有著重要的現(xiàn)實(shí)意義。 對(duì)百度各產(chǎn)品線的用戶來(lái)說(shuō),這樣的一個(gè)系統(tǒng),最基礎(chǔ)的要求是:執(zhí)行高效,控制靈活,擴(kuò)展方便 。
執(zhí)行高效:
單機(jī)執(zhí)行,要求能夠達(dá)到秒級(jí)命令下發(fā)/執(zhí)行/結(jié)果收集。
集群執(zhí)行,要求支持同時(shí)在10萬(wàn)臺(tái)服務(wù)器上并行執(zhí)行,同時(shí)保證集群中每個(gè)機(jī)器達(dá)到單機(jī)執(zhí)行的性能。
控制靈活:
單機(jī)控制,要求支持暫停、取消、重做功能。
集群控制,要求支持暫停點(diǎn)功能,也即可以在執(zhí)行到某臺(tái)服務(wù)器時(shí)暫停,等待人工檢查確認(rèn)無(wú)問題后可繼續(xù)執(zhí)行。
擴(kuò)展方便:
支持插件,要求支持自定義執(zhí)行插件,用戶可編寫自己的插件執(zhí)行相應(yīng)操作。
支持回調(diào),要求支持自定義用戶回調(diào),如任務(wù)執(zhí)行失敗調(diào)用相應(yīng)回調(diào)接口。
除了以上的業(yè)務(wù)需求外,一個(gè)分布式系統(tǒng)的搭建,還要考慮可用性、可擴(kuò)展性、性能、一致性等方面的硬性要求。
如何解決
為了解決這個(gè)簡(jiǎn)單的難題,我們?cè)O(shè)計(jì)了如圖3所示的百度集群控制系統(tǒng)(Cluster Control System,簡(jiǎn)稱CCS系統(tǒng)),通過分離控制信息與執(zhí)行信息建立了兩級(jí)數(shù)據(jù)模型,結(jié)合命令執(zhí)行及機(jī)房部署特點(diǎn)建立了四級(jí)傳輸模型,通過三級(jí)守護(hù)方式建立了穩(wěn)定的執(zhí)行代理,在大規(guī)模服務(wù)器集群上解決了“命令三要素”問題。
圖3 百度集群控制系統(tǒng)架構(gòu)
截至目前,CCS系統(tǒng)已經(jīng)部署在全百度的所有機(jī)房中,用戶可以方便的在任意一臺(tái)機(jī)器上進(jìn)行秒級(jí)命令下發(fā)和結(jié)果收集,日均承載數(shù)億次來(lái)自各產(chǎn)品的接口調(diào)用。關(guān)于數(shù)據(jù)模型、傳輸模型、執(zhí)行代理這“分布式命令三要素”的設(shè)計(jì)及應(yīng)用,我們將在后續(xù)文章中詳細(xì)介紹。
免責(zé)聲明:本網(wǎng)站(http://www.www.gypb.net/)內(nèi)容主要來(lái)自原創(chuàng)、合作媒體供稿和第三方投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
本網(wǎng)站刊載的所有內(nèi)容(包括但不僅限文字、圖片、LOGO、音頻、視頻、軟件、程序等)版權(quán)歸原作者所有。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),請(qǐng)及時(shí)通知本站,予以刪除。
