You know, for search--帶你認識Elasticsearch

Elasticsearch作為當(dāng)前流行分布式的搜索引擎,被廣泛應(yīng)用于日志檢索,指標(biāo)采集,APM,安全分析等領(lǐng)域。本文將對Elastic Stack的發(fā)展歷程,基本原理,產(chǎn)品生態(tài),主要功能和應(yīng)用場景進行總結(jié),以幫助大家對Elastic生態(tài)的前世今生能有一個清晰的了解。

1. 發(fā)展歷程

1.1 美好的事物總有一個浪漫的開始

許多年前,一個叫Shay Banon的年輕人想為正在學(xué)習(xí)廚藝的新婚妻子編寫一款菜譜搜索軟件。在開發(fā)過程中,他發(fā)現(xiàn)搜索引擎庫Lucene不僅使用門檻高,還有會有許多重復(fù)性工作。因此他決定在lucene基礎(chǔ)之上封裝一個簡單易用的搜索應(yīng)用庫,并命名為Compress。Elasticsearch的前身就在這樣浪漫的機緣下誕生了。

1.2 分布式為其注入了新的活力

之后shay找到了一份工作,工作內(nèi)容涉及到大量的高并發(fā)分布式場景,于是他決定重寫Compress,引入了分布式架構(gòu),并更名為Elasticsearch。Elasticsearch的第一個版本發(fā)布于2010年5月,發(fā)布后公眾反響強烈。

1.3 開源力量助其騰飛

Elasticsearch在github上發(fā)布后,使用量驟增,并很快有了自己的社區(qū)。很快,社區(qū)中的 Steven Schuurman、Uri Boness 和 Simon Willnauer 與Shay Banon 一起成立了一家搜索公司Elasticsearch Inc.。

在Elasticsearch Inc.公司成立前后,另外兩個開源項目也正在快速發(fā)展。一個是Jordan Sissel的開源可插拔數(shù)據(jù)采集工具Logstash, 另一個是Rashid Khan的開源數(shù)據(jù)可視化UI Kibana。由于作者間對彼此產(chǎn)品比較熟悉,因此決定合作發(fā)展,最終形成了Elastic Stack的經(jīng)典技術(shù)棧ELK: Elasticsearch, Logstash, Kibana

1.4 快速成長

之后Elasticsearch迅速發(fā)展,增加了許多新功能和特性

版本 發(fā)布日志 重要特性
0.7.0 2010.5.14 github上第一個版本
1.0.0 2014.2.14 備份恢復(fù),聚合,熔斷器,docvalues等
2.0.0 2015.10.28 組件版本統(tǒng)一,推出Elastic Cloud等
5.0.0 2016.10.26 商業(yè)組件整合為x-pack;使用Lucene6.0引入BKD樹,稀疏數(shù)據(jù)優(yōu)化等; beat引入module概念; 增加machine learning功能; shrink API; ingest node; painless 腳本等
6.0.0 2017.8.31 稀疏性docvalues支持,index sorting, sequence num, 滾動升級等
7.0.0 2019.4.10 引入新的集群協(xié)調(diào)層zen2; real內(nèi)存熔斷器等

2018年美東時間10月5日上午 9:30 整,紐約證券交易所的鈴聲響起,Elastic 成功上市。

2. 基本原理

2.1 最初的想法

Elasticsearch是一個分布式搜索引擎,底層使用Lucene來實現(xiàn)其核心搜索功能。雖然當(dāng)前Elasticsearch擁有的眾多的功能和解決方案,但是其核心仍然是全文檢索。

  • 什么是全文檢索?

生活中的數(shù)據(jù)可以分為結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。結(jié)構(gòu)化數(shù)據(jù)是指格式和長度固定的數(shù)據(jù),如一個人的年齡,姓名等。非結(jié)構(gòu)化數(shù)據(jù)是指格式和長度不固定的數(shù)據(jù),如一個文章的內(nèi)容等。

