自動(dòng)化運(yùn)維之日志系統(tǒng)第一篇 日志這件“小”事

轉(zhuǎn)載:來(lái)自趙班長(zhǎng)的自動(dòng)化運(yùn)維之日志這件“小”事


本文由 GOPS2017 北京站大會(huì)供稿并整理發(fā)布,高效運(yùn)維社區(qū)致力于陪伴您的職業(yè)生涯,與您一起愉快的成長(zhǎng)。

作者簡(jiǎn)介: ? ? ? ??

趙舜東

中國(guó)SaltStack用戶組發(fā)起人

江湖人稱(chēng):趙班長(zhǎng),曾在武警某部負(fù)責(zé)指揮自動(dòng)化的架構(gòu)和運(yùn)維工作,2008年退役后一直從事互聯(lián)網(wǎng)運(yùn)維工作,歷任運(yùn)維工程師、運(yùn)維經(jīng)理、運(yùn)維架構(gòu)師、運(yùn)維總監(jiān)?!禨altStack技術(shù)入門(mén)與實(shí)戰(zhàn)》作者,《運(yùn)維知識(shí)體系》作者,GOPS金牌講師,Exin DevOps Master認(rèn)證講師。

運(yùn)維在忙什么?

下面是一個(gè)運(yùn)維朋友日常工作中比較常見(jiàn)的一個(gè)場(chǎng)景:

開(kāi)發(fā):Hi,哥們,我剛才上線了一個(gè)新功能,幫我看一下運(yùn)行日志有沒(méi)有什么異?!?/p>

運(yùn)維:好的,馬上;

測(cè)試:Hi,兄弟,目前A接口的訪問(wèn)量掉了;幫我看下錯(cuò)誤日志有啥ERROR……

運(yùn)維:好的,稍等;

開(kāi)發(fā):Hi,好基友,幫我把我log目錄下的日志文件取下來(lái)……

運(yùn)維:好的,過(guò)會(huì)兒給你;

另外,我之前的運(yùn)維團(tuán)隊(duì),有的運(yùn)維一天到晚都忙這些東西;部署、執(zhí)行腳本、拿文件、awk分析日志等等,而且還忙的不行。

還有個(gè)做系統(tǒng)運(yùn)維的工程師的朋友,我問(wèn)他每天都忙什么。他說(shuō)每天拿日志占1/3的工作量;第二是部署、把代碼上傳服務(wù)器什么的。

那么運(yùn)維天天在忙什么呢?我想多半在處理日志相關(guān)的問(wèn)題吧~

日志需求

從日志來(lái)說(shuō),對(duì)于運(yùn)維來(lái)說(shuō)需要進(jìn)行哪些日志收集。對(duì)于這個(gè)問(wèn)題可以分為一下五個(gè)方面。

需求一:系統(tǒng)日志

首先是要掌握操作系統(tǒng)的運(yùn)行狀態(tài);系統(tǒng)日志非常有用。例如,一個(gè)內(nèi)存壞了你怎么能知道?一般內(nèi)存壞在系統(tǒng)上會(huì)有日志提示,或者寫(xiě)個(gè)閾值內(nèi)存低于多少報(bào)警。但是有時(shí)候內(nèi)存是8G的,壞了一根內(nèi)存條不知道;而且內(nèi)存條硬件日志上也是看不出來(lái)的。通過(guò)系統(tǒng)日志就可以發(fā)現(xiàn)該問(wèn)題。

需求二:訪問(wèn)日志

之前我們做廣告,訪問(wèn)日志對(duì)我們來(lái)說(shuō)就是命根子;我們要依賴(lài)訪問(wèn)日志拿到非常多的數(shù)據(jù)。以此來(lái)統(tǒng)計(jì)分析訪問(wèn)來(lái)源、url請(qǐng)求頻次、響應(yīng)時(shí)間以及成功率等等。

需求三:運(yùn)行日志

