在PaaS的日誌集中管理中,咱們使用Elasticsearch做爲底層的搜索引擎。在大數據、搜索引擎平臺流行以前,用戶對於數據的存儲與檢索是經過關係型數據庫實現的。最基礎的方法是將文本內容存儲在數據庫表中,經過SQL語言的like操做符來匹配文檔。不一樣的數據庫在like操做符上又引入了高級功能,例如用正則表達式來支持更靈活的查詢。即使引入了各種高級方法,用戶仍是有大量的工做要作,好比對查詢輸入的分詞管理、設計在海量數據上的彈性可伸縮方案等。針對以上問題,開源社區開發了一個全文搜索庫——Lucene,注意它是一個庫文件,也就是說開發人員可以使用它來構建本身的全文搜索引擎,它爲開發人員提供了全文索引與查詢的具體實現。Elasticsearch是基於Lucene庫文件的搜索引擎,它是一個產品,開箱即用,提供豐富的接口來索引、檢索數據。node
Lucene是Elasticsearch的基礎,它是一個獨立的Java庫文件,具備高性能、可擴展、輕量級的具體實現。做爲一個全文檢索引擎,其具備以下突出的優勢。正則表達式
圖12-10體現了應用程序與Lucene的關係,開發人員在應用程序中可經過Lucene實現索引與查詢功能。Lucene採用的是一種被稱爲反向索引(Inverted Index)的機制。反向索引就是說咱們維護了一個詞/短語表,則對於這個表中的每一個詞/短語,都有一個鏈表來描述有哪些文檔包含了這個詞/短語。這樣用戶在輸入查詢條件時,就能很是快地獲得搜索結果。對文檔創建好索引後,就能夠在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,而後在創建好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。數據庫
圖12-10 應用程序與Lucene的關係數據結構
Elasticsearch是基於Lucene庫構建的開源搜索引擎平臺,它用Java語言實現,以RESTful的Web接口對外提供服務,交互內容採用JSON文檔格式,其做者謝伊巴農(Shay Banon)於2010年將其開源貢獻給了社區,以後Elasticsearch快速發展,目前和Solr(另外一個流行搜索引擎平臺)並駕齊驅,成爲互聯網上最流行的兩大企業搜索引擎平臺。也許你對Lucene和Elasticsearch都有了必定的瞭解,但咱們仍是從介紹一些基本概念來認識Elasticsearch。架構
1)數據結構概念app
Elasticsearch是這樣定義數據結構的。性能
•Index學習
在Elasticsearch中,「Index」是一個名詞,它將數據存放在一個或者多個Index中。Index這個詞很容易產生歧義,由於在計算機中它表明索引這個動做或者表明數據的索引。若是將其與關係型數據庫進行類比,則實際上Index至關於以前數據庫中的一張表,用來存儲用戶的相關數據。大數據
•Document優化
Document是從Lucene中引入的一個概念,它至關於關係型數據庫的一行記錄。在Lucene搜索世界中,全部數據對象都是以文檔方式存在的。在數據的結構化要求上,文檔型(Document)要比行(Row)鬆散不少。在Document中也包含了不少字段(Field),這與關係型數據庫行中的字段是同樣的,但Document沒有嚴格的規定一個文檔有哪些字段及字段類型是什麼,所以用戶在將一個文檔存儲到一個Index時,能夠靈活地增長、減小相關字段。Document遵循JSON格式,結合Logstash來看,最終從Logstash中輸出的就是一個包含多字段的Document。
•Mapping
Mapping是Elasticsearch中很重要的一個概念,剛剛說過在Elasticsearch中並無相似於關係型數據庫中的Schema概念,咱們並不須要定義在一個Document中要有哪些字段。可是當Document發送過來並進行存儲前,Elasticsearch須要首先對文檔中的字段進行索引,咱們依據什麼規則來進行索引呢?咱們將Mapping理解爲對字段進行索引的規則。一個Mapping由一個或多個Analyzer組成,一個Analyzer又由一個或多個Filter組成。Elasticsearch在索引文檔時,把字段中的內容傳遞給相應的Analyzer,Analyzer再傳遞給各自的Filter。這些Filter完成最終的索引工做,包括分詞、大小寫忽略及刪除標籤等。Document中的字段默認爲對應的Mapping,Elasticsearch依據字段的類型來分配默認的Mapping,固然用戶能夠自定義Mapping,並在對文檔進行索引前指定字段的Mapping。
2)組件概念
•Node和Cluster
Elasticsearch以單實例形式運行Node。單實例部署的Elasticsearch的Node能夠知足一些基礎場景的需求,但在生產環境涉及可用性、容錯性、高性能等要求時,會將多個Node組合成一個Cluster集羣。
•Shard
在集羣部署的Elasticsearch多節點中,爲了提高總體的性能,Elasticsearch會將數據存儲到多個節點的Lucene Index中,只有將這些節點中的數據聚合在一塊兒纔是一個完整的Index,每一個節點上的數據被稱爲Shard,表明Index的一段分片。在用戶向Cluster提交一次查詢動做時,Elasticsearch內部會自動完成各個節點之間的交互,從每一個Shard中檢索數據並完成聚合操做。
•Replica
Shard用於將一份全量數據分紅多片,放到不一樣的集羣節點來提高檢索性能。Replica是一份Shard的複製,它的做用是對同一份數據提供冗餘,防止在某節點失效時數據丟失;同時Replica的份數越多,讀取操做的性能也會有很大的提高。
•Gateway
Elasticsearch運行時會產生大量的關於集羣狀態、Index設置相關的元數據信息,這些數據在Gateway中持久化。
3)索引與查詢
搜索引擎平臺提供的兩個主要操做接口是索引、查詢,在Elasticsearch集羣中因爲Index數據分散到各個節點中的Shard中,而且每個Shard還有本身的冗餘備份Replica,所以每一次索引與查詢動做都涉及Cluster集羣中的多節點交互。
Elasticsearch的索引接口有多種方式,咱們可使用HTTP發起索引訪問,將文檔發送給Elasticsearch,也能夠採用無狀態的UDP,犧牲可靠性來提供請求性能。一個請求索引的文檔有一個或者自動生成一個Document ID,Elasticsearch依據此ID來判斷該文檔應該被存儲在哪一個Shard中,只有Shard所在的節點才能完成索引動做,Replica節點僅僅同步數據和提供查詢。如圖12-11所示是一個索引操做流程,客戶端發起一個文檔索引請求,它能夠鏈接到Cluster集羣中的任意一個節點。在該例中鏈接的是node_2,node_2對Document ID進行判斷,發現數據應當由node_1上的shard_2來處理,因而它將請求轉發到node_1。
圖12-11 索引操做流程圖
Elasticsearch的檢索請求要比索引更加複雜,在一個Cluster集羣環境中,Elasticsearch必須詢問全部的Node,將獲取的數據彙總後才發送給用戶。如圖12-12所示是一次數據檢索操做,客戶端發起請求給node_2,node_2內部會對用戶發起的檢索請求進行處理,搜索相關數據,同時會與集羣內的其餘節點進行通訊,收集在其餘節點檢索出來的數據,最後,全部節點將數據發送到node_2中進行彙總,統一返回給客戶端。
圖12-12 數據檢索操做