本篇文章內(nèi)容來(lái)自第10期魅族開(kāi)放日魅族科技運(yùn)維架構(gòu)師古日旗的現(xiàn)場(chǎng)分享。
編輯:Cynthia
一建邓、自動(dòng)化建設(shè)歷程
1.1 魅族互聯(lián)網(wǎng)發(fā)展的時(shí)間線
2003-2008年被稱(chēng)之為“互聯(lián)網(wǎng)1.0時(shí)代”外遇。2003年菲语,源于對(duì)音樂(lè)的夢(mèng)想英支,魅族成立澈吨。2006年桑阶,魅族成為中國(guó)音樂(lè)播放器第一品牌,主營(yíng)業(yè)務(wù)是MP3,當(dāng)時(shí)其互聯(lián)網(wǎng)業(yè)務(wù)只有官網(wǎng)和BBS擎椰,這部分業(yè)務(wù)單個(gè)IDC就搞定了。
2009-2011年被稱(chēng)之為“互聯(lián)網(wǎng)2.0時(shí)代”。2008年,魅族發(fā)布M8智能手機(jī),并將業(yè)務(wù)從音樂(lè)播放器轉(zhuǎn)移到手機(jī)業(yè)務(wù)上,互聯(lián)網(wǎng)業(yè)務(wù)除了原來(lái)的官網(wǎng)和BBS之外,還增加了云端服務(wù)。從這個(gè)時(shí)候起,魅族有了真正意義上的開(kāi)發(fā)、運(yùn)維学辱。數(shù)據(jù)庫(kù)也有了主從的拷貝着降,但業(yè)務(wù)運(yùn)行還是在單個(gè)IDC上。
2012-2013年被稱(chēng)之為“互聯(lián)網(wǎng)2.5時(shí)代”。2011年魅族發(fā)布M9手機(jī)见秽,開(kāi)始進(jìn)軍安卓平臺(tái)禀苦,互聯(lián)網(wǎng)主要功能是對(duì)手機(jī)部件的更新和應(yīng)用迭代昆码。互聯(lián)網(wǎng)業(yè)務(wù)擴(kuò)展到官網(wǎng)、BBS以外的電商、微博、微信等活動(dòng),架構(gòu)方面有了數(shù)據(jù)庫(kù)的分布吏饿、分表、路由蜜唾,緩存上有了Redis集群,以及分布式存儲(chǔ)MFS。
2014年以后進(jìn)入“互聯(lián)網(wǎng)3.0+時(shí)代”恶阴。我們的主要業(yè)務(wù)有游戲中心缓熟、應(yīng)用中心、多媒體晚伙、O2O等。這個(gè)時(shí)期有一個(gè)比較重要的標(biāo)識(shí):魅族互聯(lián)網(wǎng)業(yè)務(wù)成為主營(yíng)業(yè)務(wù)之一。
1.2 發(fā)展給運(yùn)維帶來(lái)的挑戰(zhàn)
隨著互聯(lián)網(wǎng)1.0-3.0的演變框咙,我們的業(yè)務(wù)也在快速增長(zhǎng)产阱。業(yè)務(wù)的急速增長(zhǎng)給運(yùn)維帶來(lái)了許多挑戰(zhàn)。
質(zhì)量上:我們踩過(guò)很多坑,包括硬件和架構(gòu)方面涎显。業(yè)務(wù)可用性低晨另,監(jiān)控體系不完善,監(jiān)控混亂召锈,覆蓋率低旁振,經(jīng)常出現(xiàn)漏報(bào)、誤報(bào)涨岁、錯(cuò)報(bào)拐袜,監(jiān)控變的不可信。
效率上:變更多梢薪,交付多蹬铺,沒(méi)有把流程和自動(dòng)化結(jié)合起來(lái),效率低下秉撇。
成本上:工作不透明甜攀,沒(méi)有一個(gè)容量評(píng)估體系來(lái)幫助我們?cè)u(píng)估每一個(gè)業(yè)務(wù)需要多少容量秋泄。
在這種情況下,運(yùn)維填坑规阀、救火恒序、背鍋是常事。
如何實(shí)現(xiàn)運(yùn)維價(jià)值谁撼,改變這種現(xiàn)狀成為首要目標(biāo)奸焙。我們實(shí)踐主要從效率、安全彤敛、質(zhì)量和成本四個(gè)方面來(lái)體現(xiàn)与帆。
質(zhì)量方面最好的體現(xiàn)方式就是可用性∧可用性指標(biāo)很多玄糟,有直接的和間接的:直接的從監(jiān)控上可以得到系統(tǒng)可用性、服務(wù)可用性袄秩、應(yīng)用程序可用性等阵翎;間接的可以對(duì)標(biāo)一些體驗(yàn)性指標(biāo),比如速度之剧,也可以對(duì)標(biāo)一些業(yè)務(wù)上的指標(biāo)郭卫,比如手機(jī)短信到達(dá)率。
效率方面主要是服務(wù)器的交付背稼、線上的變更贰军,以及積極發(fā)現(xiàn)故障等。
成本方面是主要針對(duì)業(yè)務(wù)整體的調(diào)度和交付能力進(jìn)行優(yōu)化改進(jìn)蟹肘。
安全是互聯(lián)網(wǎng)重要的基石词疼,在安全方面我們定制了一些策略和規(guī)范。
對(duì)應(yīng)這四個(gè)維度帘腹,我們有四個(gè)支撐團(tuán)隊(duì):質(zhì)量方面有運(yùn)維優(yōu)化團(tuán)隊(duì)贰盗、效率方面有運(yùn)維開(kāi)發(fā)團(tuán)隊(duì)、成本方面有運(yùn)維基礎(chǔ)團(tuán)隊(duì)阳欲、安全方面有運(yùn)維安全團(tuán)隊(duì)舵盈。
1.3運(yùn)維平臺(tái)現(xiàn)狀
同時(shí)我們也開(kāi)發(fā)了一些系統(tǒng),從功能上來(lái)看有資源管理系統(tǒng)球化、配置管理系統(tǒng)秽晚、自動(dòng)化系統(tǒng)、監(jiān)控系統(tǒng)與容量和安全系統(tǒng)赊窥。如圖所示爆惧。
資源管理系統(tǒng),我們通過(guò)KVM锨能、Docker建立了一個(gè)云平臺(tái)扯再,基于云平臺(tái)組成虛擬計(jì)算和網(wǎng)絡(luò)的資源管理系統(tǒng),通過(guò)CMDB進(jìn)行管控址遇;
配置管理系統(tǒng)熄阻,我們建立了LVS、CDN和DNS管理系統(tǒng)倔约,對(duì)應(yīng)開(kāi)發(fā)一些API秃殉。這樣做的好處是我們可以精細(xì)化權(quán)限,集中在一個(gè)平臺(tái)上做管控浸剩;
自動(dòng)化管理系統(tǒng)包括工單钾军、日志、發(fā)布系統(tǒng)绢要,自研運(yùn)維通道和自動(dòng)巡檢系統(tǒng)吏恭。這些都給運(yùn)維的交付和變更帶來(lái)了效率上的提升;
監(jiān)控方面我們建立了基礎(chǔ)監(jiān)控重罪、自定義監(jiān)控樱哼、業(yè)務(wù)監(jiān)控和容量系統(tǒng)。容量系統(tǒng)可以幫助我們?cè)u(píng)估一個(gè)業(yè)務(wù)用了多少資源剿配、容量如何搅幅;
我們有一個(gè)堡壘機(jī),所有運(yùn)維登錄都要在堡壘機(jī)上做一個(gè)管控呼胚,這樣可以審計(jì)用戶(hù)操作茄唐。我們還自研了一個(gè)可以自動(dòng)發(fā)現(xiàn)漏洞的平臺(tái)——WAF系統(tǒng),能夠把漏洞轉(zhuǎn)化到漏洞管理平臺(tái)蝇更,在上面進(jìn)行迭代和修復(fù)琢融。
1.4 發(fā)布平臺(tái)演進(jìn)
我們的發(fā)布平臺(tái)經(jīng)歷了周發(fā)布、日發(fā)布和自主發(fā)布的發(fā)展歷程簿寂。一開(kāi)始我們的業(yè)務(wù)比較簡(jiǎn)單漾抬,發(fā)布是通過(guò)人力來(lái)實(shí)現(xiàn)的,后來(lái)業(yè)務(wù)越來(lái)越多常遂,人力無(wú)法達(dá)到纳令,就出現(xiàn)了一些自動(dòng)化工具,可以向服務(wù)器下發(fā)腳本或命令克胳、任務(wù)等平绩。這樣做可以解決一部分問(wèn)題,但整體發(fā)布效率和成功率還是非常低的漠另,而且還可能存在一些人為的誤操作捏雌。
在發(fā)布平臺(tái)上,我們結(jié)合業(yè)務(wù)樹(shù)和業(yè)務(wù)模塊做了一些規(guī)范和標(biāo)準(zhǔn)笆搓,有效地提升了發(fā)布成功率和容錯(cuò)性性湿。為了使發(fā)布更加靈活纬傲,我們把審核權(quán)限下發(fā)到業(yè)務(wù),由業(yè)務(wù)負(fù)責(zé)人進(jìn)行審核肤频,整個(gè)發(fā)布流程不再需要業(yè)務(wù)運(yùn)維參與其中叹括。
我們的發(fā)布有一些特點(diǎn),比如發(fā)布策略多宵荒,有組發(fā)布汁雷、自助發(fā)布、一鍵重啟报咳、靜態(tài)文件發(fā)布等侠讯;發(fā)布類(lèi)型也很多,包括常用的Jetty暑刃、PHP厢漩、C++等。經(jīng)過(guò)演進(jìn)稍走,我們的發(fā)布成功率一直保持在98%以上袁翁,自助發(fā)布率也在穩(wěn)步上漲,可以看到大概有90%的業(yè)務(wù)在迭代發(fā)布過(guò)程中是不需要運(yùn)維參與的粱胜。
1.5 交付流程
我們的交付流程大概分為生產(chǎn)、測(cè)試狐树、開(kāi)發(fā)三個(gè)環(huán)境在塔。
開(kāi)發(fā)人員開(kāi)發(fā)代碼并在本地自測(cè)
提交代碼到Git徽曲,通過(guò) Jenkins打包,進(jìn)行一些靜態(tài)掃描并在redmin上填寫(xiě)測(cè)試單弧哎;
測(cè)試人員自動(dòng)或者手動(dòng)驗(yàn)證用例;
運(yùn)維人員準(zhǔn)備基礎(chǔ)環(huán)境赡麦,提供自動(dòng)部署服務(wù)们衙、并進(jìn)行日志收集、報(bào)警監(jiān)控蜓谋、應(yīng)用快速擴(kuò)容呀忧。
這是一個(gè)微妙的平衡,這種平衡要求我們有一套完善的技術(shù)棧和環(huán)境溃睹,團(tuán)隊(duì)技術(shù)框架和人員也要盡可能的穩(wěn)定而账,這種情況下,是沒(méi)有什么問(wèn)題的因篇,但是如果這個(gè)平衡被打破了泞辐,比如有一些流程沒(méi)有被遵守,或者說(shuō)有一些相關(guān)的人員離職竞滓、我們的架構(gòu)變化的比較快咐吼,這個(gè)時(shí)候整個(gè)平衡就會(huì)被打破,交付變得不可完成商佑。
1.6交付中存在的問(wèn)題
交付過(guò)程中存在哪些問(wèn)題呢锯茄?
首先是質(zhì)量,我們通過(guò)代碼的質(zhì)量跟蹤可以看到它有沒(méi)有通過(guò)單元測(cè)試茶没、覆蓋率如何肌幽、Bug數(shù)如何;其次是效率抓半,我們有自動(dòng)化部署喂急、自動(dòng)化測(cè)試、自動(dòng)化構(gòu)建琅关,但這些分布在不同的部門(mén)煮岁,沒(méi)有和流程打通,這就造成第三個(gè)問(wèn)題:溝通成本高涣易,交付復(fù)雜画机。最后還可能有安全問(wèn)題,比如代碼夠不夠安全新症、有沒(méi)有經(jīng)過(guò)安全測(cè)試等步氏。
1.7 我們追求的價(jià)值
我們追求的是價(jià)值交付,這也是魅族持續(xù)交付平臺(tái)建設(shè)的指引徒爹。
首先在最底層是一些開(kāi)發(fā)框架荚醒,云平臺(tái)能保證我們環(huán)境,保證交付所有的系統(tǒng)都是標(biāo)準(zhǔn)化的隆嗅,
開(kāi)發(fā)架構(gòu)這里有技術(shù)委員會(huì)定義和推廣的一系列基礎(chǔ)服務(wù)和架構(gòu)界阁,這就保證了有一套基礎(chǔ)的技術(shù)棧和環(huán)境自動(dòng)化的流程。
持續(xù)交付流水線的核心原則是把一些標(biāo)準(zhǔn)化的流程自動(dòng)化胖喳。過(guò)程當(dāng)中有提測(cè)和編譯階段泡躯,有并行的研發(fā)、編譯構(gòu)建、單元測(cè)試较剃;在測(cè)試與驗(yàn)證階段有環(huán)境部署咕别、系統(tǒng)測(cè)試、集成測(cè)試写穴;在發(fā)布與運(yùn)維階段有生產(chǎn)交付惰拱、發(fā)布和生產(chǎn)監(jiān)控等,這一系列過(guò)程都可以在這個(gè)流水線上完成啊送。這個(gè)系統(tǒng)是多用戶(hù)的偿短,支持開(kāi)發(fā)、運(yùn)維删掀、測(cè)試進(jìn)行協(xié)調(diào)操作翔冀,這樣對(duì)整個(gè)團(tuán)隊(duì)的協(xié)作也起到了促進(jìn)作用导街。
二披泪、持續(xù)交付平臺(tái)
2.1 演進(jìn)-標(biāo)準(zhǔn)化
自動(dòng)化平臺(tái)的演進(jìn)分為標(biāo)準(zhǔn)化、自動(dòng)化搬瑰、智能運(yùn)維三個(gè)階段款票。
標(biāo)準(zhǔn)化方面包括監(jiān)控標(biāo)準(zhǔn)化、應(yīng)用監(jiān)控標(biāo)準(zhǔn)化泽论、技術(shù)棧標(biāo)準(zhǔn)化(其中用了什么協(xié)議)艾少、硬件標(biāo)準(zhǔn)化、質(zhì)量標(biāo)準(zhǔn)化等翼悴。自動(dòng)化主要是測(cè)試自動(dòng)化缚够,在測(cè)試階段包括的東西更多,比如單元測(cè)試鹦赎、通過(guò)率及測(cè)試的準(zhǔn)入準(zhǔn)出條件(是不是允許一些bug)等谍椅。
2.2 演進(jìn)-技術(shù)選型
我們?cè)诮⒊掷m(xù)交付平臺(tái)的過(guò)程中有兩個(gè)方案:
第一種,全開(kāi)源的方案古话,我們可以用docker做環(huán)境自動(dòng)化的標(biāo)準(zhǔn)的東西雏吭,我們的日志可以使用ES,這種方案可能對(duì)我們現(xiàn)有的系統(tǒng)的沖擊比較大陪踩,我們要使用一套全新的東西杖们。
第二種,基于現(xiàn)有系統(tǒng)自建肩狂≌辏基于我們現(xiàn)有的云平臺(tái)加上我們的一些發(fā)布平臺(tái)這些東西進(jìn)行規(guī)范和標(biāo)準(zhǔn)。
我們選擇了基于現(xiàn)有系統(tǒng)自建的方案傻谁,對(duì)我們來(lái)說(shuō)阻力比較大孝治。
首先我們需要對(duì)接很多系統(tǒng),這些系統(tǒng)分散在各個(gè)職能部門(mén),有PMO荆秦、測(cè)試篱竭、運(yùn)維等,要推動(dòng)這些不同的職能部門(mén)和相關(guān)的人員做出改變步绸,阻力是非常大的掺逼;
其次,我們現(xiàn)有的一些系統(tǒng)瓤介,在開(kāi)發(fā)的時(shí)候可能用了不同的規(guī)范吕喘,像我們的運(yùn)維這邊發(fā)布平臺(tái)可能都會(huì)有規(guī)范,比如每個(gè)機(jī)房有哪些服務(wù)器刑桑,服務(wù)器上跑了什么模塊氯质,哪些機(jī)器有生產(chǎn)環(huán)境,都是基于我們的業(yè)務(wù)樹(shù)來(lái)運(yùn)行祠斧。
但是開(kāi)發(fā)這邊使用的各個(gè)平臺(tái)都是全開(kāi)源的闻察,比如之前使用的jekins都是全開(kāi)源的,完全就沒(méi)有進(jìn)行改造琢锋,這個(gè)時(shí)候就會(huì)有問(wèn)題辕漂,它里面的名字之類(lèi)的標(biāo)識(shí)完全都是自定義的,很難和我們的業(yè)務(wù)樹(shù)對(duì)應(yīng)起來(lái)吴超,想改造確實(shí)是比較麻煩钉嘹。
2.3 演進(jìn)-統(tǒng)一入口
在持續(xù)平臺(tái)中首先要有一個(gè)統(tǒng)一入口,像前面提到的Jenkins鲸阻,用來(lái)打包跋涣,我們可以調(diào)用它的API,打包之后植入到系統(tǒng)中鸟悴。
還有之前做的需求管理陈辱、bug跟蹤的信息,我們會(huì)把這些信息錄入到系統(tǒng)中遣臼,一旦得到一些信息我們就可以知道一個(gè)需求遺留吧多少個(gè)bug性置、修復(fù)情況如何。
另外揍堰,這是一個(gè)多用戶(hù)系統(tǒng)鹏浅,我們還要把這些系統(tǒng)人員同步到系統(tǒng)當(dāng)中,把他們信息都錄入進(jìn)去屏歹。
2.4 持續(xù)集成流程
如圖所示隐砸,持續(xù)集成的流程是:首先把需求列入到需求階段,開(kāi)發(fā)負(fù)責(zé)人對(duì)這些需求進(jìn)行評(píng)估和預(yù)測(cè)蝙眶,評(píng)估出一個(gè)迭代日期季希;然后進(jìn)入開(kāi)發(fā)階段褪那,開(kāi)發(fā)代碼,提交代碼然后到編譯式塌;編譯進(jìn)行靜態(tài)掃描博敬,這當(dāng)中包含代碼的覆蓋率;然后到測(cè)試階段峰尝,把代碼部署到測(cè)試環(huán)境偏窝,進(jìn)行代碼測(cè)試,包括安全性測(cè)試武学、性能測(cè)試祭往,有時(shí)還會(huì)做一些人工驗(yàn)證,如果有問(wèn)題流程會(huì)被打回火窒,開(kāi)發(fā)人員重新提交代碼硼补,重新走一遍準(zhǔn)入流程,如果沒(méi)有問(wèn)題就進(jìn)入到生產(chǎn)階段熏矿;開(kāi)發(fā)負(fù)責(zé)人或者運(yùn)維人員進(jìn)行審核已骇,通過(guò)審核之后,會(huì)先把代碼發(fā)布到灰度環(huán)境曲掰,用自動(dòng)化的程序來(lái)驗(yàn)證它的安全性是怎么樣疾捍,接口通過(guò)率怎么樣,如果都沒(méi)有問(wèn)題才會(huì)放到生產(chǎn)發(fā)布栏妖。從需求到發(fā)布的階段,整個(gè)它的工作流程或者生命周期的管理都會(huì)在這一個(gè)平臺(tái)上進(jìn)行管控奖恰,整個(gè)交付流程就有一個(gè)可視化的進(jìn)度管理吊趾。
2.5 發(fā)布流程
我們單獨(dú)看一下發(fā)布流程,
第一步瑟啃,環(huán)境監(jiān)測(cè)论泛,包括我們發(fā)布的服務(wù)器上相關(guān)的環(huán)境,比如它的用戶(hù)是不是存在蛹屿,目錄是不是存在屁奏,還有相關(guān)的權(quán)限;
第二步错负,文件拉取坟瓢,從打包平臺(tái)拉取要發(fā)布的包;
第三步犹撒,關(guān)閉監(jiān)控折联,我們都知道發(fā)布的時(shí)候可能會(huì)造成短暫的服務(wù)不可用,或者發(fā)布期間不會(huì)有誤報(bào)识颊,那么我們可能會(huì)針對(duì)發(fā)布的機(jī)器做一些關(guān)閉監(jiān)控的操作诚镰;
第四步,web下線,保證沒(méi)有流量進(jìn)來(lái)清笨;
第五步月杉,停止服務(wù),保證文件不被訪問(wèn)占用抠艾;
第六步沙合,更新文件,對(duì)文件進(jìn)行更新跌帐;
第七步首懈,啟動(dòng)服務(wù),恢復(fù)web服務(wù)谨敛;
第八步究履,健康檢查,根據(jù)健康檢測(cè)我們能確定并保證我們的服務(wù)運(yùn)行正常脸狸;
第九步最仑,web上線,健康檢測(cè)以后我們會(huì)把我們的web服務(wù)加入IOS集群上炊甲;
第十步泥彤,開(kāi)啟監(jiān)控,最后總的發(fā)布就完成卿啡。
發(fā)布的時(shí)候吟吝,我們因應(yīng)業(yè)務(wù)環(huán)境可使用串行發(fā)布和并行發(fā)布,這樣在保證我們發(fā)布的成功率的前提下颈娜,也能提升發(fā)布效率剑逃。
2.6 產(chǎn)品研發(fā)模式
有了持續(xù)交付平臺(tái)就能保證滿(mǎn)足互聯(lián)網(wǎng)研發(fā)的模式,比如經(jīng)常被用到的極速迭代官辽,在平臺(tái)上可以滿(mǎn)足迭代性的需求還有迭代后的回顧蛹磺。
2.7 數(shù)據(jù)驅(qū)動(dòng)
完成了這些以后我們會(huì)有價(jià)值數(shù)據(jù)的驅(qū)動(dòng)和輸出,首先這里會(huì)有幾方面的數(shù)據(jù)同仆,在代碼的一些規(guī)范性上面萤捆,可以知道嚴(yán)重問(wèn)題是多少、阻隔問(wèn)題有多少俗批,在代碼的可讀性上俗或,有重復(fù)率,還有一些接口和單元測(cè)試扶镀,單元測(cè)試的覆蓋率怎么樣蕴侣,通過(guò)率怎么樣,還有性能測(cè)試的一些數(shù)據(jù)臭觉,安全測(cè)試的一些數(shù)據(jù)昆雀,甚至我們的人員構(gòu)建的成功率之類(lèi)的辱志,還有發(fā)布的一些成功率,還有發(fā)布的效率狞膘。這樣就可以知道一個(gè)項(xiàng)目它從開(kāi)始到現(xiàn)在它所有的質(zhì)量數(shù)據(jù)的變化揩懒,通過(guò)這些質(zhì)量數(shù)據(jù)的驅(qū)動(dòng)能提升技術(shù)的能力,把系統(tǒng)上線前質(zhì)量是OK的挽封,當(dāng)然我們還可以根據(jù)這些數(shù)據(jù)來(lái)考核我們的相關(guān)的子系統(tǒng)已球。
三、展望運(yùn)維智能化
回頭看一下我們平臺(tái)的三個(gè)階段辅愿,標(biāo)準(zhǔn)化智亮、自動(dòng)化、智能化点待,智能運(yùn)維是根據(jù)收集上來(lái)的數(shù)據(jù)進(jìn)行學(xué)習(xí)阔蛉,從而達(dá)到預(yù)測(cè)和分析的目的。
這里我們最常見(jiàn)的就是預(yù)測(cè)和分析癞埠,比如根據(jù)我們的預(yù)報(bào)數(shù)據(jù)的統(tǒng)計(jì)說(shuō)我們最近硬盤(pán)的換盤(pán)率特別高状原,這樣是不是可以預(yù)測(cè)一下我們的數(shù)據(jù)硬盤(pán)什么時(shí)候損壞。
其次還有可以根據(jù)一些數(shù)據(jù)進(jìn)行效率上的提升苗踪,比如說(shuō)像故障方面颠区,在故障的發(fā)現(xiàn)和定位上有一個(gè)比較有力的支持,或者達(dá)到故障預(yù)測(cè)通铲。
還有就是數(shù)據(jù)中心的故障的預(yù)測(cè)毕莱,因?yàn)檫@個(gè)東西在當(dāng)時(shí)肯定是全癱瘓了,那么像這種故障能否做到事前的預(yù)測(cè)测暗,這就是我們現(xiàn)在要解決或者想進(jìn)一步解決的一些問(wèn)題央串。
11月9-12日,北京國(guó)家會(huì)議中心碗啄,第六屆TOP100全球軟件案例研究峰會(huì),魅族科技主題桌面負(fù)責(zé)人譚林英將分享《手機(jī)廠商如何做互聯(lián)網(wǎng)產(chǎn)品》稳摄。