對于結(jié)構(gòu)化數(shù)據(jù),可以存儲在DB中通過精確匹配找到。但是對于非結(jié)構(gòu)化數(shù)據(jù),一般查詢時只能提供查詢的局部信息或模糊信息,傳統(tǒng)數(shù)據(jù)庫無法根據(jù)這些信息進行查詢(或者說效率很差)。

  • 如何解決全文檢索-倒排索引

倒排索引時相對于正排索引而言的,如下圖是正排索引和倒排索引的對比

image

正排索引可以通過id查找到對應(yīng)的文章,但是無法通過給的部分內(nèi)容如love,找出含有該關(guān)鍵字的文檔。

倒排索引會先對文檔進行分析將其拆分成單個Term, 并存儲包含該Term的文檔id,這樣便可以實現(xiàn)通過內(nèi)容查找對應(yīng)文檔,如包含love的文檔為文檔1的第二個位置和文檔2的第二個位置。倒排索引的邏輯結(jié)構(gòu)如下圖:

image

當(dāng)然這樣的倒排索引建立起來會導(dǎo)致索引的大小迅速膨脹,lucene對此引入了一個特殊的數(shù)據(jù)結(jié)構(gòu)叫FST,用于解決這個問題。感興趣的朋友可以查詢資料了解,公眾號里后續(xù)也會專門介紹該數(shù)據(jù)結(jié)構(gòu)。

2.2 Elasticsearch的改進

使用倒排索引實現(xiàn)全文檢索都是Lucene已經(jīng)具備的能力,Elasticsearch只是將這個能力封裝起來提供給用戶使用。那么Elasticsearch在lucene之上做了哪些改進和優(yōu)化呢?

首先我們先了解一下Lucene中的幾個基本概念

  • Index(索引):一類業(yè)務(wù)數(shù)據(jù)的集合,類似于傳統(tǒng)數(shù)據(jù)庫DB的概念。
  • Document(文檔):一條完整的數(shù)據(jù)記錄,json格式,是數(shù)據(jù)存儲和檢索的基本單位,類似于傳統(tǒng)數(shù)據(jù)庫的一條記錄。
  • Field(字段):文檔的具體一個屬性,類似于傳統(tǒng)數(shù)據(jù)庫的列。
  • Term(分詞):全文檢索特有詞匯,在存儲文檔字段或檢索時會先對傳入的值進行拆分,使用拆分后的詞進行存儲和檢索。2.2.1 分布式設(shè)計:為了支持對海量數(shù)據(jù)的存儲和查詢,Elasticsearch引入分片的概念,一個索引被分成多個分片,每個分片可以有一個主分片和多個副本分片,每個分片副本都是一個具有完整功能的lucene實例,可以獨立進行存儲和搜索。分片可以分配在不同的節(jié)點上,同一個分片的不同副本不能分配在相同的節(jié)點上。
    在進行讀寫操作時,ES會根據(jù)傳入的_routing參數(shù)(或mapping中設(shè)置的_routing, 如果參數(shù)和設(shè)置中都沒有則默認使用_id), 按照公式shard_num = hash(\routing) % num_primary_shards,計算出文檔要所在或要分配到的分片,再從集群元數(shù)據(jù)中找出對應(yīng)主分片的位置,將請求路由到該分片進行讀寫操作。
image

2.2.2 近實時性-refresh操作

當(dāng)一個文檔寫入Lucene后是不能被立即查詢到的,Elasticsearch提供了一個refresh操作,會定時地調(diào)用lucene的reopen(新版本為openIfChanged)為內(nèi)存中新寫入的數(shù)據(jù)生成一個新的segment,此時被處理的文檔均可以被檢索到。refresh操作的時間間隔由refresh_interval參數(shù)控制,默認為1s, 當(dāng)然還可以在寫入請求中帶上refresh表示寫入后立即refresh,另外還可以調(diào)用refresh API顯式refresh。

