99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀論大數(shù)據(jù)對運維的意義
論大數(shù)據(jù)對運維的意義
2016-10-01
收藏

論大數(shù)據(jù)對運維的意義

從三個層面論述大數(shù)據(jù)對運維的意義:

1、工程數(shù)據(jù),譬如工單數(shù)量,SLA 可用性,基礎資源,故障率,報警統(tǒng)計

2、業(yè)務數(shù)據(jù),譬如業(yè)務 DashBoard,Trace 調(diào)用鏈,業(yè)務拓撲切換,業(yè)務指標,業(yè)務基準數(shù)據(jù),業(yè)務日志挖掘

3、數(shù)據(jù)可視化

當然,這篇文章談的是運維都有哪些數(shù)據(jù),哪些指標,以及數(shù)據(jù)呈現(xiàn)。并沒有談及如何和大數(shù)據(jù)相關的架構(gòu)做整合,從而能讓這些數(shù)據(jù)真的變得活起來。

上面的文字算引子,在步入正式的探討前,有一點我覺得值得強調(diào):

雖然這里講的是如何將大數(shù)據(jù)思維/架構(gòu)應用于運維,平臺化運維工作,但是和大數(shù)據(jù)本質(zhì)上沒有關系,我們只是將大數(shù)據(jù)處理的方式和思想應用在運維工作上。所以,即使你現(xiàn)在所在的公司沒有數(shù)據(jù)團隊支撐,也是完全可以通過現(xiàn)有團隊完成這件事情的。

1 運維監(jiān)控現(xiàn)狀

很多公司的運維的監(jiān)控具有如下特質(zhì):

只能監(jiān)控基礎運維層次,通過 zabbit 等工具提供服務器,CPU,內(nèi)存等相關的監(jiān)控。這部分重要,但確實不是運維的核心。

對業(yè)務的監(jiān)控是最復雜的,而現(xiàn)在很多公司的要么還處于 Shell 腳本的刀耕火種階段,要么開發(fā)能力較強,但是還是東一榔頭西一棒子,不同的業(yè)務需要不同的監(jiān)控系統(tǒng),人人都可以根據(jù)的自己的想法開發(fā)一個監(jiān)控的工具也好,系統(tǒng)也好,平臺也好??傊潜容^凌亂的。

使用第三方的監(jiān)控平臺。這個似乎在 Rails/NodeJS/Pythone 相關語系開發(fā)的產(chǎn)品中比較常見。我不做過多評價,使用后冷暖自知。

當然也有抽象得很好的,比如點評網(wǎng)的運維監(jiān)控據(jù)說就做得相當好,運維很閑,天天沒事就根據(jù)自己的監(jiān)控找開發(fā)的茬,讓開發(fā)持續(xù)改進。不過他們的指導思想主要有兩個:

運維自動化。怎么能夠?qū)崿F(xiàn)這個目標就怎么搞,這嚴重依賴于搞的人的規(guī)劃能力和經(jīng)驗。

抽象化,根據(jù)實際面臨的問題做出抽象,得到對應的系統(tǒng),比如需要發(fā)布,于是又發(fā)布系統(tǒng),需要管理配置文件,所以有配管系統(tǒng),需要日志分析所以有了有日志分析系統(tǒng)。然而這樣是比較零散的。

有點扯遠,我們還是 focus 在監(jiān)控上。

如果以大數(shù)據(jù)的思維去思考,我們應該如何做好監(jiān)控這件事情?

2 羅列出你的數(shù)據(jù)源

所有的數(shù)據(jù)源都有一個共性,就是日志。無論文本的也好,二進制的也好。所以日志是整個信息的源頭。日志包含的信息足以讓我們追查到下面幾件事情:

系統(tǒng)健康狀況監(jiān)控

查找故障根源

系統(tǒng)瓶頸診斷和調(diào)優(yōu)

追蹤安全相關問題

從日志我們可以挖掘出什么?

我覺得抽象起來就一個:指標。

指標可以再進行分類:

業(yè)務層面,如團購業(yè)務每秒訪問數(shù),團購券每秒驗券數(shù),每分鐘支付、創(chuàng)建訂單等

應用層面,每個應用的錯誤數(shù),調(diào)用過程,訪問的平均耗時,最大耗時,95線等

系統(tǒng)資源層面,如 cpu、內(nèi)存、swap、磁盤、load、主進程存活等

網(wǎng)絡層面,如丟包、ping 存活、流量、tcp 連接數(shù)等

每個分類里的每個小點其實都是一個指標。

3 如何統(tǒng)一實現(xiàn)

千萬不要針對具體問題進行解決,大數(shù)據(jù)架構(gòu)上的一個思維就是:我能夠提供一個平臺讓大家方便解決這些問題么? 而不是,這個問題我能解決么?

先來看看架構(gòu)圖:

因為目前我負責應用層的研發(fā),業(yè)務還比較少,主要就需要監(jiān)控三個系統(tǒng):

1、推薦

2、搜索

3、統(tǒng)一查詢引擎

所以監(jiān)控的架構(gòu)設計略簡單些。如果你希望進行日志存儲以及事后批量分析,則可以采用淘寶的這套架構(gòu)方式:

稍微說明下,日志收集 Agent 可以使用 Flume,鷹眼 Storm 集群,其實就是 Storm 集群,當然有可能是淘寶內(nèi)部 Java 版的,Storm(或第一幅圖的 SparkStreaming)做兩件事情。

