從零搭建一個(gè)基于 ELK 的日志姜性、指標(biāo)收集與監(jiān)控系統(tǒng)

為了使得私有化部署的系統(tǒng)能更健壯冬筒,同時(shí)不增加額外的部署運(yùn)維工作量恐锣,本文提出了一種基于 ELK 的開箱即用的日志和指標(biāo)收集方案。

在當(dāng)前的項(xiàng)目中舞痰,我們已經(jīng)使用了 Elasticsearch 作為業(yè)務(wù)的數(shù)據(jù)儲(chǔ)存侥蒙,同時(shí)利用 ansible、docker匀奏、jenkins 組合了一套快速部署的工具鞭衩。在配置好需要部署主機(jī)的 ssh 連接信息后,我們可以通過 jenkins 一鍵部署一個(gè) Elasticsearch 和 Kibana娃善。

這套系統(tǒng)遵循以下的設(shè)計(jì)原則:

Self-Contained Deployment:我們把所有的部署腳本论衍、配置文件、Jenkins 任務(wù)都打包到一個(gè)標(biāo)準(zhǔn)化的 Jenkins docker 包中聚磺,只要安裝到目標(biāo)的環(huán)境上坯台,即可把所有部署所需的工具都一次性帶入。Single Source of Truth:在 Jenkins 中內(nèi)嵌一個(gè) yaml 格式的配置文件管理器瘫寝,對(duì)于所有部署需要依賴的變量進(jìn)行統(tǒng)一管理蜒蕾,例如 xx 系統(tǒng)后端對(duì)外暴露的端口號(hào),只在 Jenkins 中配置一次焕阿,所有的腳本都會(huì)自動(dòng)讀取該變量咪啡。Configuration as Code, Infrastructure as Code:當(dāng)所有的配置確定下來后,后續(xù)的流程理論上是可以做到全自動(dòng)化的暮屡,所以所有的安裝都通過腳本來完成撤摸。

在私有化部署的環(huán)境中,日志的收集使用有幾個(gè)特點(diǎn):

需要能快速部署。由于客戶的數(shù)量較多准夷,我們需要能快速地部署監(jiān)控系統(tǒng)钥飞,監(jiān)控系統(tǒng)本身的運(yùn)維壓力需要較小。部署組件要簡單衫嵌,且健壯性強(qiáng)读宙。由于部署環(huán)境較為復(fù)雜,希望每個(gè)組件自身是健壯的楔绞,同時(shí)組件之間的交互盡量簡單论悴,避免復(fù)雜的網(wǎng)絡(luò)拓?fù)洹9δ苄詢?yōu)于穩(wěn)定性。由于日志和指標(biāo)信息本身在宿主主機(jī)和應(yīng)用上是有副本的,所以即時(shí)監(jiān)控系統(tǒng)的數(shù)據(jù)丟失了撰豺,影響也不大。但是如果系統(tǒng)能提供更多強(qiáng)大的功能察纯,對(duì)于分析是很有幫助的。性能要求不高针肥。由于私有化環(huán)境對(duì)接系統(tǒng)的容量和復(fù)雜度可控饼记,可以使用單機(jī)部署,同時(shí)查詢慢一些也沒關(guān)系慰枕。同時(shí)需要滿足幾個(gè)需求:

需要能采集分布式的日志具则,并且集中式地查看。需要能采集機(jī)器的基本信息具帮,例如 CPU博肋、磁盤,并進(jìn)行監(jiān)控蜂厅。最好能采集應(yīng)用的數(shù)據(jù)匪凡,例如導(dǎo)入數(shù)據(jù)的條目數(shù),并進(jìn)行監(jiān)控掘猿。最好能實(shí)現(xiàn)異常指標(biāo)的告警功能病游。

方案上有 3 個(gè)備選方案:

利用 ELK (Elasticsearch、Logstash稠通、Kibana) 做整體的監(jiān)控基礎(chǔ)組件衬衬,同時(shí)使用 Elastic 新推出的 beat 系列作為采集工具。

利用 Zabbix改橘、Open-Falcon 等運(yùn)維監(jiān)控工具進(jìn)行系統(tǒng)基礎(chǔ)組件的監(jiān)控滋尉。同時(shí)利用自定義指標(biāo),進(jìn)行數(shù)據(jù)的監(jiān)控和告警唧龄。

利用 TICK (Telegraph兼砖、InfluxDB奸远、Chronograf既棺、Kapacitor) 做整體的監(jiān)控基礎(chǔ)組件讽挟。

目前日志方面能比較好滿足需求的只有開源的 ELK 和商業(yè)化的 Splunk,如果 Splunk 的授權(quán)費(fèi)是預(yù)算可接受的丸冕,也可以使用方案 2耽梅、3 結(jié)合 Splunk 的方式來實(shí)現(xiàn)。但是目前來看 Splunk 高昂的授權(quán)費(fèi)并不是大部分公司可以接受的胖烛。方案 2 和 3 在需求上不能很好滿足日志的收集和查看功能眼姐,所以排除掉了。

需要能快速部署:通過我們的 Jenkins 可以實(shí)現(xiàn)一鍵部署的功能佩番。部署組件簡單:我們只部署 Elasticsearch 和 Kibana 組件众旗,同時(shí) Elasticsearch 本身作為最基礎(chǔ)的組件是自包含的,不依賴任何外部組件趟畏。而我們也不使用集群贡歧,只用單機(jī)部署,保證 Elasticsearch 部署的簡單和穩(wěn)定赋秀。功能性優(yōu)于穩(wěn)定性:雖然業(yè)務(wù)使用的 Elasticsearch 停留在 5.5.3 版本利朵,我們?nèi)罩静杉头治鍪褂玫?Elasticsearch 直接升級(jí)到 7.6.0 版本,同時(shí)后續(xù)的版本升級(jí)也可以較為激進(jìn)猎莲,如果遇到不兼容的情況绍弟,也不需要保留已有數(shù)據(jù),刪除數(shù)據(jù)重新部署即可著洼。性能要求不高:使用單機(jī)部署樟遣,Elasticsearch 和 Kibana 部署在同一臺(tái)機(jī)器上。日志專用的 Elasticsearch身笤、Kibana年碘、Beat 為了避免日志使用的 ES 和業(yè)務(wù)使用的 ES 在資源或者配置上發(fā)生沖突,日志專用的 ES 單獨(dú)做了一個(gè)部署展鸡,使用約 3G 內(nèi)存屿衅。

我們在所有相關(guān)主機(jī)上使用 ansible 部署 filebeat 進(jìn)行日志的采集,為了簡化系統(tǒng)莹弊,我們也沒有使用 logstash 做日志的預(yù)處理涤久,只是簡單地配置了 filebeat 的配置文件,并加入了我們的 jenkins 一鍵部署套件中忍弛。

由于日志直接通過 filebeat 收集到了 es 中响迂,我們使用 Kibana 就能直接進(jìn)行查看了。

我們在所有相關(guān)主機(jī)上使用 ansible 部署 metricbeat 進(jìn)行指標(biāo)的收集细疚,通過配置文件的配置蔗彤,可以采集到 docker 的資源使用、系統(tǒng) CPU、內(nèi)存然遏、磁盤贫途、網(wǎng)絡(luò)的使用狀態(tài),同時(shí)也開放了 statsd 格式的指標(biāo)收集端口待侵。

我們在網(wǎng)關(guān)機(jī)器上使用 ansible 部署 heartbeat 進(jìn)行主動(dòng)的資源可用性探測丢早,對(duì)系統(tǒng)相關(guān)的數(shù)據(jù)庫、http 服務(wù)等監(jiān)控其相應(yīng)狀態(tài)秧倾,并將其發(fā)送至默認(rèn)的 ES 儲(chǔ)存索引中怨酝。

Elasticsearch 的原生告警是付費(fèi)功能,為了搭建一個(gè)更通用的告警系統(tǒng)那先,這里用了一個(gè)開源的項(xiàng)目 elastalert 實(shí)現(xiàn)告警农猬。Elastalert 是 Yelp 公司(美國的大眾點(diǎn)評(píng))開發(fā)的基于 python 和 Elasticsearch 的告警系統(tǒng),可以對(duì)接的告警途徑很多售淡,但是大部分都是國外的工具例如 Slack斤葱、HipChat、PagerDuty勋又,所以我們目前只使用了最基礎(chǔ)的郵件告警功能苦掘。

Elastalert 可以配置多種告警類型,例如:

某條件連續(xù)觸發(fā) N 次(frequency 類型)楔壤。某指標(biāo)出現(xiàn)的頻率增加或者減少(spike 類型)鹤啡。N 分鐘未檢測到某指標(biāo)(flatline 類型)等。每個(gè)告警的配置核心其實(shí)是一個(gè) elasticsearch 的查詢語句蹲嚣,通過查詢語句返回的條目數(shù)來進(jìn)行判斷递瑰。

目前我們也只使用了最基礎(chǔ)的 frequency 類型告警。由于這個(gè)告警是針對(duì)特定幾個(gè)私有化部署的系統(tǒng)隙畜,所以我們提前配置好了若干個(gè)告警的配置文件抖部,在部署腳本中,如果沒有特別需求议惰,就全部復(fù)制到 elastalert 的系統(tǒng)中慎颗,不需要任何手工配置。

利用 Kibana 的可視化功能言询,我們可以針對(duì)每個(gè)業(yè)務(wù)系統(tǒng)創(chuàng)建一個(gè)監(jiān)控大盤俯萎,直觀地看到所有系統(tǒng)組件的情況,以及宿主主機(jī)的健康情況:

Kibana 配置自動(dòng)化 Kibana 當(dāng)中所有持久化了的配置都是一個(gè) Saved Object运杭,包括:快捷搜索夫啊、監(jiān)控大盤、可視化面板辆憔、索引配置撇眯。

我們在內(nèi)部的測試環(huán)境中配置好了一個(gè)監(jiān)控用的 Kibana 后报嵌,將配置文件通過 CI 系統(tǒng)定期導(dǎo)出儲(chǔ)存于 git 倉庫中,下一次更新基礎(chǔ)組件時(shí)熊榛,更新腳本就會(huì)自動(dòng)將對(duì)應(yīng)的 kibana 配置導(dǎo)入到私有化部署的環(huán)境中锚国,在部署時(shí)不需要任何手工配置,實(shí)現(xiàn) Infrastructure as Code来候。

擴(kuò)展監(jiān)控范圍 這套部署組件在擴(kuò)展上也是有一個(gè)標(biāo)準(zhǔn)流程的跷叉。

監(jiān)控更多的應(yīng)用組件 當(dāng)我們需要監(jiān)控新增的應(yīng)用組件時(shí)逸雹。

對(duì)于服務(wù)狀態(tài)营搅,我們可以簡單地將應(yīng)用組件的訪問地址加入 hearbeat 的配置中,就可以在監(jiān)控面板看到對(duì)應(yīng)組件的狀態(tài)了梆砸。對(duì)于應(yīng)用日志转质,我們可以將日志的文件路徑加入 filebeat 的配置中,就可以在 Kibana 中搜索到了帖世。監(jiān)控應(yīng)用相關(guān)的指標(biāo) 當(dāng)我們需要監(jiān)控應(yīng)用相關(guān)的指標(biāo)時(shí)休蟹,我們可以通過 statsd 的接口,將指標(biāo)發(fā)布至 metricbeat日矫,統(tǒng)一收集至 Elasticsearch 當(dāng)中赂弓。statsd 底層規(guī)則相對(duì)簡單,所以在每個(gè)編程語言中都有相應(yīng)的 SDK 可以直接使用哪轿,并沒有復(fù)雜的依賴:

但是目前 metricbeat 收集來的 statsd 信息是不支持 tag 的盈魁,所以還只能做一些簡單的指標(biāo)收集,并不能對(duì)同一指標(biāo)的不同維度做聚合分析窃诉。

增加服務(wù) tracing Elasticsearch 當(dāng)中也帶了 APM 服務(wù)這個(gè)暫時(shí)還沒有嘗試接入杨耙,如果可以使用的話,是一個(gè)性能監(jiān)控和分析的利器飘痛。

私有化部署的環(huán)境中珊膜,日志的收集和監(jiān)控不像互聯(lián)網(wǎng)產(chǎn)品一樣需要較強(qiáng)的性能和可擴(kuò)容性,開箱即用和功能的強(qiáng)大就較為重要宣脉。7.6.0 版本的 Elasticsearch 和 Kibana 在這方面能很好地滿足需求车柠,只需要對(duì)部署流程進(jìn)行標(biāo)準(zhǔn)化,并提前準(zhǔn)備好配置文件塑猖,就可以在半小時(shí)內(nèi)搭建好一整套監(jiān)控體系竹祷。

更多文章詳見:http://www.magedu.com/xwzx/linuxxx

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萌庆,隨后出現(xiàn)的幾起案子溶褪,更是在濱河造成了極大的恐慌,老刑警劉巖践险,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猿妈,死亡現(xiàn)場離奇詭異吹菱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)彭则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鳍刷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俯抖,你說我怎么就攤上這事输瓜。” “怎么了芬萍?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵尤揣,是天一觀的道長。 經(jīng)常有香客問我柬祠,道長北戏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任漫蛔,我火速辦了婚禮嗜愈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莽龟。我一直安慰自己蠕嫁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布毯盈。 她就那樣靜靜地躺著剃毒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奶镶。 梳的紋絲不亂的頭發(fā)上迟赃,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音厂镇,去河邊找鬼纤壁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捺信,可吹牛的內(nèi)容都是我干的酌媒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼迄靠,長吁一口氣:“原來是場噩夢啊……” “哼秒咨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掌挚,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤雨席,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吠式,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陡厘,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抽米,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糙置。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片云茸。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谤饭,靈堂內(nèi)的尸體忽然破棺而出标捺,到底是詐尸還是另有隱情,我是刑警寧澤揉抵,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布亡容,位于F島的核電站,受9級(jí)特大地震影響功舀,放射性物質(zhì)發(fā)生泄漏萍倡。R本人自食惡果不足惜身弊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一辟汰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱佛,春花似錦帖汞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淮逊,卻和暖如春催首,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泄鹏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工郎任, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人备籽。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓舶治,卻偏偏與公主長得像,于是被迫代替她去往敵國和親车猬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霉猛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345