河貍家運(yùn)維發(fā)展歷程,是從無到有的過程。河貍家起初聘請(qǐng)了一家外包公司幫助開發(fā)早期的產(chǎn)品,但使用中出現(xiàn)了一些問題。后來逐漸發(fā)現(xiàn)原來軟件部署上去之后,不只要進(jìn)行增刪改查功能,還要有專門的運(yùn)維工程師去線上運(yùn)維做相關(guān)的工作。
運(yùn)維團(tuán)隊(duì)的職責(zé)也經(jīng)歷了從不清晰到明確的過程。之前有的工程師同時(shí)兼做很多工作,日常工作40%、50%的時(shí)間都是做幫領(lǐng)導(dǎo)導(dǎo)報(bào)表,久而久之他變得非常郁悶,本職工作也很難做得好。
河貍家的運(yùn)維,其實(shí)也是從黑盒到白盒的過程。作為一個(gè)程序員,個(gè)人會(huì)有很強(qiáng)的控制欲:如果說不知道要上線的東西源碼是怎么寫的,心里會(huì)很是慌兮兮的。運(yùn)維希望各個(gè)數(shù)據(jù)都可以看得到,又全部都可以串起來。之前可能只是用簡(jiǎn)單地監(jiān)控讀取一些數(shù)據(jù),但是其中整個(gè)請(qǐng)求串起來之后,代碼中出了什么問題,比如說活動(dòng)的場(chǎng)景出現(xiàn)問題,可能就束手無策了。
此外,這還是從混亂到規(guī)范的過程。什么是混亂?大家很多都是從創(chuàng)業(yè)公司出來的,遇到過很多創(chuàng)業(yè)公司發(fā)展中的問題。在創(chuàng)業(yè)公司,包括團(tuán)隊(duì)、人員、項(xiàng)目,都需要不斷地進(jìn)行自我學(xué)習(xí)、提升和修煉,是一個(gè)不停成長的過程,因此不可能一下子都很完美。所以說在這個(gè)過程當(dāng)中,公司整個(gè)項(xiàng)目,包括項(xiàng)目管理開發(fā)流程等等都是缺失的。
舉個(gè)例子,團(tuán)隊(duì)做一個(gè)簡(jiǎn)單的版本發(fā)布,怎么做呢?發(fā)布之前,產(chǎn)品和運(yùn)維的同學(xué)給了你一些不同的功能提議,結(jié)果確定下來之后發(fā)布日期馬上就到了,這時(shí)候只能加班加點(diǎn)去開發(fā)。這種情況下去發(fā)布,運(yùn)維半夜三更被叫起來去做,結(jié)果發(fā)布上去出現(xiàn)一堆問題,頓時(shí)傻眼了。這樣下來,運(yùn)維的黑鍋越背越多,就被別人說成“不靠譜”。
這個(gè)時(shí)候需要反思。當(dāng)團(tuán)隊(duì)把來龍去脈想通之后,會(huì)認(rèn)識(shí)到項(xiàng)目管理的過程都是一環(huán)扣一環(huán),而往往最后一道環(huán)節(jié)是產(chǎn)品、技術(shù)、運(yùn)維可以看見的這一部分。因此一旦出了問題,就得背黑鍋,前面的環(huán)節(jié)干了“壞事”的人都逃之夭夭了。把這個(gè)東西梳理清楚之后,規(guī)范就可以推行起來。項(xiàng)目管理到底要怎么管?提下我們的想法和思路。
項(xiàng)目管理的想法和思路
首先,是從業(yè)余到標(biāo)準(zhǔn)運(yùn)維的思路。什么叫從業(yè)余到標(biāo)準(zhǔn)?之前線上的服務(wù)端用java的代碼比較多。以部署為例,在之前的部署當(dāng)中,發(fā)包的過程是把手工的包丟過來,而后是手工腳本。有些同學(xué)改了代碼,發(fā)現(xiàn)線上跑的代碼跟你的對(duì)不起來。所以就要制定標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)是什么?包括軟件怎么打包、怎么部署、怎么成為一個(gè)標(biāo)準(zhǔn)的軟件上線,都需要去梳理;在框架方面,比如java工程能一鍵生成一個(gè)可執(zhí)行、可交互的軟件。
此外,關(guān)于上線流程也研發(fā)了統(tǒng)一的系統(tǒng),用這個(gè)流程去對(duì)接,包括SVN開發(fā)標(biāo)準(zhǔn)梳理等。前期推行時(shí),開發(fā)同學(xué)可能不太適應(yīng),因?yàn)椴还茉趺凑f,從作坊式的走向規(guī)范化都不是件容易事。另外還建立了緊急發(fā)布環(huán)節(jié):可以讓你通過審核,但是要找領(lǐng)導(dǎo)去批。當(dāng)然大家一開始不適應(yīng)找領(lǐng)導(dǎo)簽字。過了幾個(gè)月之后,統(tǒng)計(jì)緊急發(fā)布了多少,正常發(fā)了多少,為什么每天都是緊急發(fā)布?真的業(yè)務(wù)到了每天都需要發(fā)的情況嗎?這些問題都有據(jù)可查了。所以這個(gè)東西不僅僅是個(gè)標(biāo)準(zhǔn),也可以作為記錄,充當(dāng)是否合理的有力評(píng)判依據(jù)。
要從被動(dòng)往主動(dòng)去發(fā)展。我們一直希望運(yùn)維能反過來推進(jìn)一些事情:包括提前預(yù)測(cè)一些業(yè)務(wù)上的情況,以及未來業(yè)務(wù)的發(fā)展規(guī)劃等。當(dāng)然這個(gè)實(shí)現(xiàn)起來可能很困難。
BAT有些系統(tǒng)很牛逼,做得很完美。但公司通過某個(gè)渠道把它拿過來,納為己用是不是就高枕無憂了呢?不是這樣的,技術(shù)沒有牛逼不牛逼、高大上不高大上,只有合適不合適,能不能在自己的場(chǎng)景里面適用。
運(yùn)維在這個(gè)系統(tǒng)上線之后,不停地發(fā)現(xiàn)線上的問題,包括技術(shù)的、業(yè)務(wù)的,因而不停地去優(yōu)化,讓公司軟件業(yè)務(wù)不斷地往好的方向發(fā)展。因?yàn)閱栴}永遠(yuǎn)不可能消除,學(xué)過矛盾各位的都知道,矛盾只可以轉(zhuǎn)移,不可以消滅,一個(gè)矛盾接著一個(gè)矛盾,我們只能兵來將擋、水來土掩。后臺(tái)有報(bào)警系統(tǒng)、用戶投訴、客戶投訴、后臺(tái)分析等,現(xiàn)在會(huì)統(tǒng)一提交到運(yùn)維做綜合性的分析,再去判斷問題的可能性。比如是自身的問題就去做修復(fù),如果不是我們這里的問題,就要跟研發(fā)等相應(yīng)的團(tuán)隊(duì)同學(xué)去溝通、配合。
運(yùn)維在整個(gè)公司項(xiàng)目管理過程當(dāng)中,其實(shí)是最后一個(gè)環(huán)節(jié)。所以運(yùn)維把工作做好的前提是:把整個(gè)流程全部都串起來。只有把這個(gè)工作做好了,運(yùn)維的工作才能做好。而如果這個(gè)工作不做好,運(yùn)維永遠(yuǎn)沒有話語權(quán)去反推其他部門。因此,流程可能不一定按照這種方式去走,但是一定要找到一條適合自己公司、自己場(chǎng)景的道路,去把這個(gè)流程規(guī)范好。
為什么要做監(jiān)控系統(tǒng)?
在做這個(gè)系統(tǒng)之前,團(tuán)隊(duì)曾面臨一些問題。第一,運(yùn)維系統(tǒng)之前只是針對(duì)服務(wù)器,用zabbix等做了一些監(jiān)控,接入了短信的報(bào)警。但后來發(fā)現(xiàn)監(jiān)控一旦報(bào)警之后,首先沒人處理;其次報(bào)警沒有分類,具體報(bào)了什么無從知曉,沒什么意義;再次研發(fā)人員不關(guān)注運(yùn)維,只是需求功能的疊加。之前研發(fā)團(tuán)隊(duì)只關(guān)注開發(fā)功能,不關(guān)注上線之后代碼到底產(chǎn)生什么作用,運(yùn)維好不容易把工作做好了,結(jié)果隔了一段時(shí)間,這些問題又來了。因?yàn)殚_發(fā)不關(guān)注這些東西,也不去審查這些問題,運(yùn)維根本就沒法做到。
第二,研發(fā)團(tuán)隊(duì)自身的能力也很難得到成長,因?yàn)樗麄冇肋h(yuǎn)只是在開發(fā)功能,但是不知道功能上去之后對(duì)業(yè)務(wù)有什么影響,也根本不關(guān)注。久而久之,團(tuán)隊(duì)也很難更好地成長,并且人員歸屬感、能力提升等等都會(huì)受到一系列的制約。最后,公司的系統(tǒng)成了一個(gè)黑盒,如果真的出了問題,除了底層zabbix可以報(bào)警之外,其他一無所知。只能隨便亂搞,不知道到底是哪里的問題,這時(shí)候真的是抓狂的。
提出這些問題之后,這個(gè)平臺(tái)開始建立,設(shè)想有這么幾個(gè)初衷:
第一,系統(tǒng),基礎(chǔ)軟件,服務(wù)狀態(tài)等都是可以可視化的。
第二,整個(gè)流程是可以跟蹤到的。
第三,能對(duì)線上的流量,包括PV、UV進(jìn)行統(tǒng)計(jì)和分析。
第四,可以定期跟蹤到線上的代碼性能情況,比如說代碼執(zhí)行站最終性能卡在哪里,哪個(gè)函數(shù)調(diào)用比較慢等。
第五,希望對(duì)數(shù)據(jù)庫的慢查做一些分析。
第六,業(yè)務(wù)穩(wěn)定性監(jiān)測(cè),比如說商品訂單支付可以做一些穩(wěn)定性的監(jiān)測(cè)。
第七,對(duì)報(bào)警做分級(jí),做到可分支,多個(gè)通道都可以接入,可以短信、郵件包括微信報(bào)警。
第八,從運(yùn)維的角度便于業(yè)務(wù)分析數(shù)據(jù)。
考慮自己的問題。不管是業(yè)務(wù)還是技術(shù),可能運(yùn)維只是考慮到系統(tǒng)服務(wù)器怎么運(yùn)維,但產(chǎn)品也需要運(yùn)維,如果沒有一些可視化的東西,你都不知道自己的數(shù)據(jù)是怎么回事。產(chǎn)品上線之后,久了也不知道問題出在哪里,這從廣義的角度也是一個(gè)運(yùn)維的過程。
監(jiān)控系統(tǒng)的解決方案
第一版的解決方案是這樣的:首先LVS請(qǐng)求進(jìn)來,通過APP協(xié)議分發(fā)再到后端的agent、ngx,給它加了ID的概念,自己隨機(jī)生成,一直把后面的ID把整個(gè)請(qǐng)求流程貫穿起來。
河貍家在server端開發(fā)了一個(gè)agent功能,對(duì)java產(chǎn)品的日志做一些采集,采集完之后丟到后端里面去。與APP應(yīng)用服務(wù)器部署在一塊。MonitorServer主要用于監(jiān)控系統(tǒng)級(jí)軟件,通過MonitorServer定期去交互,取一些數(shù)據(jù)丟到隊(duì)列里面。
報(bào)警服務(wù)器其實(shí)是一個(gè)流失計(jì)算的過程,收到數(shù)據(jù)之后適時(shí)做一些Ctrl工作,有一些規(guī)則觸發(fā)之后,會(huì)激活后面進(jìn)行報(bào)警處理。我們有一些rebport-server,也可以通過流失的方式,對(duì)一些報(bào)表,比如每日匯總的數(shù)據(jù),通過這種方式計(jì)算,錄入到匯總表里面去。
第二個(gè)是采集模塊,采集java的內(nèi)容,目前比較粗放,通過javaagent,嵌入一些采集數(shù)據(jù)的功能,把java業(yè)務(wù)相關(guān)的數(shù)據(jù),代碼執(zhí)行站通過這種方式采過來之后,丟往后端。MonitorServer,像redis就是基于Info&monitor命令實(shí)現(xiàn)的。我們沒有自己寫代碼,直接把別人的東西改了改,直接分到自己的MonitorServer里面去了。
此外,現(xiàn)在對(duì)于后端的dao/jdbc也做了一個(gè)工作,主要把傳輸執(zhí)行的參數(shù)以及執(zhí)行時(shí)間這一塊拿過來放到后端。當(dāng)然這個(gè)東西不是實(shí)時(shí)去取,因?yàn)椴还茉趺磁,這塊數(shù)據(jù)無法實(shí)時(shí)獲取。javaagent通過自解碼能做的功能相對(duì)有限,因?yàn)樵赼gent系統(tǒng)沒啟動(dòng)之前,想做一些現(xiàn)成詞的工作會(huì)遇到很多問題。
在這種情況面,只能簡(jiǎn)單地去實(shí)現(xiàn)幾個(gè)預(yù)估的現(xiàn)成丟在里面,預(yù)估的現(xiàn)成除非在硬件級(jí)別支持后臺(tái)異步,否則異步就是假的,隊(duì)列大小能搞多少呢?搞得再大,也不能解決在業(yè)務(wù)高峰期有很多數(shù)據(jù)丟過來時(shí),隊(duì)列會(huì)撐滿的情況。這個(gè)時(shí)候,異步就變成了同步,后面全部都會(huì)被堵塞掉。所以在這種場(chǎng)景下面,采集的工作其實(shí)是,在一臺(tái)機(jī)器上面抽樣,在某個(gè)時(shí)間點(diǎn)取得一部分?jǐn)?shù)據(jù),通過這個(gè)時(shí)間點(diǎn)來采集。
數(shù)據(jù)完成之后,需要統(tǒng)計(jì)業(yè)務(wù)各個(gè)層次的情況。我們分裝了一個(gè)IP庫,主要是將GeoLite2、純真庫、Ip.cn貫穿起來,幾年日志里的IP地址和Geo地址都包含在里面。
這樣,平時(shí)的流量分析就可以統(tǒng)計(jì)到各個(gè)維度,F(xiàn)在,IP地址的排名、網(wǎng)絡(luò)狀態(tài),還有哪個(gè)業(yè)務(wù)最高等都可以監(jiān)控到。
做了這個(gè)監(jiān)控之后,也發(fā)現(xiàn)了一些問題:4點(diǎn)鐘的時(shí)候,流量會(huì)很奇怪地突然下降,因此發(fā)現(xiàn)有人定期4點(diǎn)鐘來查我們的列表,因?yàn)镮P地址都是零散的,所以不能直接通過肉眼觀察到這些問題。比如雙11那天,因?yàn)楹蠖诉用比較老的連接詞,但那時(shí)候連接詞堵不住了,有些代碼就堵住。在這種情況下,運(yùn)維就可以直接排查,C3P0的隊(duì)列就可以重新排名。
另外,針對(duì)java的進(jìn)程也做了一個(gè)健康度的采集,比如說CPU內(nèi)存、YGC等等,都可以在這里展示出來。像數(shù)據(jù)庫慢查,每秒鐘的時(shí)間點(diǎn)都可以在這里看到。現(xiàn)在可以做郵件、手機(jī)、微信報(bào)警的配置。
架構(gòu)的改進(jìn)
隊(duì)列數(shù)據(jù)多了之后,由于隊(duì)列不是專用的,因此如果把它當(dāng)隊(duì)列使用的話,做拓展、做集群都會(huì)遇到一些問題。后來改為直接用Spark-streaming來更換計(jì)算服務(wù),用filter和aop替代javaagent來做字節(jié)碼增強(qiáng)。
上文提到一鍵生成可以運(yùn)行的java工程,這是我們開發(fā)了一個(gè)jee-template,后期也會(huì)針對(duì)發(fā)布系統(tǒng)和監(jiān)控系統(tǒng)開發(fā)源代碼。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:河貍家運(yùn)維發(fā)展的歷程
本文網(wǎng)址:http://www.ezxoed.cn/html/news/10515519961.html