通過(guò)運(yùn)行日志我們可以了解到系統(tǒng)運(yùn)行詳情,運(yùn)行的異常以及業(yè)務(wù)的輸出日志。

需求四:錯(cuò)誤日志

你需要根據(jù)關(guān)鍵字來(lái)查找一些錯(cuò)誤日志。例如,很多時(shí)候發(fā)現(xiàn)日志和流量波動(dòng)是可以關(guān)聯(lián)上的;可以以此來(lái)做全流量分析。

需求五:關(guān)聯(lián)日志

最后就是業(yè)務(wù)關(guān)聯(lián)日志。這里舉個(gè)曾經(jīng)遇到過(guò)的一個(gè)例子。剛開(kāi)始做電商的時(shí)候,老板沒(méi)事過(guò)來(lái)問(wèn),平時(shí)我們每分鐘也就幾十單,問(wèn)我們?yōu)槭裁醋罱囊欢螘r(shí)間每分鐘一下子來(lái)了好幾百單。

其實(shí)當(dāng)時(shí)覺(jué)得挺奇怪的,為什么問(wèn)我呢。后來(lái)想想因?yàn)檫\(yùn)維做的不到位;你說(shuō)突然來(lái)了很多單子,運(yùn)營(yíng)也不知道,這個(gè)時(shí)候最容易知道的是運(yùn)維了。你可以通過(guò)各種手段判斷出這個(gè)訂單到底是干嘛的。

所以我認(rèn)為運(yùn)維的目標(biāo)是:“知其然,知其所以然”。比如說(shuō),如果老板問(wèn)你“為什么最近5分鐘這么多訂單”,你可以告訴他“是因?yàn)槲覀冏隽速I(mǎi)一送一的活動(dòng),很多人就來(lái)了”。

日志收集環(huán)境的痛點(diǎn)

先拋出一個(gè)問(wèn)題,為什么要做日志收集?開(kāi)發(fā)人員需要查詢(xún)?nèi)罩?;但是開(kāi)發(fā)人員不能有線上服務(wù)器登錄的權(quán)限。現(xiàn)在很多大公司也不允許運(yùn)維登錄線上機(jī)器了。因?yàn)閟sh登錄上去就可以干出和別人一樣的事情;就可能導(dǎo)致這個(gè)節(jié)點(diǎn)和其他節(jié)點(diǎn)不一樣,不一樣就出事了。

還有就是各個(gè)系統(tǒng)都有日志;日志數(shù)據(jù)分散難以查找。這個(gè)痛點(diǎn)有兩個(gè)方面的問(wèn)題需要解決;其一就是如何收集,其二就是標(biāo)準(zhǔn)化。

對(duì)于一個(gè)應(yīng)用系統(tǒng)你需要明白你要做哪些日志;在做需求日志調(diào)研的時(shí)候,把日志需求確定下來(lái)。之前我們有個(gè)用戶服務(wù),因?yàn)閴毫艽?;我們需要單?dú)拆分成為微服務(wù)。此時(shí)有兩種待選方案,第一種是RPC過(guò)程調(diào)用;

第二種是http協(xié)議。當(dāng)時(shí)研發(fā)考慮了運(yùn)維的需求,第一個(gè)是權(quán)限控制;第二個(gè)是監(jiān)控的需求。監(jiān)控的需求包括集群健康檢查以及調(diào)用和響應(yīng)的統(tǒng)計(jì)。

需求提出來(lái)后,除非做個(gè)框架,要不然RPC方式做不了;要不然只能選用http。因?yàn)橄到y(tǒng)將來(lái)是要運(yùn)行的;所以非功能的需求也是很大的一塊,在做需求的時(shí)候一定要把運(yùn)維的需求考慮進(jìn)去。

解決疼點(diǎn)的神器—ELK架構(gòu)起源

曾經(jīng)的ELK架構(gòu)