2.2.3 數(shù)據(jù)存儲可靠性

  1. 引入translog
    當(dāng)一個文檔寫入Lucence后是存儲在內(nèi)存中的,即使執(zhí)行了refresh操作仍然是在文件系統(tǒng)緩存中,如果此時服務(wù)器宕機,那么這部分?jǐn)?shù)據(jù)將會丟失。為此ES增加了translog, 當(dāng)進行文檔寫操作時會先將文檔寫入Lucene,然后寫入一份到translog,寫入translog是落盤的(如果對可靠性要求不是很高,也可以設(shè)置異步落盤,可以提高性能,由配置index.translog.durabilityindex.translog.sync_interval控制),這樣就可以防止服務(wù)器宕機后數(shù)據(jù)的丟失。與傳統(tǒng)的分布式系統(tǒng)不同,這里是先寫入Lucene再寫入translog,原因是寫入Lucene可能會失敗,為了減少寫入失敗回滾的復(fù)雜度,因此先寫入Lucene.
  2. flush操作
    另外每30分鐘或當(dāng)translog達到一定大小(由index.translog.flush_threshold_size控制,默認512mb), ES會觸發(fā)一次flush操作,此時ES會先執(zhí)行refresh操作將buffer中的數(shù)據(jù)生成segment,然后調(diào)用lucene的commit方法將所有內(nèi)存中的segment fsync到磁盤。此時lucene中的數(shù)據(jù)就完成了持久化,會清空translog中的數(shù)據(jù)(6.x版本為了實現(xiàn)sequenceIDs,不刪除translog)
    image
  3. merge操作
    由于refresh默認間隔為1s中,因此會產(chǎn)生大量的小segment,為此ES會運行一個任務(wù)檢測當(dāng)前磁盤中的segment,對符合條件的segment進行合并操作,減少lucene中的segment個數(shù),提高查詢速度,降低負載。不僅如此,merge過程也是文檔刪除和更新操作后,舊的doc真正被刪除的時候。用戶還可以手動調(diào)用_forcemerge API來主動觸發(fā)merge,以減少集群的segment個數(shù)和清理已刪除或更新的文檔。
  4. 多副本機制
    另外ES有多副本機制,一個分片的主副分片不能分片在同一個節(jié)點上,進一步保證數(shù)據(jù)的可靠性。

2.2.4 部分更新

lucene支持對文檔的整體更新,ES為了支持局部更新,在Lucene的Store索引中存儲了一個_source字段,該字段的key值是文檔ID, 內(nèi)容是文檔的原文。當(dāng)進行更新操作時先從_source中獲取原文,與更新部分合并后,再調(diào)用lucene API進行全量更新, 對于寫入了ES但是還沒有refresh的文檔,可以從translog中獲取。另外為了防止讀取文檔過程后執(zhí)行更新前有其他線程修改了文檔,ES增加了版本機制,當(dāng)執(zhí)行更新操作時發(fā)現(xiàn)當(dāng)前文檔的版本與預(yù)期不符,則會重新獲取文檔再更新。

3 Elastic Stack生態(tài)

Elasticsearch相對于其他的搜索引擎最大的優(yōu)勢之一就是完整的產(chǎn)品矩陣和活躍的社區(qū),下圖是Elastic Stack的產(chǎn)品矩陣

image

3.1 Elastic大數(shù)據(jù)平臺

產(chǎn)品矩陣中最核心的部分是Elastic大數(shù)據(jù)平臺,也就是大家所熟知的ELK(現(xiàn)在應(yīng)該叫ELKB)。其中

  • Elasticsearch是其中的搜索引擎,是整個Elastic Stack的核心所在,它底層使用Lucene,對外提供分布式的高可用,易擴展,近實時的數(shù)據(jù)存儲和檢索服務(wù)。
  • Logstash是一個數(shù)據(jù)采集工具。在早期的Elastic Stack中起到數(shù)據(jù)采集,處理的作用,在新的架構(gòu)中,數(shù)據(jù)采集工作交給了更輕量級的beat來完成,Logstash則更多地用在數(shù)據(jù)匯聚,處理場景下。Logstash提供了200+的插件來支持各種各樣的數(shù)據(jù)采集和數(shù)據(jù)場景,極大地提高了Elastic stack在各種應(yīng)用場景下的應(yīng)用能力。
  • Beats是一個輕量級的數(shù)據(jù)采集agent,部署在數(shù)據(jù)采集端,所有的beat底層都基于libbeat,并在其基礎(chǔ)之上針對各種應(yīng)用場景實現(xiàn)數(shù)據(jù)的采集和傳輸功能。目前除了官方提供的Filebeat,MetricBeat,PacketB eat等之外,還有大量社區(qū)貢獻的beat,可以適應(yīng)各種數(shù)據(jù)采集場景的需要。
  • Kibana是ELK中的數(shù)據(jù)可視化工具,提供了如Discover(搜索),DashBoard(儀表盤),DevTools(開發(fā)工具),Monitoring(監(jiān)控),MachineLearning(機器學(xué)習(xí)), SIEM(安全分析),Management(管理)等多種功能,極大地降低了Elasticsearch用戶的使用門檻和操作復(fù)雜度。

