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

Elasticsearch作爲當前流行分佈式的搜索引擎,被廣泛應用於日誌檢索,指標採集,APM,安全分析等領域。本文將對Elastic Stack的發展歷程,基本原理,產品生態,主要功能和應用場景進行總結,以幫助大家對Elastic生態的前世今生能有一個清晰的瞭解。

1. 發展歷程

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

許多年前,一個叫Shay Banon的年輕人想爲正在學習廚藝的新婚妻子編寫一款菜譜搜索軟件。在開發過程中,他發現搜索引擎庫Lucene不僅使用門檻高,還有會有許多重複性工作。因此他決定在lucene基礎之上封裝一個簡單易用的搜索應用庫,並命名爲Compress。Elasticsearch的前身就在這樣浪漫的機緣下誕生了。

1.2 分佈式爲其注入了新的活力

之後shay找到了一份工作,工作內容涉及到大量的高併發分佈式場景,於是他決定重寫Compress,引入了分佈式架構,並更名爲Elasticsearch。Elasticsearch的第一個版本發佈於2010年5月,發佈後公衆反響強烈。

1.3 開源力量助其騰飛

Elasticsearch在github上發佈後,使用量驟增,並很快有了自己的社區。很快,社區中的 Steven Schuurman、Uri Boness 和 Simon Willnauer 與Shay Banon 一起成立了一家搜索公司Elasticsearch Inc.。

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

1.4 快速成長

之後Elasticsearch迅速發展,增加了許多新功能和特性

版本 發佈日誌 重要特性
0.7.0 2010.5.14 github上第一個版本
1.0.0 2014.2.14 備份恢復,聚合,熔斷器,docvalues等
2.0.0 2015.10.28 組件版本統一,推出Elastic Cloud等
5.0.0 2016.10.26 商業組件整合爲x-pack;使用Lucene6.0引入BKD樹,稀疏數據優化等; 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 引入新的集羣協調層zen2; real內存熔斷器等

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

2. 基本原理

2.1 最初的想法

Elasticsearch是一個分佈式搜索引擎,底層使用Lucene來實現其核心搜索功能。雖然當前Elasticsearch擁有的衆多的功能和解決方案,但是其核心仍然是全文檢索。

  • 什麼是全文檢索?

    生活中的數據可以分爲結構化數據和非結構化數據。結構化數據是指格式和長度固定的數據,如一個人的年齡,姓名等。非結構化數據是指格式和長度不固定的數據,如一個文章的內容等。

    對於結構化數據,可以存儲在DB中通過精確匹配找到。但是對於非結構化數據,一般查詢時只能提供查詢的局部信息或模糊信息,傳統數據庫無法根據這些信息進行查詢(或者說效率很差)。
  • 如何解決全文檢索-倒排索引

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



    正排索引可以通過id查找到對應的文章,但是無法通過給的部分內容如love,找出含有該關鍵字的文檔。
    倒排索引會先對文檔進行分析將其拆分成單個Term, 並存儲包含該Term的文檔id,這樣便可以實現通過內容查找對應文檔,如包含love的文檔爲文檔1的第二個位置和文檔2的第二個位置。倒排索引的邏輯結構如下圖:



    當然這樣的倒排索引建立起來會導致索引的大小迅速膨脹,lucene對此引入了一個特殊的數據結構叫FST,用於解決這個問題。感興趣的朋友可以查詢資料瞭解,公衆號裏後續也會專門介紹該數據結構。

2.2 Elasticsearch的改進

使用倒排索引實現全文檢索都是Lucene已經具備的能力,Elasticsearch只是將這個能力封裝起來提供給用戶使用。那麼Elasticsearch在lucene之上做了哪些改進和優化呢?
首先我們先了解一下Lucene中的幾個基本概念

  • Index(索引):一類業務數據的集合,類似於傳統數據庫DB的概念。
  • Document(文檔):一條完整的數據記錄,json格式,是數據存儲和檢索的基本單位,類似於傳統數據庫的一條記錄。
  • Field(字段):文檔的具體一個屬性,類似於傳統數據庫的列。
  • Term(分詞):全文檢索特有詞彙,在存儲文檔字段或檢索時會先對傳入的值進行拆分,使用拆分後的詞進行存儲和檢索。

2.2.1 分佈式設計:

爲了支持對海量數據的存儲和查詢,Elasticsearch引入分片的概念,一個索引被分成多個分片,每個分片可以有一個主分片和多個副本分片,每個分片副本都是一個具有完整功能的lucene實例,可以獨立進行存儲和搜索。分片可以分配在不同的節點上,同一個分片的不同副本不能分配在相同的節點上。
在進行讀寫操作時,ES會根據傳入的_routing參數(或mapping中設置的_routing, 如果參數和設置中都沒有則默認使用_id), 按照公式shard_num = hash(\routing) % num_primary_shards,計算出文檔要所在或要分配到的分片,再從集羣元數據中找出對應主分片的位置,將請求路由到該分片進行讀寫操作。