曾經(jīng)的ELK架構(gòu)是logstash、elasticsearch及kibana。在當(dāng)下的容器時(shí)代該怎么辦?我們之前的做法是在每臺(tái)物理機(jī)上都起一個(gè)docker。所有容器啟動(dòng)的時(shí)候,就可以獲取到容器相關(guān)的目錄;把目錄統(tǒng)一起來(lái)寫(xiě)在這個(gè)里面,該容器中l(wèi)ogstash把日志收走。這種方式?jīng)]有成本比較低,沒(méi)有什么技術(shù)瓶頸。

elasticsearch是基于lucene實(shí)現(xiàn)的分布式全文搜索引擎。elasticsearch提供原生的 java API;同時(shí),也提供restful的API。

logstash作為數(shù)據(jù)采集端;同時(shí),具備數(shù)據(jù)流的處理能力。kibana作為前端數(shù)據(jù)展示;可以呈現(xiàn)各種復(fù)雜數(shù)據(jù)結(jié)構(gòu),靈活度很高。

現(xiàn)在的Elastic Stack

現(xiàn)在ELK更名為Elastic Stack;因?yàn)閑lastic收購(gòu)了beats工具。beats工具可以做日志收集、網(wǎng)絡(luò)收集及流收集等,擴(kuò)大了整個(gè)生態(tài)圈。

目前elastic公司也在做SaaS,SaaS面對(duì)的是互聯(lián)網(wǎng)所有用戶也是未來(lái)大的趨勢(shì)。

ELK學(xué)習(xí)之elasticsearch入門(mén)

下面將介紹elasticsearch相關(guān)的基礎(chǔ)知識(shí)。elasticsearch集群有三種狀態(tài),分別是綠色、黃色和紅色。綠色表示所有的主、副分片都正常運(yùn)行。

這里涉及到分片的概念,elastisearch的分片其實(shí)是一個(gè)節(jié)點(diǎn)上lucene實(shí)例。elasticsearch一個(gè)索引默認(rèn)情況下分成五個(gè)分片和一個(gè)副本。

假設(shè)有兩臺(tái)機(jī)器,其中一臺(tái)機(jī)器掛了;原有的副本分片會(huì)被提升為主分片。通過(guò)這樣的方式來(lái)保證它的高可用。集群黃色表示所有主分片正常運(yùn)行;但是存在有問(wèn)題的副本分片。此時(shí)可能有副本分片丟失或沒(méi)有創(chuàng)建,但數(shù)據(jù)不會(huì)丟失。

紅色說(shuō)明集群存在主分片不正常運(yùn)行;這時(shí)可能有數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

elastisearch的集群發(fā)現(xiàn)最早是多播方式的,在后來(lái)的2.x版本中改成單播了;因?yàn)槎嗖グl(fā)現(xiàn)存在一些問(wèn)題?,F(xiàn)在的5.1版本都改成單播發(fā)現(xiàn)方式了。在綠色狀態(tài)下,當(dāng)集群增加一個(gè)節(jié)點(diǎn)后集群會(huì)自動(dòng)均衡分片,將部分分片遷移到剛加入的節(jié)點(diǎn)上。

索引的副本數(shù)量是可以調(diào)整;在節(jié)點(diǎn)數(shù)量一定的情況下只是增加冗余度,并不能提高性能。比如三個(gè)副本,這個(gè)時(shí)候同時(shí)掛兩臺(tái)機(jī)器都不會(huì)導(dǎo)致數(shù)據(jù)丟失;但是分片數(shù)量要根據(jù)規(guī)模進(jìn)行調(diào)優(yōu)。

節(jié)點(diǎn)宕機(jī)了怎么辦?其實(shí)elasticsearch這是很正常的。如果主節(jié)點(diǎn)掛了,集群會(huì)重新選取一個(gè)master。選主完成后集群中分片會(huì)自動(dòng)均衡。如有副本分片丟失,會(huì)自動(dòng)創(chuàng)建新的副本分片。

