【W(wǎng)OTD】京東云鄭永寬:京東云自動(dòng)化運(yùn)維體系構(gòu)建
原創(chuàng)【51CTO.com原創(chuàng)稿件】
2017年12月01-02日,由51CTO主辦的WOTD 2017全球軟件開(kāi)發(fā)技術(shù)峰會(huì)在深圳中洲萬(wàn)豪酒店召開(kāi)。秉承專注技術(shù)、服務(wù)技術(shù)人員的理念,自2012年以來(lái),WOT品牌大會(huì)成功舉辦了十四屆,積累了大量的技術(shù)專家資源,獲得了廣大IT從業(yè)者和技術(shù)愛(ài)好者的一致認(rèn)可,成為了業(yè)界重要的技術(shù)分享交流平臺(tái)以及人脈拓展平臺(tái)。
本次會(huì)議分為10個(gè)技術(shù)主題,分別是:編程語(yǔ)言與框架,大數(shù)據(jù)系統(tǒng)架構(gòu)設(shè)計(jì)、微服務(wù)與容器技術(shù)、前端開(kāi)發(fā)實(shí)戰(zhàn)、物聯(lián)網(wǎng)(IOT)技術(shù)、軟件性能優(yōu)化、深度學(xué)習(xí)與智能應(yīng)用開(kāi)發(fā)、創(chuàng)新運(yùn)維探索、技術(shù)架構(gòu)遇到業(yè)務(wù)架構(gòu)、CTO訓(xùn)練營(yíng)。51CTO作為本次大會(huì)的主辦方,將全程圖文直播報(bào)道與后期視頻展示這場(chǎng)盛宴。
12月01日上午WOTD2017主會(huì)場(chǎng),京東云資深架構(gòu)師鄭永寬進(jìn)行了主題為《京東云自動(dòng)化運(yùn)維體系構(gòu)建》的精彩演講。以下是演講實(shí)錄,讓我們先睹為快!
大家了解的京東可能是京東電商,事實(shí)上在京東有四個(gè)最主要的平臺(tái):電商、物流、金融和保險(xiǎn)。京東有技術(shù)設(shè)施、主機(jī)網(wǎng)絡(luò),上面還有一些中間件和PaaS服務(wù),而最主要是我們的電商和物流。
說(shuō)到京東云,我們最看重是運(yùn)維,需要自動(dòng)化運(yùn)維平臺(tái)。對(duì)此有幾個(gè)關(guān)鍵問(wèn)題,主要是圍繞安全、部署變更、網(wǎng)絡(luò)管理、監(jiān)控管理......利用自動(dòng)化運(yùn)維提高平臺(tái)架構(gòu)穩(wěn)定性和人員的開(kāi)發(fā)效率。
京東云自動(dòng)化運(yùn)維基礎(chǔ)組件
京東云運(yùn)維的挑戰(zhàn)是什么?其實(shí)京東云不單是提供PaaS服務(wù),而且還提供一些SaaS服務(wù)??蛻舻臉I(yè)務(wù)如何保持穩(wěn)定?其實(shí)是非常富有挑戰(zhàn)的問(wèn)題。在這個(gè)過(guò)程中,我們大概的經(jīng)歷是,首先從運(yùn)維技術(shù)手,比如服務(wù)署、調(diào)度系統(tǒng)、客戶端管理系統(tǒng)等等,在這個(gè)基礎(chǔ)上把客戶端搭建起來(lái),有了客戶端體系和技術(shù)理念才能構(gòu)建剛才說(shuō)的這些部署系統(tǒng),還有發(fā)布系統(tǒng)和任務(wù)調(diào)度系統(tǒng),以及監(jiān)控系統(tǒng)等等。最終,我們把這些能力SaaS化,從而支撐更多的人做這些事情,從而更好地服務(wù)京東云客戶。
實(shí)現(xiàn)自動(dòng)化運(yùn)維的***件事就是配置管理。對(duì)于服務(wù)樹(shù)來(lái)說(shuō)我們要解決什么問(wèn)題呢?一是服務(wù)的組織架構(gòu)的問(wèn)題,因?yàn)槲覀兯械姆?wù)是要有它的依賴,我們要知道它在哪里用,誰(shuí)在用,可能有什么用。二是我們所有的技術(shù)管理,對(duì)大公司或者京東這種體量的公司來(lái)說(shuō),機(jī)器的量是在十萬(wàn),十萬(wàn)量級(jí)如何知道一臺(tái)機(jī)器在當(dāng)前是怎么樣的狀態(tài)?怎么用?我們需要很多組織。三是角色管理與基于角色的權(quán)限控制。還有其他的大數(shù)據(jù),比如機(jī)型、在哪個(gè)機(jī)房、當(dāng)前是什么狀態(tài)。最主要的東西其實(shí)在于我們的服務(wù)在系統(tǒng)中是同步的,我們知道這個(gè)服務(wù)在哪個(gè)機(jī)器上,有哪些實(shí)例,屬于哪個(gè)APP,中間的邏輯過(guò)程又是什么樣,對(duì)外提供服務(wù)的時(shí)候,它怎么樣告訴別人我需要什么樣的權(quán)限,以及我需要什么樣的監(jiān)控。我們所有的東西都是構(gòu)建在服務(wù)器上。
Naming Service是解決服務(wù)之間的解耦關(guān)系和服務(wù)關(guān)聯(lián)關(guān)系,還有服務(wù)對(duì)外提供的窗口。右邊的圖展示服務(wù)樹(shù)與名字服務(wù)示意圖,***層展示了從應(yīng)用到實(shí)例關(guān)系的解耦,這里面還有它的客戶端需要的。最主要的文件就是任務(wù)調(diào)度,不管做什么事情,比如我們一起做一個(gè)操作或者做上線、部署或者文件分發(fā),這些系統(tǒng)都需要調(diào)度目標(biāo)機(jī)器做相應(yīng)的事情,也就是說(shuō)需要對(duì)指定的機(jī)器按照指定的策略做指定的命令,這個(gè)過(guò)程其實(shí)是需要比較大的挑戰(zhàn)。因?yàn)檫@是實(shí)時(shí)的,同時(shí)又是大批量的,又是同時(shí)存在的,所以它需要比較好的系統(tǒng)支撐,同樣能批量使用。還有策略,你需要什么樣的并發(fā)度,比如我需要一百個(gè)機(jī)器,一百個(gè)機(jī)器都不一定是同時(shí)的。最簡(jiǎn)單的就是上線,我不會(huì)把一百個(gè)機(jī)器都上線,可能一批一批,這屬于并發(fā),以及每次并發(fā)是怎么做的。我做上線或者做任務(wù)調(diào)度,我當(dāng)前需要做幾個(gè),成功還是失敗,如果成功或者失敗,下面的邏輯是什么樣的,以及我做到什么程度業(yè)務(wù)算是成功或者超時(shí)。因?yàn)檫@個(gè)底層架構(gòu)上,它構(gòu)建了很多業(yè)務(wù),它的調(diào)度邏輯是一樣的。
同時(shí)所有的執(zhí)行需要可追訴,即需要知道什么人什么時(shí)候做什么操作,這對(duì)安全性或者規(guī)范性來(lái)講是非常重要的。而且單機(jī)輸出怎么樣,我需要定位什么問(wèn)題,如果出現(xiàn)故障,這是任務(wù)調(diào)度系統(tǒng),這個(gè)基礎(chǔ)上可以做很多事。調(diào)度的邏輯則是基于服務(wù)樹(shù)和Naming Service。
第三個(gè)是做監(jiān)控,監(jiān)控?zé)o非是從數(shù)據(jù)采集到數(shù)據(jù)的匯聚到存儲(chǔ)處理的過(guò)程。這里面有一個(gè)很重要的概念是監(jiān)控的數(shù)據(jù)層,不同于我們平時(shí)見(jiàn)的,它是時(shí)序性的。這里面需要構(gòu)建時(shí)序存儲(chǔ)。意思是收集的監(jiān)控點(diǎn)存儲(chǔ)起來(lái),同時(shí)我們需要每次查詢,要查詢大量的、很多的數(shù)據(jù)點(diǎn)。還有很重要的是“讀少寫(xiě)多”的過(guò)程,而且它的“寫(xiě)”(寫(xiě)入數(shù)據(jù))相對(duì)比較均衡,而“讀”(讀取數(shù)據(jù))是有突發(fā)性的。比如看一個(gè)監(jiān)控,或者看監(jiān)控狀態(tài),是隨時(shí)做的。寫(xiě)是10秒或者1秒或者1分鐘做采集,它是寫(xiě)比較頻發(fā)的過(guò)程,讀比較突兀的過(guò)程,所以需要做讀寫(xiě)分離。
我們基于ES做了TSPD,封裝兩個(gè)東西,一個(gè)是對(duì)熱點(diǎn)數(shù)據(jù),比較重要的數(shù)據(jù)或者實(shí)時(shí)的數(shù)據(jù)存在redis,對(duì)這種歷史數(shù)據(jù)會(huì)有ES,然后再封裝,從而做到這種所謂的讀寫(xiě)分離。我們的數(shù)據(jù)是雙寫(xiě)的過(guò)程,保證數(shù)據(jù)的高可用。自動(dòng)抽樣,監(jiān)控?cái)?shù)據(jù)還有一個(gè)特點(diǎn),有時(shí)候查他是頻發(fā),但是查詢會(huì)有很大的跨度,比如一年的跨度或者一個(gè)月的跨度,因?yàn)槲覀儾杉臄?shù)據(jù)點(diǎn)是10秒或者1秒或者1分鐘,如果查一個(gè)月或者一年甚至更長(zhǎng)時(shí)間,我肯定不會(huì)把所有數(shù)據(jù)點(diǎn)查出來(lái),如果都查出來(lái),這個(gè)查詢數(shù)據(jù)量太龐大,不易實(shí)現(xiàn)。所以我們寫(xiě)的時(shí)候就自動(dòng)做了抽樣,我們查15天以上的數(shù)據(jù),把這些數(shù)據(jù)點(diǎn)會(huì)每分鐘或者每小時(shí)做聚合,然后再放在里面,再查一個(gè)月的數(shù)據(jù),通過(guò)自適應(yīng)的路由,可以查到一小時(shí)的數(shù)據(jù),這樣檢測(cè)有限,你的數(shù)據(jù)庫(kù)或者業(yè)務(wù)系統(tǒng)速度就會(huì)比較快。第二是我們的數(shù)據(jù)實(shí)時(shí)處理,這里面比較重要的特性是多級(jí)化部署,是基于JNS調(diào)度的過(guò)程,就是我們講的多維度實(shí)時(shí)計(jì)算。
以上這些技術(shù)組件還有客戶端,所有的業(yè)務(wù)都需要客戶端,對(duì)于京東這種體量的公司來(lái)說(shuō),我們的監(jiān)控、初始化等都是全網(wǎng)部署。大家想象一下,十萬(wàn)量機(jī)器加載的部署,如果每次的升級(jí)或者每次的上線都需要操作這十幾萬(wàn)臺(tái)機(jī)器,這個(gè)事情簡(jiǎn)直是不可想象的事情。還有另外一個(gè)問(wèn)題,如果是維護(hù)十幾萬(wàn)機(jī)器的Agent,環(huán)境比較復(fù)雜,多個(gè)IP,什么時(shí)候出現(xiàn)什么問(wèn)題沒(méi)有辦法處理,按照單一維度處理,這個(gè)東西就沒(méi)有辦法做了。Agent有一個(gè)很重要的事就是資源超限,比如監(jiān)控Agent,它做了一些計(jì)算,把當(dāng)前的計(jì)算打死了,而監(jiān)控又是服務(wù)外的東西,這時(shí)候因?yàn)楸O(jiān)控這個(gè)事情影響了本身服務(wù)的穩(wěn)定,這也是有可能的。Agent做的事情,一是我們負(fù)責(zé)所有的Agent的部署和升級(jí)。第二個(gè)事情是維護(hù)這些Agent的存活,它掛的時(shí)候我知道哪臺(tái)機(jī)器上的Agent什么時(shí)候掛了,我需要做什么動(dòng)作把它拉起來(lái)。第三個(gè)是資源超限守護(hù)。四則是分級(jí)發(fā)布,講一下它的實(shí)現(xiàn)。我們裝技術(shù)的時(shí)候會(huì)把Agent裝起來(lái),一臺(tái)機(jī)器進(jìn)入一個(gè)服務(wù),管理的Agent會(huì)在我們的服務(wù)器注冊(cè),告訴它當(dāng)前在某個(gè)分機(jī)房,某個(gè)Agent的版本是什么樣的,這樣他自然就會(huì)知道:你在加入服務(wù)的時(shí)候,它知道你屬于哪個(gè)機(jī)房、屬于哪個(gè)服務(wù),我就告訴你Agent期望的版本是什么樣的。這時(shí)候他自然把包下下來(lái),這時(shí)候你的Agent就知道***的版本是什么,這時(shí)候我們就可以實(shí)現(xiàn)個(gè)過(guò)程。這是另外一個(gè)客戶端體系。
我們構(gòu)建完這些客戶端體系或者組件,再構(gòu)建我們的部署和發(fā)布任務(wù)就比較簡(jiǎn)單。大概介紹一下我們應(yīng)用的部署系統(tǒng),應(yīng)用的部署系統(tǒng)不單單只是做應(yīng)用部署,也做了一些服務(wù)的維護(hù)和資源的管理,甚至還有接入的過(guò)程。我們做了幾個(gè)事情:一是往前做了編譯構(gòu)建,往后做了瀏覽接入。這個(gè)Agent有一個(gè)核心的訴求,是需要跨平臺(tái)。京東面臨的環(huán)境比較復(fù)雜,我們有虛機(jī)、Docker、物理機(jī),那我們的調(diào)度需要支持所謂的物理機(jī)和虛擬機(jī)和Docker。第二個(gè)是我們需要把之前說(shuō)的很多操作融合到一起,同時(shí)我們能夠做到容錯(cuò),這里面是不允許一臺(tái)或者單臺(tái)出現(xiàn)故障,從而引起服務(wù)故障,同時(shí)這些服務(wù)有問(wèn)題的時(shí)候,他們自發(fā)現(xiàn)。而且京東很重要的場(chǎng)景是促銷,比如雙十一。你能快速擴(kuò)容,從而能夠去應(yīng)對(duì)這種比較大的流量高峰或者下降。
京東云自動(dòng)化運(yùn)維部署介紹
部署分兩種,一是所謂的基于Docker的鏡像輸出,二是基于傳統(tǒng)部署的物理機(jī)或者虛機(jī)的包輸出。從編譯構(gòu)建到自身做的產(chǎn)品庫(kù),這里面有代碼包和代碼項(xiàng),通過(guò)部署服務(wù)和構(gòu)建剛才調(diào)度系統(tǒng)上的部署服務(wù)做發(fā)布,然后在物理機(jī)和容器上都可以做。部署完之后是運(yùn)行,維護(hù)運(yùn)行之后,尤其對(duì)鏡像日志需要收集起來(lái),然后做分析,做了日志服務(wù)。前臺(tái)做流量接入,中間做了一個(gè)LB網(wǎng)絡(luò),最主要的一個(gè)點(diǎn)是這個(gè)部署分兩種,根據(jù)你的服務(wù)需要做它事實(shí)的升級(jí)。這里面所有的服務(wù)又是基于服務(wù),它其實(shí)不需要關(guān)心當(dāng)前的服務(wù)是怎么樣的過(guò)程,以及它這個(gè)過(guò)程是怎樣實(shí)現(xiàn)的,因?yàn)槲覀冎恍枰?dāng)前需要什么東西以及容量是什么樣,以及我們給你分配了什么樣的資源。
京東云自動(dòng)化運(yùn)維監(jiān)控系統(tǒng)
講完部署講一下監(jiān)控系統(tǒng),監(jiān)控最主要大家比較明白,剛才我們的例子,大家迫切需求是恢復(fù):什么時(shí)候恢復(fù)?***個(gè)事情要做的是什么時(shí)候發(fā)現(xiàn),即能夠在***時(shí)間發(fā)現(xiàn)問(wèn)題,這是恢復(fù)很重要的一套。第二個(gè)是能怎么樣快速定位這個(gè)問(wèn)題,然后知道在哪里。第三步我們能夠去自動(dòng)調(diào)度一些或者提前準(zhǔn)備好的預(yù)案或者自動(dòng)準(zhǔn)備一些之前所謂通過(guò)的算法,然后把這個(gè)故障給它自動(dòng)調(diào)度恢復(fù)或者人工能夠快速出一些預(yù)案。他面臨的環(huán)境應(yīng)該說(shuō)是一樣的,它是比較復(fù)雜的環(huán)境,需要面臨虛機(jī)、Docker,最主要的事情是需要部署聯(lián)動(dòng),我們?cè)谏暇€過(guò)程中,有些東西是分級(jí)發(fā)布的,對(duì)于分級(jí)發(fā)布的過(guò)程中,不能停服。
其實(shí)這些故障本身又是一個(gè)事件,你怎么把這個(gè)事件存儲(chǔ)起來(lái),以及方便查詢,從而提供給別人決策的依據(jù)。上一個(gè)事件影響下一步,你有很好的事件庫(kù),讓上游知道下游什么時(shí)候出現(xiàn)故障,這對(duì)監(jiān)控很有幫助。然后做離線處理,得到比較好的辦法,反過(guò)來(lái)反饋計(jì)算和報(bào)警。
我們能有什么樣的數(shù)據(jù)展示,可能需要趨勢(shì)圖或者儀表盤(pán)或者Dashbord,這是我們需要研究的。這些事件或者報(bào)警或者上線有什么比較好的方式展現(xiàn)給外部看,這也是很重要的。我們采集,從Agent采集到自定義的日志,以及日志的外部、外網(wǎng)在全國(guó)的CDN的點(diǎn)接受探測(cè),這些方式從而決定我們上層構(gòu)建起很多的監(jiān)控模式在。
在這個(gè)基礎(chǔ)上我們構(gòu)建了京東云監(jiān)控體系,我們把監(jiān)控分為四個(gè)層次,或者說(shuō)四個(gè)類型:一是基礎(chǔ)監(jiān)控,就是我們所謂的機(jī)器層面,CPU、內(nèi)存、磁盤(pán)等,比較簡(jiǎn)單,不需要用戶去配置的,它會(huì)自采集。在機(jī)器上,機(jī)器是好的時(shí)候就解決服務(wù)的監(jiān)控,這個(gè)解決方案比較多一些,大家做得比較多。第二個(gè)是怎么解決服務(wù)的監(jiān)控,我們需要存活監(jiān)控,比如進(jìn)程和端口監(jiān)控,還有語(yǔ)義監(jiān)控。
存活監(jiān)控基礎(chǔ)上就是服務(wù)層面對(duì)外的表現(xiàn)是什么,我們的四大核心指標(biāo),解決服務(wù)性能或者有異常,確定所謂的邊境問(wèn)題,這里面通過(guò)日志來(lái)解決性能的監(jiān)控。再類似黑盒,從用戶側(cè)看服務(wù),發(fā)現(xiàn)問(wèn)題。從用戶的角度,因?yàn)楹芏鄷r(shí)候我們看服務(wù)是好的,但是服務(wù)對(duì)外表現(xiàn)不好。很簡(jiǎn)單的例子,所有服務(wù)指標(biāo)OK,但是網(wǎng)站不能訪問(wèn),這是一個(gè)問(wèn)題,對(duì)京東來(lái)說(shuō)這是非常嚴(yán)重的,這時(shí)候最終你會(huì)發(fā)現(xiàn)你的流量在掉,或者你的訂單在掉,這也是很嚴(yán)重的問(wèn)題,就是說(shuō)我們從業(yè)務(wù)的角度,從用戶層面做黑盒的檢測(cè)。技術(shù)監(jiān)控的機(jī)器,從采集到計(jì)算到報(bào)警到機(jī)器連通性都是自動(dòng)的,這些是不需要用戶做任何事情的,就可以把這些東西采集。這些報(bào)警會(huì)給一些默認(rèn),比如我大概發(fā)現(xiàn)一臺(tái)機(jī)器cpu.idle小于10%,我們看它屬于哪個(gè)服務(wù),從服務(wù)知道這個(gè)是誰(shuí)維護(hù),誰(shuí)維護(hù)就知道給誰(shuí)報(bào)警,給誰(shuí)報(bào)警之后,我大概需要做什么樣的數(shù)據(jù)。我們做這個(gè)聯(lián)動(dòng)。上線過(guò)程中,這個(gè)機(jī)器的報(bào)警需要做什么評(píng)比,這是技術(shù)層面的。存活監(jiān)控主要是看基礎(chǔ)日志是不是存活,當(dāng)前的技術(shù)消耗是什么樣。再就是看端口是不是OK的。
性能監(jiān)控方面,主要關(guān)注服務(wù)對(duì)外的指標(biāo),這個(gè)指標(biāo)怎么來(lái)的呢?一般是日志。這個(gè)格式比較統(tǒng)一,我們?nèi)ヒ?guī)定和規(guī)范或者約定一個(gè)所謂的日志格式,這時(shí)候很容易把這些值分出來(lái),其實(shí)本身是多維度的,可以發(fā)現(xiàn)京東的流量是平穩(wěn)的過(guò)程,但是底下可能比較波動(dòng),我們可能發(fā)現(xiàn)總體流量平衡,但是某個(gè)時(shí)段,比如山東聯(lián)通的流量不OK,多維度的聚合你可能發(fā)現(xiàn)這些所謂比較細(xì)微的問(wèn)題。這個(gè)采集方式是從日志里抓,還有一種方式是存續(xù)或者用戶自己對(duì)我們暴露,然后通過(guò)一些方式把這些值輸出出來(lái)。
業(yè)務(wù)監(jiān)控,從用戶側(cè)看服務(wù)是否OK,用戶側(cè)看服務(wù)最主要,能模擬全國(guó)各地用戶做訪問(wèn),發(fā)現(xiàn)非運(yùn)營(yíng)商或者分機(jī)房訪問(wèn)的情況,這是用外網(wǎng)或者自定義的方式,我們用各種方式模擬云操作,監(jiān)控云,模擬一個(gè)用戶登錄監(jiān)控云網(wǎng)站,然后購(gòu)買(mǎi)一個(gè)主機(jī),部署一個(gè)鏡像,然后做一個(gè)發(fā)布,這些過(guò)程都是OK的,如果監(jiān)控層OK,理論上用戶也是OK,從用戶的角度可以發(fā)現(xiàn)一些問(wèn)題,先于用戶發(fā)現(xiàn)問(wèn)題很重要,先于他發(fā)現(xiàn),就可以提前處理,這就不是故障,只是小case。
總結(jié)一下,我們做京東的監(jiān)控自動(dòng)化的平臺(tái),接下來(lái)是將技術(shù)實(shí)現(xiàn)服務(wù)化,做全生命周期的DevOps,尤其我們有這么多的SaaS客戶,幫他們保證效率,節(jié)約成本,提供解決方案,幫助用戶解決問(wèn)題。
謝謝!
————————
以上是51CTO.com記者從一線為您帶來(lái)的精彩報(bào)道。后續(xù)我們還有更加精彩的獨(dú)家報(bào)道,敬請(qǐng)關(guān)注。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】






