2.2.2 近實時性-refresh操作

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

2.2.3 數據存儲可靠性

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

2.2.4 部分更新

lucene支持對文檔的整體更新,ES爲了支持局部更新,在Lucene的Store索引中存儲了一個_source字段,該字段的key值是文檔ID, 內容是文檔的原文。當進行更新操作時先從_source中獲取原文,與更新部分合並後,再調用lucene API進行全量更新, 對於寫入了ES但是還沒有refresh的文檔,可以從translog中獲取。另外爲了防止讀取文檔過程後執行更新前有其他線程修改了文檔,ES增加了版本機制,當執行更新操作時發現當前文檔的版本與預期不符,則會重新獲取文檔再更新。

3 Elastic Stack生態

Elasticsearch相對於其他的搜索引擎最大的優勢之一就是完整的產品矩陣和活躍的社區,下圖是Elastic Stack的產品矩陣

3.1 Elastic大數據平臺

產品矩陣中最核心的部分是Elastic大數據平臺,也就是大家所熟知的ELK(現在應該叫ELKB)。其中

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

3.2 X-PACK工具包

從5.x開始,Elastic stack將ES的商業功能特性整合到了X-PACK中, 該工具包提供了包括機器學習,規格告警,高級安全特性等在內的衆多特性,爲使用方提供了更爲豐富和專業的功能。

3.3 解決方案

Elastic Stack完善的產品矩陣和活躍的社區,使用ES被廣泛應用於各種領域,如搜索,日誌,指標,APM,安全,企業搜索等。用戶的使用場景和經驗反饋,進而促使了Elastic stack在大數據分析平臺的基礎之上構建一些更完整的,易於上手的解決方案。

如各種beat moudle,用戶只需要簡單的配置就可以快速地搭建日誌或指標採集方案和對應的分析視圖。

如APM server和agent,用戶只需要根據指引,配置對應server和agent即可快速搭建APM服務。

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

3.4 Elastic雲服務

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

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

4. 主要功能

Elastic Stack發展至今已擁有豐富的功能

4.1 強大的查詢能力

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



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

Elasticsearch還支持對這些基礎查詢進行組合查詢,並且可以調整各子查詢的權重等

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

4.2 豐富的存儲類型

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

4.3 強大的數據採集和管理能力

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

4.4 安全性

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

4.5 監控和告警

Elasticseasrch提供了對Elastic Stack組件的監控及告警能力,極大地方便了用戶對Elastic Stack運行狀態的瞭解和對問題的定位修復。

Elasitc提供了Altering功能,用戶可以根據業務需要配置規則,實現滿足業務需要的規則告警

4.6 機器學習

Elasticsearch當前提供了非監督機器學習功能,該功能當前主要用在異常檢測方面。在日誌檢索,指標,APM,安全分析等領域均有使用。

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

5 應用場景

Elasticsearch有着廣泛的應用場景,藉助其強大的檢索能力,其當前主要應用在搜索,日誌分析,指標,APM,安全分析等領域。

5.1 搜索

Elasticsearch作爲搜索引擎,其對絕大多數類型的搜索功能提供了支持。由於其具有可擴展性好,安全性高,近實時,功能全面等優點,其廣泛應用在各種應用搜索,站內搜,企業搜索,代碼搜索等場景。

5.2 日誌分析

日誌分析是Elasticsearch應用最廣泛的領域,由於其ELK架構可以實現快速搭建和使用,再加上其強大的檢索能力,使得其深受廣大運維同學喜愛。

5.3 指標

Elasticsearch5.x開始使用lucene6.0,該版本引入了BKD
樹,並對稀疏數據進行了優化,使得數值數據的存儲和查詢性能得到了很大提升。Elasticsearch也因此得以可以廣泛應用於指標監控。

5.4 APM

Elastic Stack提供APM serverh和APM anget,用於幫助用戶實現APM功能。APM功能來源於之前的Opbeat。Opbeat是由一個丹麥初創團隊研發,該團隊主打產品就是APM運維軟件。

5.5 安全分析

隨着互聯網技術的蓬勃發展,安全分析領域開始面臨海量數據存儲和查詢分析問題,Elastic爲安全領域提供了從數據採集,數據格式處理,異常檢測,可視化分析等一整套解決方案,極大地方便了安全分析在海量數據場景下的進行。在7.x版本的Kibana中甚至直接增加了一個SIEM應用,用於向安全分析領域提供完整的解決方案。

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

歡迎關注公衆號Elastic慕容,和我一起進入Elastic的奇妙世界吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章