elasticsearch所有節(jié)點(diǎn)都接受查詢(xún)請(qǐng)求,查詢(xún)請(qǐng)求被調(diào)度到各個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)檢索;各個(gè)節(jié)點(diǎn)返回結(jié)果并合并響應(yīng)查詢(xún)請(qǐng)求。查詢(xún)過(guò)程如下圖所示。

ELK學(xué)習(xí)之logstash入門(mén)

下面介紹如何使用logstash進(jìn)行日志收集,并講一些案例。這是一個(gè)logstash的hello world,直接在命令行輸出。logstash有三個(gè)模塊,分別是input、filter和output。數(shù)據(jù)input存stdin;從標(biāo)準(zhǔn)輸入進(jìn)來(lái),到標(biāo)準(zhǔn)輸出。這里面加了編碼,輸入hello world效果就是這樣;你的數(shù)據(jù)在message中,同時(shí)logstash會(huì)加一個(gè)時(shí)間戳。

再看一個(gè)案例,我從標(biāo)準(zhǔn)輸入直接寫(xiě)入elasticsearch怎么寫(xiě)。這里寫(xiě)一個(gè)文件,input標(biāo)準(zhǔn)輸入;然后是output。output中使用一個(gè)插件將其寫(xiě)入elasticsearch;還有個(gè)標(biāo)準(zhǔn)輸出,通過(guò)rubydebug展示出來(lái)。學(xué)習(xí)logstash主要是學(xué)習(xí)各種插件的使用。比如第一個(gè)要收集系統(tǒng)日志;系統(tǒng)日志文件從哪里來(lái),使用input插件。數(shù)據(jù)要寫(xiě)到elasticsearch里面去,通過(guò)output中的插件實(shí)現(xiàn)。

在新版本的ELK中,logstash、elasticsearch以及kibana的版本都統(tǒng)一了;學(xué)習(xí)可以直接看官方文檔。

我們看一個(gè)demo案例。demo案例是輸入什么東西,輸入到ES里面;同時(shí)輸出到當(dāng)前的rubydebug。這里logstash裝了一個(gè)elasticsearch插件;目前elasticsearch里面有兩個(gè)索引。你不寫(xiě)索引名會(huì)自動(dòng)生成索引名,后面自帶時(shí)間戳。最簡(jiǎn)單日志收集方式就是一個(gè)文件,把它直接寫(xiě)到elasticsearch中。

下一個(gè)是使用消息隊(duì)列做日志收集的解耦;這個(gè)架構(gòu)是目前經(jīng)典的架構(gòu)。數(shù)據(jù)源寫(xiě)在input里面,用個(gè)插件把數(shù)據(jù)采集到;然后output用消息隊(duì)列插件把數(shù)據(jù)寫(xiě)到消息隊(duì)列中。logstash有很多消息隊(duì)列插件,例如kafka、rabbitmq、zeromq等。

什么是解耦?解耦之后后端所有的東西都掛了,只要消息隊(duì)列不掛這個(gè)日志就不會(huì)丟;因?yàn)槿珜?xiě)在消息隊(duì)列中。消息隊(duì)列可以通過(guò)集群保證不會(huì)掛。

再者通過(guò)解耦可以做什么呢?數(shù)據(jù)原封不動(dòng)收到消息隊(duì)列中,我不在采集的實(shí)例上處理。如果那樣做的話,當(dāng)數(shù)據(jù)量很大的情況下,這時(shí)候CPU的就可能扛不住而影響到業(yè)務(wù)的正常。

我們?cè)谙㈥?duì)列之后接上logstash進(jìn)行消費(fèi),寫(xiě)入elasticsearch。在logstash的filter模塊對(duì)數(shù)據(jù)進(jìn)行處理。同時(shí),可以根據(jù)消費(fèi)的情況起多個(gè)消費(fèi)者實(shí)例。

ELK 學(xué)習(xí)之 kibana 簡(jiǎn)介與 ELK 企業(yè)實(shí)踐

kibana介紹