3.2 X-PACK工具包

從5.x開始,Elastic stack將ES的商業(yè)功能特性整合到了X-PACK中, 該工具包提供了包括機器學(xué)習(xí),規(guī)格告警,高級安全特性等在內(nèi)的眾多特性,為使用方提供了更為豐富和專業(yè)的功能。

3.3 解決方案

Elastic Stack完善的產(chǎn)品矩陣和活躍的社區(qū),使用ES被廣泛應(yīng)用于各種領(lǐng)域,如搜索,日志,指標(biāo),APM,安全,企業(yè)搜索等。用戶的使用場景和經(jīng)驗反饋,進而促使了Elastic stack在大數(shù)據(jù)分析平臺的基礎(chǔ)之上構(gòu)建一些更完整的,易于上手的解決方案。

如各種beat moudle,用戶只需要簡單的配置就可以快速地搭建日志或指標(biāo)采集方案和對應(yīng)的分析視圖。

如APM server和agent,用戶只需要根據(jù)指引,配置對應(yīng)server和agent即可快速搭建APM服務(wù)。

如SIEM,集成了安全分析的許多功能模塊,極大地滿足了安全分析的需要。

3.4 Elastic云服務(wù)

為了能讓用戶更方便地使用Elastic Stack的功能,Elastic還提供了托管式云服務(wù)。用戶只需要通過簡單地配置即可快速搭建起Elastic Stack服務(wù),極大地簡化了用戶的搭建流程。

在國內(nèi),Elastic還與騰訊云,阿里云等云廠商合作,提供了Elastic云服務(wù),使得國內(nèi)用戶也能快捷方便地搭建起Elastic服務(wù)。

4. 主要功能

Elastic Stack發(fā)展至今已擁有豐富的功能

4.1 強大的查詢能力

Elasticsearch是一個搜索引擎,而判斷一個搜索引擎的優(yōu)劣,就是看其對查詢的支持能力。如下圖為Elasticsearch支持的查詢功能

image

基礎(chǔ)查詢能力上Elasticseach支持精確查詢,全文查詢,地理位置查詢和一些高級查詢。

Elasticsearch還支持對這些基礎(chǔ)查詢進行組合查詢,并且可以調(diào)整各子查詢的權(quán)重等

Elasticsearch在聚合層面也提供了強大的支持,不僅支持簡單的像SUM, MAX這樣的指標(biāo)查詢,還支持分桶查詢。另外還支持對其他聚合結(jié)果的聚合Pipeline查詢。

4.2 豐富的存儲類型

Elasticsearch支持包括String(text/keyword), Numeric(long, integer, short ...), Date, Boolean, Binary, Range等多種數(shù)據(jù)類型,還支持如Nested, join, object, Geo-shape, Sparse vectord等多種數(shù)據(jù)類型,針對每種數(shù)據(jù)類型進行了特定的存儲和檢索優(yōu)化,以應(yīng)對不同場景的使用需要