將日志過濾,格式化,或存儲起來

進行實時計算,將指標數(shù)據(jù)存儲到 HBase 里去

到目前為止,我們沒有做任何的開發(fā),全部使用大數(shù)據(jù)里通用的一些組件。至于這些組件需要多少服務器,就看對應的日志量規(guī)模了,三五臺到幾百臺都是可以的。

需要開發(fā)的地方只有兩個點,有一個是一次性的,有一個則是長期。

先說說一次性的,其實就是大盤展示系統(tǒng)。這個就是從 HBase 里取出數(shù)據(jù)做展示。這個貌似也有開源的一套,ELK。不過底層不是用的 HBase 存儲,而是 ES。這里就不詳細討論。

長期的則是 SparkStreaming(淘寶是使用 Storm,我建議用 SparkStreaming,因為 SparkStreaming 可以按時間窗口,也可以按量統(tǒng)一做計算),這里你需要定義日志的處理邏輯,生成我上面提到的各項指標。

這里有一個什么好處呢,就是平臺化了,對新的監(jiān)控需求響應更快了,開發(fā)到上線可能只要幾個小時的功夫。如果某個系統(tǒng)某天需要一個新的監(jiān)控指標,我們只要開發(fā)個 SparkStreaming 程序,丟到平臺里去,這事就算完了。

第一幅圖的平臺我是已經(jīng)實現(xiàn)了的。我目前在 SparkStreaming 上只做了三個方面比較基礎的監(jiān)控,不過應該夠用了。

狀態(tài)碼大盤。HTTP 響應碼的 URL(去掉 query 參數(shù))排行榜。比如你打開頁面就可以看到發(fā)生500錯誤的 top 100 的 URL,以及該 URL 所歸屬的系統(tǒng)。

響應耗時大盤。URL 請求耗時排行榜。比如你打開頁面就可以看到5分鐘內(nèi)平均響應耗時 top 100 的 URL(去掉 query 參數(shù))。

還有就是 Trace 系統(tǒng)。類似 Google 的 Dapper,淘寶的 EagleEye。給出一個唯一的 UUID,可以追蹤到特定一個 Request 的請求鏈路。每個依賴服務的響應情況,比如響應時間。對于一個由幾個甚至幾百個服務組成的大系統(tǒng),意義非常大,可以方便的定位出到底是那個系統(tǒng)的哪個 API 的問題。這個最大的難點是需要統(tǒng)一底層的 RPC/HTTP 調(diào)用框架,進行埋點。因為我使用的是自研的 ServiceFramework 框架,通訊埋點就比較簡單。如果是在一個業(yè)務線復雜,各個系統(tǒng)使用不同技術開發(fā),想要做這塊就要做好心理準備了。

現(xiàn)在,如果你想要監(jiān)控一個系統(tǒng)是不是存活,你不在需要取寫腳本去找他的 pid 看進程是不是存在,系統(tǒng)發(fā)現(xiàn)在一定的周期內(nèi)沒有日志,就可以認為它死了。而系統(tǒng)如果有異常,比如有大量的慢查詢,大盤一定能展示出來。

描述到這,我們可以看到,這套架構(gòu)的優(yōu)勢在哪:

基本上沒有需要自己開發(fā)的系統(tǒng)。從日志收集,到日志存儲,到結(jié)果存儲等,統(tǒng)統(tǒng)都是現(xiàn)成的組件。

可擴展性好。每個組件都是集群模式的,沒有單點故障。每個組件都是可水平擴展的,日志量大了,加機器就好。

開發(fā)更集中了。你只要關注日志實際的分析處理,提煉指標即可。

4 大數(shù)據(jù)思維

對于運維的監(jiān)控,利用大數(shù)據(jù)思維,需要分三步走:

1、找到數(shù)據(jù)

2、分析定義從數(shù)據(jù)里中我能得到什么

3、從大數(shù)據(jù)平臺中挑選你要的組件完成搭積木式開發(fā)

所有系統(tǒng)最可靠的就是日志輸出,系統(tǒng)是不是正常,發(fā)生了什么情況,我們以前是出了問題去查日志,或者自己寫個腳本定時去分析?,F(xiàn)在這些事情都可以整合到一個已有的平臺上,我們唯一要做的就是 定義處理日志的的邏輯 。

這里有幾點注意的:

如果你擁有復雜的產(chǎn)品線,那么日志格式會是一個很痛苦的事情。以為這中間 Storm(或者 SparkStreaming)的處理環(huán)節(jié)你需要做大量的兼容適配。我個人的意見是,第一,沒有其他更好的辦理,去兼容適配吧,第二,推動大家統(tǒng)一日志格式。兩件事情一起做。我一個月做不完,那我用兩年時間行么?總有一天大家都會有統(tǒng)一的日志格式的。

如果你的研發(fā)能力有富余,或者有大數(shù)據(jù)團隊支撐,那么可以將進入到 SparkStreaming 中的數(shù)據(jù)存儲起來,然后通過 SparkSQL 等做即席查詢。這樣,有的時候原先沒有考慮的指標,你可以直接基于日志做多維度分析。分析完了,你覺得好了,需要固化下來,那再去更新你的 SparkStreaming 程序。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }