Elasticsearch 的前世今生 【转】
原文地址:http://www.sohu.com/a/324768840_100299155
01
需求的誕生
劉備一大早就來(lái)到了公司,一看張飛和關(guān)羽已經(jīng)在公司了,就問(wèn)道:“兩位賢弟,今天來(lái)的還蠻早啊?!?/p>
張飛一聽(tīng)就炸毛了,“大哥,你讓我和二哥去做什么搜索功能,我們已經(jīng)一晚沒(méi)睡了,昨天就沒(méi)回去好嘛?!?/p>
關(guān)羽也來(lái)氣,“大哥,是啊,我們剛剛才上線電商網(wǎng)站,你這邊又要加什么需求,現(xiàn)在用數(shù)據(jù)庫(kù)檢索不是好好的么,能不能讓我們歇口氣。”
“兩位兄弟辛苦了,我也不想啊,最近咱們一單生意都沒(méi)有啊。昨天我和一位朋友聊,他說(shuō)我們的網(wǎng)站很不好用,找不到他想要的鞋,結(jié)果只好去別的地方買了。
不過(guò)他給我推薦了一位黑客高手,叫諸葛亮的家伙,說(shuō)是啥都得懂,我們今天找他取經(jīng)去。”
02
三顧茅廬
三人一行來(lái)找諸葛亮,不過(guò)前面兩次都碰了壁。
據(jù)諸葛亮?xí)f(shuō),諸葛亮不在家,到了第三次,還是不在家。張飛仔細(xì)一聽(tīng),明明是有人在家啊,而且玩游戲喊的聲音還這么大,張飛怒了,搭梯子把諸葛亮家的保險(xiǎn)給拔了。諸葛亮正郁悶?zāi)?#xff0c;咋停電了呢?算了,今天沒(méi)得玩了,于是讓書童請(qǐng)他們進(jìn)來(lái)。
“在下諸葛名亮,字孔明,不知三位...”,三人一說(shuō),是這么這么回事。諸葛亮一聽(tīng),“哦,原來(lái)是這么這么回事啊,你們的網(wǎng)站我剛看了,你們家的草鞋品種確實(shí)不 Nan 少 Kan。
如今客戶上網(wǎng)站找東西,都是先用網(wǎng)站的搜索來(lái)搜一下,但是你們網(wǎng)站的搜索功能實(shí)在是太 La 弱 Ji,明擺在那里的商品我都搜不出來(lái),實(shí)在是大問(wèn)題啊。”
“這樣啊,我看你們仨都是好人,給你們推薦一個(gè)好東西,叫做 Elasticsearch,這個(gè)肯定可以幫助你們?!?/p>
“翼德,把先生放下來(lái)吧?!?/p>
“是,大哥。二哥,你把刀也放下吧。”
關(guān)羽一聽(tīng),好像在哪里聽(tīng)說(shuō)過(guò) Elasticsearch,“大哥,這個(gè)東西好像有點(diǎn)耳熟啊,哦,諸葛亮先生這一說(shuō),我倒是記起來(lái)了,隔壁公司的呂布最近神神秘秘的,好像就是在用這個(gè),難怪他們最近公司業(yè)務(wù)好的很”。
03
Elasticsearch 的故事
諸葛亮清了清嗓子,又從抽屜里摸出一把扇子,“還是讓我來(lái)給你們講講吧”。
“Elasticsearch 以前叫 Elastic Search。顧名思義,就是“彈性的搜索”。很明顯,它一開(kāi)始是圍繞著搜索功能,打造了一個(gè)分布式搜索引擎,底層是基于開(kāi)源的搜索引擎庫(kù) Lucene,是由 Java 語(yǔ)言編寫的,項(xiàng)目大概是 2010 年 2 月份在 Github 正式落戶的。
咳咳,有必要首先給你介紹一下 Lucene。
Lucene 是一個(gè)非常古老的搜索引擎工具包,也是用 Java 編寫,主要用來(lái)構(gòu)建倒排索引(一種數(shù)據(jù)結(jié)構(gòu))和對(duì)這些索引進(jìn)行檢索,從而實(shí)現(xiàn)全文檢索功能。
Lucene 很強(qiáng)大,使用起來(lái)也非常靈活,缺點(diǎn)是它僅僅是一個(gè)基礎(chǔ)類庫(kù),也沒(méi)有考慮到高并發(fā)和分布式的場(chǎng)景。
如果你想在自己的程序里面使用 Lucene,還是需要做很多工作,并且涉及很多搜索原理和索引數(shù)據(jù)結(jié)構(gòu)的知識(shí),這就給我們帶來(lái)了不少挑戰(zhàn)。所以,Lucene 的上手時(shí)間一般都比較長(zhǎng)?!?/p>
關(guān)羽插了一句,“Lucene 我知道,確實(shí)賊難用,使用起來(lái)一堆問(wèn)題啊,我之前試過(guò)來(lái)著?!?關(guān)羽說(shuō)完,臉又紅了。
諸葛亮接著說(shuō)?!皶r(shí)間一晃來(lái)到 2004 年,有一個(gè)以色列小伙子,名字叫謝伊·班農(nóng)( Shay Banon),他成親不久來(lái)到倫敦,因?yàn)楫?dāng)時(shí)他的夫人正好在倫敦學(xué)廚師。
初來(lái)乍到,也沒(méi)有找到工作,于是班農(nóng)就打算寫一個(gè)叫作 iCook 的小程序來(lái)管理和搜索菜譜,一來(lái)練練手,方便找工作;二來(lái)這個(gè)小工具還可以給其夫人用。
班農(nóng)在編寫 iCook 的過(guò)程中,使用了 Lucene,感受到了直接使用 Lucene 開(kāi)發(fā)程序的各種暴擊和痛苦,于是他在 Lucene 之上,封裝了一個(gè)叫作 Compass 的程序框架,與 Hibernate 和 JPA 等 ORM 框架進(jìn)行集成,通過(guò)操作對(duì)象的方式來(lái)自動(dòng)地調(diào)用 Lucene 以構(gòu)建索引。
這樣做的好處是,可以很方便地實(shí)現(xiàn)對(duì)‘領(lǐng)域?qū)ο蟆M(jìn)行索引的創(chuàng)建,并實(shí)現(xiàn)‘字段級(jí)別’的檢索,以及實(shí)現(xiàn)‘全文搜索’功能。可以說(shuō),Compass 大大簡(jiǎn)化了給 Java 程序添加搜索功能的開(kāi)發(fā)。Compass 開(kāi)源出來(lái),變得很流行。
在 Compass 編寫到 2.x 版本的時(shí)候,社區(qū)里面出現(xiàn)了更多需求,比如需要有處理更多數(shù)據(jù)的能力以及分布式的設(shè)計(jì)。班農(nóng)發(fā)現(xiàn)只有重寫 Compass ,才能更好地實(shí)現(xiàn)這些分布式搜索的需求,于是 Compass 3.0 就沒(méi)有了,取而代之的是一個(gè)全新的項(xiàng)目,也就是 Elasticsearch?!?/p>
04
讓人怦然心動(dòng)的 Elasticsearch
看到劉備三人聽(tīng)的入迷,諸葛亮輕揮羽扇,繼續(xù)說(shuō)了下去。
“得益于 Compass 項(xiàng)目的積累,Elasticsearch 問(wèn)世之初就考慮到了功能的易用性。
Elasticsearch 作為一個(gè)獨(dú)立的搜索服務(wù)器,提供了非常方便的搜索功能。用戶完全不用關(guān)心底層 Lucene 的細(xì)節(jié),只需要通過(guò)標(biāo)準(zhǔn)的 Http+RESTful 風(fēng)格的 API,就可以進(jìn)行索引數(shù)據(jù)的增刪改查。數(shù)據(jù)的輸入輸出采用 JSON 格式,以文檔和面向?qū)ο蟮姆绞?#xff0c;這樣就能非常方便地理解和表達(dá)領(lǐng)域數(shù)據(jù)。”
張飛一拍桌子,“Elasticsearch 簡(jiǎn)直就是一個(gè) Compass 的 RESTful 實(shí)現(xiàn)啊!”
“沒(méi)錯(cuò)。同時(shí),Elasticsearch 基于分片和副本的方式實(shí)現(xiàn)了一個(gè)分布式的 Lucene Directory,再結(jié)合Map-reduce 的理念,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的搜索請(qǐng)求分發(fā)合并的策略,能輕松化解海量索引和分布式高可用的問(wèn)題。
可以說(shuō),僅僅依靠這兩點(diǎn),Elasticsearch就已經(jīng)秒殺了當(dāng)時(shí)市面上所有的搜索引擎服務(wù)或是程序庫(kù),我當(dāng)時(shí)看到 Elasticsearch 也眼前一亮。
如今,Elasticsearch 基本上已經(jīng)是搜索引擎市場(chǎng)排名第一的產(chǎn)品了,從 DB-Engines 網(wǎng)站的排名可以看到,Elasitcsearch 基本上是一騎絕紅塵,拉開(kāi)第二名遠(yuǎn)遠(yuǎn)一大截?!?/p>
05
ELK 橫空出世
諸葛亮口水狂飆,顯得很興奮,“如果只是 Elasticsearch 單獨(dú)使用,那我們的故事也就結(jié)束了,事實(shí)上好戲這才剛剛開(kāi)始。俗話說(shuō),一個(gè)好漢三個(gè)幫,開(kāi)源社區(qū)亦是如此?!?/p>
“這一個(gè)好漢三個(gè)幫,說(shuō)的不就是咱仨嘛?!?劉備接過(guò)話茬。
“別打岔,”諸葛亮繼續(xù)說(shuō),“這里我要說(shuō)的是 ‘ELK’ 的出現(xiàn),不過(guò)首先我要給你們講講 Logstash?!?/p>
Logstash 是一個(gè)開(kāi)源的日志處理工具,用 JRuby 寫的,主要特點(diǎn)是基于靈活的 Pipeline 管道架構(gòu)來(lái)處理數(shù)據(jù)。
什么意思呢?可以理解為將數(shù)據(jù)放進(jìn)一個(gè)管道內(nèi)進(jìn)行處理,并且就跟真正的自來(lái)水管一樣,管道由一截一截管子組成,每一個(gè)小管代表著一個(gè)數(shù)據(jù)處理的流程,每一個(gè)流程只做一件事情,然后可以根據(jù)數(shù)據(jù)的處理需要,選擇多個(gè)不同類型的管子靈活組裝。
Logstash 社區(qū)非?;钴S,支持多種輸入數(shù)據(jù)源和多種輸出數(shù)據(jù)源。一開(kāi)始, Elasticsearch 只是作為其中一個(gè)輸出的存儲(chǔ),主要用于日志數(shù)據(jù)的存儲(chǔ)。
不過(guò),隨著大家把日志發(fā)送到 Elasticsearch 之后,大家發(fā)現(xiàn)這家伙用起來(lái)很方便嘛,不僅能夠存儲(chǔ)大量的數(shù)據(jù),水平伸縮還很方便。更關(guān)鍵的是,你能夠很方便地把數(shù)據(jù)找出來(lái),也就是進(jìn)行全文搜索。
全文搜索在日志分析里面是非?;A(chǔ)的一個(gè)功能,通過(guò)一個(gè)關(guān)鍵字就能定位具體的詳細(xì)日志,相比存放到關(guān)系型數(shù)據(jù)庫(kù)和普通的文件存儲(chǔ),Elasticsearch 優(yōu)勢(shì)非常明顯。于是 Logstash 搭配 Elasticsearch 變得很受歡迎。
06
Kibana 的故事
不過(guò) Logstash 自帶的 UI 查詢?nèi)罩镜慕缑嬗悬c(diǎn)簡(jiǎn)陋,于是有一個(gè)叫作 Rashid Khan 的運(yùn)維工程師表示完全忍不了了,用 PHP 寫了一個(gè)叫作 Kibana 的程序,一個(gè)更好看和更好用的前端界面。PHP 寫完一版,他又用 Ruby 寫一版,后面又用 AngularJS 寫了一版,不僅有日志的搜索和查看,還加上了一些統(tǒng)計(jì)展示功能。
Kibana 的名字其實(shí)是倆個(gè)水果的名字的組合(Kiwi+Banana)。
張飛聽(tīng)到這里:“工作不飽和啊這家伙”。孔明瞪了他一眼,繼續(xù)說(shuō)道。
這個(gè)時(shí)候,Elasticsearch 已經(jīng)有 Facet 概念,也就是分面統(tǒng)計(jì)( 注:1.0 之后推出了 Aggregation 來(lái)代替 Facet),可以對(duì)數(shù)據(jù)里面的某個(gè)字段進(jìn)行單個(gè)維度的統(tǒng)計(jì),支持多種統(tǒng)計(jì)類型。
比如, TermFacet 可以計(jì)算字段里面某些值出現(xiàn)了多少次;Histogram Facet 還可以按時(shí)間區(qū)間進(jìn)行匯總統(tǒng)計(jì)等。
這些統(tǒng)計(jì)功能在前端 UI 就可以被利用起來(lái),展示一些餅圖、時(shí)間曲線等等,在運(yùn)維的分析里面自然也都是需要的。慢慢的 Kibana 越做越復(fù)雜,支持的功能越來(lái)越多,Kibana 3 變得流行起來(lái)。
于是乎,ELK 橫空出世(Elasticsearch、Logstash 和 Kibana 這三個(gè)產(chǎn)品的首字母縮寫),風(fēng)靡了整個(gè)運(yùn)維界。
故事講到這里,相信你們對(duì)于 Elasticsearch 就有了一個(gè)大概的認(rèn)識(shí),可以用它做搜索,也可以用它做日志?!?/p>
張飛點(diǎn)點(diǎn)頭,“還是相當(dāng)?shù)膹?qiáng)悍嘛?!?/p>
07
Elastic Stack 平臺(tái)的魅力
“不過(guò),這還沒(méi)完?!敝T葛亮吞了吞口水,繼續(xù)說(shuō)。
“Elastic 后面又引入了 Beats 家族。這是一系列非常輕量級(jí)的數(shù)據(jù)收集端,我給你介紹幾個(gè)比較典型的,比如:
- Packetbeat 可以實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)卡流量,并實(shí)時(shí)解析網(wǎng)絡(luò)協(xié)議數(shù)據(jù),可用來(lái)做 NPM 網(wǎng)絡(luò)數(shù)據(jù)分析;
- Metricbeat 可以用來(lái)收集服務(wù)器,以及服務(wù)器上部署的應(yīng)用服務(wù)的各項(xiàng)監(jiān)控指標(biāo)數(shù)據(jù),這樣就可以替代 Zabbix 等傳統(tǒng)的監(jiān)控軟件,來(lái)做服務(wù)器的性能指標(biāo)分析;
- Auditbeat可以實(shí)時(shí)收集服務(wù)器的行為事件,用于安全方面的入侵檢測(cè)和安全日志審計(jì)分析;
- Winlogbeat用于 Windows 平臺(tái)的事件日志收集;
- Filebeat 用于日志文件的收集等。
Elasticsearch、Logstash、Kibana、Beats ,這幾個(gè)放在一起,就叫作 Elastic Stack。
如今,Elastic 的版圖越來(lái)越大,前年,Elastic 收購(gòu) Opbeat,開(kāi)源了業(yè)界第一個(gè)完整的 APM 解決方案,通過(guò)探針可以實(shí)現(xiàn)無(wú)侵入的代碼級(jí)別的應(yīng)用性能監(jiān)控;
去年7月又收購(gòu)了代碼搜索 Insight.IO,后續(xù)可以實(shí)現(xiàn)代碼級(jí)別的語(yǔ)義檢索。今年又收購(gòu)了一個(gè)做終端安全的廠商 Endgame。這樣 Elastic Stack 這一個(gè)平臺(tái)就可以同時(shí)做到:
- 日志分析
- 性能指標(biāo)分析
- 安全日志分析
- APM 應(yīng)用性能分析
- NPM 網(wǎng)絡(luò)性能分析
- 網(wǎng)站站內(nèi)搜索
- 企業(yè)級(jí)搜索
- 代碼搜索
- 實(shí)時(shí) BI 業(yè)務(wù)分析
- SIEM 解決方案
- 終端設(shè)備安全
- ......
試想一下:
在一個(gè)風(fēng)和日麗的下午,你手機(jī)上收到一條告警短信,于是點(diǎn)擊鏈接,打開(kāi) Kibana 的監(jiān)控儀表盤,發(fā)現(xiàn)某臺(tái)服務(wù)器的 CPU 達(dá)到 100% 了。
于是,你順手點(diǎn)擊過(guò)濾這臺(tái)服務(wù)器的所有相關(guān)信息,可以看到相關(guān)的日志顯示,是這臺(tái)服務(wù)器上面部署的某一個(gè)業(yè)務(wù)服務(wù)的 QPS 有顯著下降,然后過(guò)濾到這個(gè)業(yè)務(wù)的日志,發(fā)現(xiàn)有很多異常的日志信息,前端 Nginx 代理日志還顯示有很多請(qǐng)求被拒絕,看樣子是后端的微服務(wù)處理能力達(dá)到瓶頸。
這個(gè)時(shí)候,繼續(xù)點(diǎn)擊 APM 的分析面板,切換到事務(wù)和會(huì)話分析界面,看到有很多數(shù)據(jù)庫(kù)鏈接處于開(kāi)啟狀態(tài)。
你點(diǎn)擊查看調(diào)用代碼,立馬就找到了性能瓶頸的原因,原來(lái)是某個(gè)類的某個(gè)方法調(diào)用 MySQL 卻沒(méi)有及時(shí)釋放鏈接造成了泄露,于是修改這行代碼,提交上線,問(wèn)題解決。然后,你可以若無(wú)其事地繼續(xù)瀏覽相親網(wǎng)站啦。
盡管這是一個(gè)假想的例子,但是可以看到,基于 Elastic Stack ,你可以覆蓋一整套完整的,從全局性能監(jiān)控到具體代碼級(jí)別的排障和解決問(wèn)題的過(guò)程,并且使用起來(lái)要比很多現(xiàn)有的方案更加高效和便捷。
好了,現(xiàn)在你們是否對(duì) Elasticsearch 已經(jīng)有了一個(gè)初步的了解呢?是不是也有躍躍欲試的打算?”
劉備點(diǎn)點(diǎn)頭:“今天來(lái)先生這里真的是收獲不少,之前多有冒犯,還請(qǐng)多多包涵啊。”
關(guān)羽也說(shuō):“大哥,明天我就和三弟開(kāi)始研究 Elasticsearch,爭(zhēng)取早日改造好咱們的網(wǎng)站?!?/p>
“剛說(shuō)的相親網(wǎng)站要不也發(fā)我一下”,張飛連忙問(wèn)道。劉備沒(méi)好氣白了一眼張飛。
“天色已晚,告辭了!”
劉備三人作別孔明,各自高興的回家了。
“慢走不送,有空來(lái)喝茶啊。”
孔明抹了一把額頭,總算送走這仨了,恐怕從此江湖上估計(jì)要不平靜嘍。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/11136367.html
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch 的前世今生 【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring整合redis,通过sent
- 下一篇: Flink中的状态与容错