簡(jiǎn)單介紹一下kibana,原因是沒(méi)有數(shù)據(jù)就沒(méi)法作圖。實(shí)際上kibana作圖相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,千萬(wàn)不要擔(dān)心學(xué)不會(huì);只要有數(shù)據(jù)肯定就能學(xué)會(huì)。

kibana的圖簡(jiǎn)單看一下;它有查看時(shí)間的范圍,例如今天。經(jīng)常有人說(shuō),我剛寫(xiě)的日志為什么沒(méi)有;就是因?yàn)闀r(shí)間的問(wèn)題。有很多相對(duì)絕對(duì)的時(shí)間范圍;所有的搜索都是可以保存下來(lái)的,保存的搜索語(yǔ)句可以做其他相關(guān)的作用。這樣的話,你在做可視化的時(shí)候就可以拿來(lái)用了。比如我們創(chuàng)建一個(gè)可視化圖形,我們數(shù)據(jù)能夠做簡(jiǎn)單統(tǒng)計(jì)多少行;你可以從一個(gè)已保存的搜索來(lái)實(shí)現(xiàn)。

還有你可以將多個(gè)可視化視圖放到dashboard中;同時(shí),dashboard也是可以保存復(fù)用的。通過(guò)kibana可以做很好看的大盤(pán)。比如我們之前做過(guò)的業(yè)務(wù)的大盤(pán)、運(yùn)維的大盤(pán);一邊是值班表,一邊是用戶分鐘注冊(cè)數(shù)、用戶日活餅圖、核心數(shù)據(jù)庫(kù)日志等等類(lèi)似的東西。

ELK企業(yè)實(shí)踐

這是基于elasticsearch做的架構(gòu)圖;主要部分是收集消息隊(duì)列和不同的存儲(chǔ)。因?yàn)閘ogstash的插件比較多,所以所有的東西都要通過(guò)logstash來(lái)處理。目前ELK相關(guān)的書(shū)籍就是《ELK權(quán)威指南》,有紙質(zhì)版的也有免費(fèi)的PDF版,大家可以看一看。

整體學(xué)習(xí)ELK記住我說(shuō)的幾句話;整個(gè)工具不是重點(diǎn),重點(diǎn)是怎么在公司推日志標(biāo)準(zhǔn)化。因?yàn)槿罩静粯?biāo)準(zhǔn),收集一推亂七八糟的日志沒(méi)用;讓后短發(fā)揮價(jià)值的事情全都做不了。然后是通過(guò)工具做統(tǒng)一的采集。

logstash還可以做報(bào)警處理;比如根據(jù)關(guān)鍵字發(fā)一個(gè)什么東西到指定的地方。你自己也可以做把所有的日志寫(xiě)到elasticsearch中,然后調(diào)用elasticsearch;如果發(fā)現(xiàn)關(guān)鍵字就報(bào)警,這也是一種方式。

舉個(gè)例子,我們的流量突然有一個(gè)小坑,這個(gè)時(shí)候你去查nginx錯(cuò)誤日志發(fā)現(xiàn)有。去查php日志也有,再去查mysql慢查詢(xún)也是有。mysql慢查詢(xún)需要正則匹配;然后很多人跑過(guò)來(lái)問(wèn)我正則寫(xiě)的對(duì)不對(duì)。這時(shí)候就很崩潰了。所以建立日志標(biāo)準(zhǔn)化至關(guān)重要。

更多相關(guān)文章閱讀

騰訊十年運(yùn)維老兵:運(yùn)維團(tuán)隊(duì)的五個(gè)“殺手锏”

用 Python 開(kāi)發(fā)一個(gè)企業(yè)級(jí)的監(jiān)控平臺(tái)

那些早到10分鐘的人,混的都不會(huì)太差

芳華永在!一個(gè)老運(yùn)維的20年奮斗史

想近距離領(lǐng)略“趙班長(zhǎng)”的風(fēng)采?

來(lái) GOPS2018深圳站·運(yùn)維自動(dòng)化專(zhuān)場(chǎng)??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容