4.3 強大的數(shù)據(jù)采集和管理能力

  • 數(shù)據(jù)采集和處理:Elastic Stack的beats和Logstash不僅提供了大量的官方插件,還有大量的社區(qū)貢獻,可以滿足各種場景的數(shù)據(jù)采集和處理需求。另外Elastic的ingest node 也提供了豐富的數(shù)據(jù)預(yù)處理能力。
  • 快照備份和恢復(fù):支持將部分或全部數(shù)據(jù)備份到指定數(shù)據(jù)源,并支持插件開發(fā)
  • 索引聲明周期管理:用戶可以通過配置,使集群可以自動對數(shù)據(jù)進行roll over, 降冷,關(guān)閉或或刪除等操作,提高了數(shù)據(jù)的持續(xù)管理能力。

4.4 安全性

Elasticsearch提供了加密通信,基于角色的訪問控制,基于屬性的訪問控制,LDAP,令牌服務(wù)等多種安全功能,可以滿足用戶在安全方面的各種需求。

4.5 監(jiān)控和告警

Elasticseasrch提供了對Elastic Stack組件的監(jiān)控及告警能力,極大地方便了用戶對Elastic Stack運行狀態(tài)的了解和對問題的定位修復(fù)。

Elasitc提供了Altering功能,用戶可以根據(jù)業(yè)務(wù)需要配置規(guī)則,實現(xiàn)滿足業(yè)務(wù)需要的規(guī)則告警

4.6 機器學(xué)習(xí)

Elasticsearch當(dāng)前提供了非監(jiān)督機器學(xué)習(xí)功能,該功能當(dāng)前主要用在異常檢測方面。在日志檢索,指標(biāo),APM,安全分析等領(lǐng)域均有使用。

由于功能太多這里就不一一列舉了,詳情可以參考:[Elastic Subscription]

5 應(yīng)用場景

Elasticsearch有著廣泛的應(yīng)用場景,借助其強大的檢索能力,其當(dāng)前主要應(yīng)用在搜索,日志分析,指標(biāo),APM,安全分析等領(lǐng)域。

5.1 搜索

Elasticsearch作為搜索引擎,其對絕大多數(shù)類型的搜索功能提供了支持。由于其具有可擴展性好,安全性高,近實時,功能全面等優(yōu)點,其廣泛應(yīng)用在各種應(yīng)用搜索,站內(nèi)搜,企業(yè)搜索,代碼搜索等場景。

5.2 日志分析

日志分析是Elasticsearch應(yīng)用最廣泛的領(lǐng)域,由于其ELK架構(gòu)可以實現(xiàn)快速搭建和使用,再加上其強大的檢索能力,使得其深受廣大運維同學(xué)喜愛。

5.3 指標(biāo)

Elasticsearch5.x開始使用lucene6.0,該版本引入了BKD

樹,并對稀疏數(shù)據(jù)進行了優(yōu)化,使得數(shù)值數(shù)據(jù)的存儲和查詢性能得到了很大提升。Elasticsearch也因此得以可以廣泛應(yīng)用于指標(biāo)監(jiān)控。

5.4 APM

Elastic Stack提供APM serverh和APM anget,用于幫助用戶實現(xiàn)APM功能。APM功能來源于之前的Opbeat。Opbeat是由一個丹麥初創(chuàng)團隊研發(fā),該團隊主打產(chǎn)品就是APM運維軟件。

5.5 安全分析

隨著互聯(lián)網(wǎng)技術(shù)的蓬勃發(fā)展,安全分析領(lǐng)域開始面臨海量數(shù)據(jù)存儲和查詢分析問題,Elastic為安全領(lǐng)域提供了從數(shù)據(jù)采集,數(shù)據(jù)格式處理,異常檢測,可視化分析等一整套解決方案,極大地方便了安全分析在海量數(shù)據(jù)場景下的進行。在7.x版本的Kibana中甚至直接增加了一個SIEM應(yīng)用,用于向安全分析領(lǐng)域提供完整的解決方案。

本文對Elasticsearch的發(fā)展歷程,基本原理,主要功能和應(yīng)用場景進行了簡單總結(jié),希望能幫助大家對Elasticsearch有一個條理清晰的了解。

歡迎關(guān)注公眾號Elastic慕容,和我一起進入Elastic的奇妙世界吧

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

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

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