打破1300多個(gè)應(yīng)用運(yùn)維自動(dòng)化的技術(shù)藩籬!
本文根據(jù)白海強(qiáng)老師的主題演講《蘑菇街應(yīng)⽤運(yùn)維體系建設(shè)及運(yùn)維⾃動(dòng)化實(shí)踐》整理而成。
本次分享的內(nèi)容主要分為以下三個(gè)方面:
- 蘑菇街技術(shù)架構(gòu)及運(yùn)維演進(jìn)
- 應(yīng)用運(yùn)維體系建設(shè)思路
- 應(yīng)用運(yùn)維自動(dòng)化實(shí)踐過(guò)程
蘑菇街技術(shù)架構(gòu)及運(yùn)維演進(jìn)
導(dǎo)購(gòu)期(2011年-2012年)
2011 年蘑菇街上線時(shí),它的主要業(yè)務(wù)是分享社區(qū),就是買(mǎi)家買(mǎi)了商品以后,把這個(gè)商品分享出來(lái)給大家。
2012 年開(kāi)始轉(zhuǎn)型商品導(dǎo)購(gòu),早期業(yè)務(wù)比較簡(jiǎn)單,相對(duì)設(shè)備比較少,基本上是一套業(yè)務(wù)代碼。運(yùn)維都是由具體的開(kāi)發(fā)同學(xué)自己去管理的,根本不需要專(zhuān)業(yè)的運(yùn)維人員。
轉(zhuǎn)型期(2013年-2014年)
從 2013 年開(kāi)始,我們開(kāi)始自建電商平臺(tái),從下單到支付整條鏈路開(kāi)始自主建設(shè)。
業(yè)務(wù)發(fā)生了變化,但是整個(gè)架構(gòu)沒(méi)有太大的變化,只是把中間層,數(shù)據(jù)層脫離出來(lái)了。設(shè)備增加了不少,從原來(lái)個(gè)位數(shù)增加到三位數(shù)了,還有網(wǎng)絡(luò)設(shè)備了。
業(yè)務(wù)這一塊是開(kāi)發(fā)自己維護(hù),運(yùn)維這邊主要建設(shè)了一些初級(jí)版的服務(wù)器管理系統(tǒng)、發(fā)布系統(tǒng)、監(jiān)控系統(tǒng)。
社交化電商(2015年-至今)
2015 年整個(gè)業(yè)務(wù)開(kāi)始發(fā)生變化了,集團(tuán)開(kāi)始從原來(lái)的 PHP 開(kāi)發(fā),逐步轉(zhuǎn)向了 Java 開(kāi)發(fā),從原來(lái)主站一套單一業(yè)務(wù)套代碼拆分成各個(gè)子業(yè)務(wù)系統(tǒng),整個(gè)架構(gòu)發(fā)生改變。
流量入口我們分成兩塊,無(wú)線端和 PC 端二塊接入。MWP 為無(wú)線網(wǎng)關(guān),其他 PC 端的流量通過(guò)代理層分發(fā)到各個(gè)不同的子業(yè)務(wù)系統(tǒng),部分系統(tǒng)實(shí)現(xiàn)前后端分離服務(wù)化,最底層為數(shù)據(jù)層。
從原來(lái)業(yè)務(wù)再新加業(yè)務(wù)需求,我們逐漸演變成目前擁有 1300 多個(gè)應(yīng)用系統(tǒng)。
業(yè)務(wù)快速發(fā)展給我們運(yùn)維帶來(lái)的挑戰(zhàn):
第一:1300 多個(gè)應(yīng)用如何進(jìn)行管理,這是一個(gè)大的問(wèn)題。不同業(yè)務(wù)如何區(qū)分?業(yè)務(wù)肯定要部署在具體服務(wù)器上面,不同業(yè)務(wù)部署不同服務(wù)器,業(yè)務(wù)和服務(wù)器之間的對(duì)應(yīng)關(guān)系如何管理?
還有業(yè)務(wù)部署環(huán)境,不同的業(yè)務(wù)運(yùn)行的環(huán)境有可能存在差異的,所以我們需要把業(yè)務(wù)與環(huán)境之間的對(duì)應(yīng)關(guān)系也要管理起來(lái)。
第二:早期業(yè)務(wù)之間可以依賴(lài)簡(jiǎn)單應(yīng)用代碼之間內(nèi)部的調(diào)用,拆分演變成應(yīng)用與應(yīng)用之間的依賴(lài)關(guān)系,如何管理業(yè)務(wù)之間的上下游依賴(lài)?如何快速定位排查問(wèn)題?這對(duì)我們排查工具帶來(lái)了挑戰(zhàn)和要求。
我們帶著這些問(wèn)題看一下運(yùn)維體系建設(shè)的思路。
應(yīng)用運(yùn)維體系建設(shè)思路
運(yùn)維核心理念
運(yùn)維工作圍繞這四個(gè)主題展開(kāi):
- 穩(wěn)定性。保證業(yè)務(wù)穩(wěn)定快速地發(fā)展。
- 成本。成本涉及到兩塊:人力成本和系統(tǒng)資源成本,我們期望以最小的成本創(chuàng)造最大生產(chǎn)價(jià)值。
- 效率。運(yùn)維工作自動(dòng)化,提高工作效率,減少成本。
- 安全。
我們?nèi)粘_\(yùn)維工作都是圍繞這四塊展開(kāi)的,系統(tǒng)建設(shè)的時(shí)候也是圍繞這四個(gè)主題展示。
這四塊主題的優(yōu)先等級(jí)我個(gè)人認(rèn)為是:安全第一,如果系統(tǒng)存在安全問(wèn)題,那肯定是第一時(shí)間處理;其次是穩(wěn)定性、成本、效率。
應(yīng)用運(yùn)維系統(tǒng)架構(gòu)
基于運(yùn)維需求,我們逐步建設(shè)起目前的運(yùn)維體系的架構(gòu)。
從最底層看:
- 第一層基礎(chǔ)的硬件環(huán)境,如 IDC/服務(wù)器/網(wǎng)絡(luò)設(shè)務(wù)。
- 第二層為業(yè)務(wù)需要的底層基礎(chǔ)服務(wù),如 DNS、NTP、YUM 源、LVS 等。
- 第三層針對(duì)這些系統(tǒng)資源管理平臺(tái),虛擬化平臺(tái),DNS 管理系統(tǒng)等。
上面三層針對(duì)業(yè)務(wù)的,我們有應(yīng)用管理系統(tǒng)、服務(wù)器管理系統(tǒng)、DBMS 等;還有常用的系統(tǒng),像發(fā)布系統(tǒng)、部署系統(tǒng)之類(lèi)的。
最頂層是開(kāi)放給業(yè)務(wù)開(kāi)發(fā)使用的統(tǒng)一運(yùn)維平臺(tái)。這些系統(tǒng)并不是說(shuō)在我們建設(shè)當(dāng)中一下就能建設(shè)好的,而是根據(jù)我們?nèi)粘2僮鳟?dāng)中運(yùn)維的需要逐步搭建而成。
應(yīng)用標(biāo)準(zhǔn)化規(guī)范-思路
如果一個(gè)系統(tǒng)業(yè)務(wù)要接入進(jìn)來(lái),第一步要做的是標(biāo)準(zhǔn)化。按照我們規(guī)范進(jìn)行改造,符合我們要求才能接入進(jìn)來(lái)。
不然 1300 多個(gè)應(yīng)用沒(méi)有一個(gè)統(tǒng)一接入標(biāo)準(zhǔn),讓我們?nèi)プ鲞m配打造運(yùn)維相關(guān)的系統(tǒng),那是不可能的。
我們總體的思路,先標(biāo)準(zhǔn)、后接入,只有按標(biāo)準(zhǔn)改造了,業(yè)務(wù)開(kāi)發(fā)才能方便地使用我們的運(yùn)維系統(tǒng)。
應(yīng)用標(biāo)準(zhǔn)化規(guī)范-范圍
標(biāo)準(zhǔn)化到底要做哪些事情呢?主要分成三塊:
- 基礎(chǔ)環(huán)境。基礎(chǔ)環(huán)境里面規(guī)范有哪些呢?我們可以分為兩塊:硬件、軟件。
硬件我們規(guī)范了使用的服務(wù)器硬件配置規(guī)格,目前虛擬機(jī)規(guī)格分成三類(lèi):2 核 4G 內(nèi)存的、4 核 8G 內(nèi)存的、8 核 16G 內(nèi)存的;目前要求都使用的是虛擬機(jī)。
- 軟件方面我們主要規(guī)范部署需要的軟件的版本、管理方式和部署目錄。
- 應(yīng)用配置。這里規(guī)范了應(yīng)用部署目錄、應(yīng)用包名和應(yīng)用配置等。
技術(shù)架構(gòu)。規(guī)范了業(yè)務(wù)對(duì)基礎(chǔ)組件使用姿勢(shì),如流量接入層、ZK、Kafka 等。
應(yīng)用標(biāo)準(zhǔn)化規(guī)范-內(nèi)容
集團(tuán)應(yīng)用體系規(guī)范
接下來(lái)看一下具體的標(biāo)準(zhǔn)化定義內(nèi)容,整個(gè)運(yùn)維標(biāo)準(zhǔn)化體系是我們運(yùn)維部牽頭搞的。
主要是剛才講到的內(nèi)容,定義了具體我們使用的應(yīng)用和基礎(chǔ)服務(wù)的接入、目錄的規(guī)范。
旁邊可以看一下應(yīng)用的管理規(guī)范,詳細(xì)定義應(yīng)用名命名規(guī)范、應(yīng)用包命名規(guī)范、應(yīng)用目錄、部署目錄等內(nèi)容,形成文件,在整個(gè)集團(tuán)各個(gè)部門(mén)里面?zhèn)鬟_(dá)執(zhí)行。
應(yīng)用標(biāo)準(zhǔn)化規(guī)范文檔-實(shí)例
應(yīng)用部署規(guī)范
我們按照開(kāi)發(fā)語(yǔ)言不同,應(yīng)用服務(wù)對(duì)服務(wù)器的部署環(huán)境要求也不同;我們先后制定 Java 版、PHP 版、GO 版和 Node.js 版等。
每個(gè)版本的規(guī)范里面都基本上定義了這些內(nèi)容:
- 目錄:基礎(chǔ)軟件部署目錄和版本要求。
- 應(yīng)用運(yùn)行的用戶(hù)賬號(hào)是什么、權(quán)限是什么。
應(yīng)用標(biāo)準(zhǔn)化規(guī)范文檔-實(shí)例說(shuō)明
應(yīng)用啟停腳本
接下來(lái)我們還規(guī)范了啟停腳本,定義了這個(gè)腳本里面?zhèn)鞯膮?shù),可以支持哪些參數(shù),啟動(dòng)或者重啟;每條指令里面做什么事情都進(jìn)行了說(shuō)明和規(guī)范。
規(guī)范應(yīng)用上線標(biāo)準(zhǔn)
除此之外還定義了一個(gè)業(yè)務(wù)上線之前要遵循的標(biāo)準(zhǔn),上線的標(biāo)準(zhǔn)和下線的標(biāo)準(zhǔn)。
上線之前需要業(yè)務(wù)方提供標(biāo)準(zhǔn)的自檢功能,要怎么知道你這個(gè)應(yīng)用是成功還是失敗的,那肯定需要有一個(gè)檢測(cè)機(jī)制告訴我,腳本里面通過(guò)這個(gè)檢測(cè)機(jī)制知道這個(gè)業(yè)務(wù)到底是否正常,這是一個(gè)強(qiáng)制性的規(guī)范。
下線也是一樣,上流根據(jù)定時(shí)檢測(cè)指定這個(gè) URL,根據(jù)訪問(wèn)結(jié)果判斷是否把流量自動(dòng)地切掉。
標(biāo)準(zhǔn)化文檔里面主要就是規(guī)范上述一些內(nèi)容,這些內(nèi)容為后面的運(yùn)維系統(tǒng)做了規(guī)范,我們運(yùn)維系統(tǒng)都是基于這個(gè)規(guī)范來(lái)做。
應(yīng)用運(yùn)維自動(dòng)化實(shí)踐過(guò)程
應(yīng)用運(yùn)維核心概念
1300 多個(gè)應(yīng)用如何管理?在介紹應(yīng)用管理之前需要重點(diǎn)介紹一下這幾個(gè)概念,這作為蘑菇街應(yīng)用運(yùn)維核心概念:
- 應(yīng)用名代表在蘑菇街應(yīng)用系統(tǒng)中具體業(yè)務(wù)的功能,不同的應(yīng)用名用于區(qū)分不同的業(yè)務(wù),我們按照一套業(yè)務(wù)代碼進(jìn)行劃分。
- 應(yīng)用名分組是用來(lái)組織管理服務(wù)器的。
兩者之間的關(guān)系是什么?一個(gè)應(yīng)用下面可以對(duì)應(yīng)多個(gè)應(yīng)用分組。
這個(gè)分組按照什么維度來(lái)劃分的呢?可以根據(jù)環(huán)境,也可以根據(jù)穩(wěn)定性的要求來(lái)拆分的。應(yīng)用名作為應(yīng)用運(yùn)維的核心,運(yùn)維系統(tǒng)都以應(yīng)用名作為資源的組織方式。
應(yīng)用管理系統(tǒng)
系統(tǒng)里面主要管哪些內(nèi)容呢?其中一塊用于管理業(yè)務(wù)、部門(mén)、人員三者之間的關(guān)系。
可以看一下這個(gè)圖,像這個(gè)業(yè)務(wù)是屬于哪一個(gè)部門(mén)的,開(kāi)發(fā)者是誰(shuí),代碼 review 是誰(shuí),這個(gè)里面都會(huì)維護(hù)好。
除此之外還會(huì)定義這個(gè)應(yīng)用的部署特征,這個(gè)應(yīng)用部署類(lèi)型是什么,這個(gè)比較關(guān)鍵。
后期的運(yùn)維系統(tǒng)我們會(huì)拿著部署特征信息后做判斷應(yīng)用于具體操作。應(yīng)用管理系統(tǒng)中定義的每一個(gè)字段在后面運(yùn)維系統(tǒng)里面都會(huì)存在一定關(guān)聯(lián)。
服務(wù)器管理
接下來(lái)服務(wù)器管理也有單獨(dú)的系統(tǒng),服務(wù)器管理系統(tǒng)前面說(shuō)了,分組是作為管理服務(wù)器的,在這一層可以看到我們整個(gè)層次結(jié)構(gòu)分成兩層:部門(mén)下面是具體的應(yīng)用,應(yīng)用下面是分組。
應(yīng)用分組默認(rèn)有三個(gè)組:
- DEV 代表線下測(cè)試環(huán)境。
- PRE 代表預(yù)發(fā)環(huán)境。
- ONLINE 代表生產(chǎn)環(huán)境。
我們?cè)诜纸M上面建立了不同環(huán)境的標(biāo)識(shí),發(fā)布系統(tǒng)或其他運(yùn)維系統(tǒng)就可以根據(jù)需求按應(yīng)用的緯度獲取不同環(huán)境的機(jī)器列表。
同一個(gè)應(yīng)用目前我們只分了三套環(huán)境:測(cè)試環(huán)境、預(yù)發(fā)環(huán)境和線上環(huán)境,一般默認(rèn)對(duì)應(yīng) 3 個(gè)應(yīng)用分組。
但有時(shí)基于穩(wěn)定性考慮,會(huì)把線上環(huán)境的服務(wù)器拆分成多個(gè)應(yīng)用分組。假如某個(gè)應(yīng)用是為其他應(yīng)用業(yè)務(wù)提供基礎(chǔ)服務(wù)的。
如果調(diào)用服務(wù)不隔離管理的話(huà),很容易出現(xiàn)穩(wěn)定性的問(wèn)題,如非核心業(yè)務(wù)調(diào)用量過(guò)大,導(dǎo)致核心業(yè)務(wù)調(diào)用失敗或超時(shí)。
基于上述問(wèn)題,我們很容易想到解決方案就是把服務(wù)拆分成不同服務(wù)集群,讓核心業(yè)務(wù)調(diào)用 1 個(gè)服務(wù)集群,讓非核心業(yè)務(wù)調(diào)用另外一個(gè)集群。
這個(gè)需求 RPC 服務(wù)管理控制臺(tái)都可以實(shí)現(xiàn) IP 與服務(wù)關(guān)系綁定,根據(jù)依賴(lài)業(yè)務(wù)重要程度區(qū)分出不同的服務(wù)集群,再根據(jù)不同集群調(diào)用量需求將服務(wù)器劃到不同的應(yīng)用分組中進(jìn)行管理,這個(gè)拆分分組是比較好的一個(gè)解決方案。
既然 RPC 這邊已經(jīng)把服務(wù)邏輯分組,那服務(wù)器管理系統(tǒng)中是不是可以不用區(qū)分了?服務(wù)器放在同一個(gè)應(yīng)用分組下進(jìn)行管理,這樣不是更簡(jiǎn)單嗎?
不拆分出應(yīng)用分組,對(duì)于業(yè)務(wù)訪問(wèn)是沒(méi)有影響的,因?yàn)閼?yīng)用分組的作用只是管理服務(wù)器,不會(huì)影響線上正常訪問(wèn)。
但是運(yùn)維系統(tǒng)是不知道應(yīng)用業(yè)務(wù)內(nèi)部邏輯訪問(wèn)分組是什么樣,那些機(jī)器屬于同一個(gè)服務(wù)集群,操作時(shí)必須一起操作。
如果同一個(gè)集群一起操作的話(huà),那線上的服務(wù)就掛完了;所以必須把這個(gè)體現(xiàn)出來(lái),管理起來(lái)。
應(yīng)用分組這個(gè)管理方式是比較靈活的,可以根據(jù)不同業(yè)務(wù)的特征建立不同的分組,比如說(shuō)機(jī)房緯度、地域緯度等。
分組可以理解為是一個(gè)集群的概念,同一個(gè)應(yīng)用分組下提供服務(wù)和服務(wù)對(duì)象都是相同的,這是服務(wù)器管理這一塊。
應(yīng)用部署類(lèi)型模板管理
同一類(lèi)開(kāi)發(fā)語(yǔ)言開(kāi)發(fā)出來(lái)的業(yè)務(wù)應(yīng)用對(duì)于部署環(huán)境依賴(lài)大致都是相同的。
基于這個(gè)特征,我們基于應(yīng)用部署類(lèi)型制定應(yīng)用部署模板,用于管理同類(lèi)應(yīng)用部署服務(wù)器環(huán)境的需求。
我們基于不同部署類(lèi)型建立對(duì)應(yīng)的應(yīng)用部署模板,如 Java 版、C++、GO 等。在這個(gè)模板里面我們定義了:部署的軟件和常規(guī)配置文件等內(nèi)容。
舉個(gè)例子,Java 開(kāi)發(fā)類(lèi)應(yīng)用,一般部署服務(wù)器環(huán)境所需要的包括一個(gè) JDK,容器使用 Tomcat,Nginx 作為 Web 代理服務(wù)器;除此之外,我們還有可能需要啟停腳本和配置文件,用于保證環(huán)境正常運(yùn)行。
應(yīng)用基線管理
部署模板的用途是什么呢?它主要為應(yīng)用基線提供服務(wù)的。
應(yīng)用基線建立的維度我們是按照應(yīng)用分組維度來(lái)建立的。一般情況下應(yīng)用基線部署的內(nèi)容配置都是從部署模板里面導(dǎo)過(guò)來(lái)的,基本上都能滿(mǎn)足相應(yīng)的應(yīng)用部署環(huán)境的需要。
當(dāng)個(gè)別應(yīng)用需要個(gè)性化的環(huán)境配置或軟件時(shí),我們就可以針對(duì)相應(yīng)的應(yīng)用分組的應(yīng)用基線進(jìn)行修改補(bǔ)充,以滿(mǎn)足業(yè)務(wù)方的需求。
應(yīng)用基線產(chǎn)生時(shí)間點(diǎn)是在應(yīng)用申請(qǐng)流程結(jié)束后,根據(jù)應(yīng)用申請(qǐng)時(shí)選擇的部署類(lèi)型自動(dòng)地把應(yīng)用模板相應(yīng)配置信息導(dǎo)入到該應(yīng)用下的所有應(yīng)用分組下面。
應(yīng)用部署系統(tǒng)
通過(guò)前面幾個(gè)系統(tǒng),我們基本上把環(huán)境、應(yīng)用都管理起來(lái)了。但如何實(shí)現(xiàn)環(huán)境的自動(dòng)化部署?
我們建立了應(yīng)用的部署系統(tǒng),應(yīng)用部署系統(tǒng)里面定義什么呢?就是我們定義了部署環(huán)境的執(zhí)行步驟。
如第一步,部署安裝軟件;第二步配置文件;第三步初始化等等。根據(jù)我們應(yīng)用的部署類(lèi)型建立不同的部署需要執(zhí)行的步驟,按照定義執(zhí)行步驟能完整地構(gòu)建起一個(gè)應(yīng)用的運(yùn)行環(huán)境。
運(yùn)維工單管理
最后缺一個(gè)觸發(fā)的場(chǎng)景,能把上面各個(gè)相關(guān)系統(tǒng)串聯(lián)起來(lái)的系統(tǒng)。像申請(qǐng)服務(wù)器、擴(kuò)容,新應(yīng)用申請(qǐng),因?yàn)檫@些都是業(yè)務(wù)開(kāi)發(fā)提出了需求,如何組織在一起,跟我們的環(huán)境部署系統(tǒng)組織在一起呢?
通過(guò)運(yùn)維工單的方式,需要業(yè)務(wù)開(kāi)發(fā)提相應(yīng)的工單,根據(jù)不同的工單把我們前面運(yùn)維的步驟總的綜合在一起。
目前我們工單的范圍比較多,覆蓋了我們運(yùn)維當(dāng)中常見(jiàn)的一些運(yùn)維需求,像服務(wù)器申請(qǐng)、新應(yīng)用申請(qǐng)之類(lèi)的。
這些步驟里面,每個(gè)工單里面都包含兩部分:
- 流程審批,因?yàn)橛械娜撕芊磳?duì)流程,但流程是為了保證穩(wěn)定性的手段而已。
- 工單,是具體做的事情。
應(yīng)用運(yùn)維自動(dòng)化實(shí)現(xiàn)總結(jié)
接下來(lái)說(shuō)一下整個(gè)過(guò)程,當(dāng)運(yùn)維開(kāi)發(fā)提交一個(gè)工單給我們的時(shí)候,假設(shè)新應(yīng)用申請(qǐng),從新應(yīng)用里面根據(jù)這個(gè)應(yīng)用里面定義的內(nèi)容獲取應(yīng)用的配置信息。
應(yīng)用的審核人員是誰(shuí),根據(jù)這個(gè)審核人員審批流程通過(guò)以后,會(huì)獲取對(duì)應(yīng)系統(tǒng)里面部署的機(jī)器列表,根據(jù)部署列表拿到以后,把數(shù)據(jù)傳給應(yīng)用部署系統(tǒng)里面的部署環(huán)境。
部署環(huán)境里面,部署哪些軟件、同步哪些配置文件,這些數(shù)據(jù)從哪?。繌膽?yīng)用基線里面取。
應(yīng)用基線里面如果是空的,就從應(yīng)用模板里面獲取。當(dāng)環(huán)境部署完成以后或者出了異常以后把具體信息返回給工單系統(tǒng),工單系統(tǒng)可以做一次重試任務(wù)或者結(jié)單。
應(yīng)用運(yùn)維自動(dòng)化實(shí)現(xiàn)-工單實(shí)例
這邊是具體使用的工單實(shí)例場(chǎng)景——新應(yīng)用申請(qǐng)。
有流程審批,流程審批結(jié)束以后,運(yùn)維系統(tǒng)里面做的第一步,應(yīng)用的基本信息插入到應(yīng)用管理系統(tǒng)里面,同時(shí)設(shè)備管理系統(tǒng)里面自動(dòng)的創(chuàng)建分組,分配機(jī)器。
機(jī)器分配完以后去部署環(huán)境,同時(shí)添加相應(yīng)責(zé)任人的權(quán)限。這幾個(gè)步驟基本上都是全部自動(dòng)的,有問(wèn)題的時(shí)候會(huì)停留在具體工單上面,運(yùn)維人員會(huì)做這一塊的重試或者查看工單詳情,看哪一塊出了問(wèn)題。
集成發(fā)布系統(tǒng)
對(duì)于運(yùn)維開(kāi)發(fā)還有一塊需要關(guān)注的是集成發(fā)布系統(tǒng)。集成發(fā)布系統(tǒng)的功能就是把代碼部署到線上服務(wù)器。
當(dāng)我們把一個(gè)應(yīng)用包編譯打包完成以后,需要將這個(gè)應(yīng)用包發(fā)布到具體的服務(wù)器,再到應(yīng)用部署發(fā)布完成,經(jīng)過(guò)以下幾個(gè)步驟:
首先檢查一下環(huán)境完整不完整,發(fā)布系統(tǒng)檢測(cè)一下目前機(jī)器上面的部署環(huán)境是否完整。確認(rèn)部署環(huán)境沒(méi)有問(wèn)題后,發(fā)布系統(tǒng)把應(yīng)用包同步到對(duì)應(yīng)的服務(wù)器上面。
接下來(lái)通過(guò)監(jiān)控系統(tǒng)接口關(guān)閉相應(yīng)服務(wù)器上監(jiān)控項(xiàng);接下來(lái)執(zhí)行應(yīng)用目錄下的應(yīng)用啟停腳本,通知 RPC 調(diào)用方或 Web 代理該服務(wù)器即將下線。
暫停一定時(shí)間后,再執(zhí)行應(yīng)用啟停腳本中停止指令,停掉 Nginx 和 Web 容器;確認(rèn)應(yīng)用服務(wù)停止后,將應(yīng)用包同步到運(yùn)行目錄里面解壓、啟動(dòng)應(yīng)用。
啟動(dòng)應(yīng)用時(shí)如何知道應(yīng)用是否啟動(dòng)成功了呢?通過(guò)我們前面定義的,每個(gè)應(yīng)用里面上線必須要遵循的規(guī)則自檢的程序來(lái)判斷(發(fā)請(qǐng)求/status 檢測(cè))。
如果請(qǐng)求返回 SUCCESS 時(shí),則說(shuō)明應(yīng)用啟動(dòng)成功了,否則認(rèn)為失??;確認(rèn)成功后,通知 RPC 調(diào)用方和 WE 代理該服務(wù)器可以正常服務(wù)了。
監(jiān)控系統(tǒng)
還有一塊是監(jiān)控系統(tǒng),當(dāng)我們應(yīng)用上線完了,應(yīng)用都啟動(dòng)成功了,把應(yīng)用服務(wù)器狀態(tài)調(diào)整成 Online,這樣可以把監(jiān)控系統(tǒng)自動(dòng)觸發(fā)針對(duì)該應(yīng)用進(jìn)行監(jiān)控。
我們會(huì)根據(jù)部署類(lèi)型,部署不同類(lèi)型、定義不同的監(jiān)控模板,當(dāng)然業(yè)務(wù)方也可以自定義監(jiān)控項(xiàng)。
全鏈路跟蹤分析
當(dāng)從原來(lái)一個(gè)單一的應(yīng)用演變成多個(gè)應(yīng)用,應(yīng)用之間的業(yè)務(wù)依賴(lài)關(guān)系如何進(jìn)行管理,針對(duì)這塊需求,我們跟穩(wěn)定性團(tuán)隊(duì)共同開(kāi)發(fā)了一套“全鏈路跟蹤分析系統(tǒng)”。
在我們流量的入口把全鏈路的功能模塊嵌入進(jìn)去,要求所有標(biāo)準(zhǔn)化的應(yīng)用都引用了全鏈路的二方包,流量入口到底端構(gòu)成了整個(gè)鏈路,通過(guò)這個(gè)鏈路分析對(duì)應(yīng)的應(yīng)用依賴(lài)關(guān)系。
在全鏈路跟蹤分析系統(tǒng)中,可以看到應(yīng)用自身提供的服務(wù)和依賴(lài)的服務(wù),以及各個(gè)服務(wù)后端依賴(lài)的鏈路。
當(dāng)我們出現(xiàn)問(wèn)題的時(shí)候,在這個(gè)系統(tǒng)里面直觀地可以定位到哪一個(gè)業(yè)務(wù)出了問(wèn)題和哪個(gè)服務(wù)出了問(wèn)題。
除了應(yīng)用整體的依賴(lài)關(guān)系以外,還可以根據(jù)具體的鏈路分析出來(lái)整條鏈路上下游依賴(lài)關(guān)系。
這條鏈路的這個(gè)請(qǐng)求進(jìn)來(lái)以后依次經(jīng)過(guò)哪些系統(tǒng),而且系統(tǒng)與系統(tǒng)的調(diào)用關(guān)系是多少,在全鏈路分析系統(tǒng)里面我們都可以看得到。全鏈路分析系統(tǒng)是我們運(yùn)維這邊比較重要的一個(gè)定位排查的系統(tǒng)。
運(yùn)維一站式管理平臺(tái)
我們前期做了很多運(yùn)維系統(tǒng),如應(yīng)用管理的、域名管理的、服務(wù)器管理等,涉及到各個(gè)運(yùn)維資源管理。
但這種分系統(tǒng)部署管理會(huì)給業(yè)務(wù)開(kāi)發(fā)帶來(lái)問(wèn)題,查詢(xún)一個(gè)信息時(shí),需要在不同的系統(tǒng)之間進(jìn)行切換去察看相應(yīng)的信息,這對(duì)開(kāi)發(fā)來(lái)說(shuō)是比較痛苦的。
因此我們目前正在做一站式的運(yùn)維管理平臺(tái),希望以業(yè)務(wù)的維度把所有的運(yùn)維資源都展示在一起,并結(jié)合相應(yīng)的運(yùn)維工。
這一套系統(tǒng)里面分成兩塊:
第一塊是部門(mén)維度的信息,我們基于部門(mén)可以看這個(gè)部門(mén)下面所有的業(yè)務(wù)有哪些業(yè)務(wù)以及相應(yīng)的人員,除此之外還可以看到這個(gè)部門(mén)消耗的資源有哪些。
旁邊這一塊有服務(wù)器利用率統(tǒng)計(jì),里面可以看到整個(gè)資源的消耗,這個(gè)部門(mén)下面有多少個(gè)業(yè)務(wù),每個(gè)業(yè)務(wù)消耗的服務(wù)器資源有哪些、利用率是多少。
第二塊應(yīng)用的詳細(xì)信息,應(yīng)用里面會(huì)把所有應(yīng)用相關(guān)的資源都定義好,在這里面展示出來(lái)。
我們可以在這個(gè)平臺(tái)里面綜合的看到這個(gè)業(yè)務(wù)整體的情況,目標(biāo)是想打造一套 NOOPS 運(yùn)維平臺(tái),當(dāng)然這是基于穩(wěn)定性和安全的情況下,把運(yùn)維操作讓業(yè)務(wù)同學(xué)自主的去完成的,不需要運(yùn)維同學(xué)過(guò)多參與,提高開(kāi)發(fā)的工作效率。
我們的目標(biāo)是 NOOPS,目前正在路上,謝謝大家!
作者:白海強(qiáng)(花名:普智)
簡(jiǎn)介:目前在蘑菇街平臺(tái)技術(shù)部從事應(yīng)用運(yùn)維體系和其它建設(shè)工作,與團(tuán)隊(duì)一起推進(jìn)業(yè)務(wù)應(yīng)用運(yùn)維標(biāo)準(zhǔn)化及自動(dòng)化系統(tǒng)的建設(shè)。在加入蘑菇街之前在淘寶任職,負(fù)責(zé)淘寶商品詳情等業(yè)務(wù)的運(yùn)維工作。