Elasticsearch 是最近兩年異軍突起的一個兼有搜索引擎和NoSQL數據庫功能的開源系統,基於Java/Lucene構建。最近研究了一下,感受 Elasticsearch 的架構以及其開源的生態構建都有許多可借鑑之處,因此整理成文章分享下。本文的代碼以及架構分析主要基於 Elasticsearch 2.X 最新穩定版。java
Elasticsearch 看名字就能大概瞭解下它是一個彈性的搜索引擎。首先彈性隱含的意思是分佈式,單機系統是無法彈起來的,而後加上靈活的伸縮機制,就是這裏的 Elastic 包含的意思。它的搜索存儲功能主要是 Lucene 提供的,Lucene 至關於其存儲引擎,它在之上封裝了索引,查詢,以及分佈式相關的接口。node
Elasticsearch 中的幾個概念算法
集羣(Cluster)一組擁有共同的 cluster name 的節點。數據庫
節點(Node) 集羣中的一個 Elasticearch 實例。express
索引(Index) 至關於關係數據庫中的database概念,一個集羣中能夠包含多個索引。這個是個邏輯概念。安全
主分片(Primary shard) 索引的子集,索引能夠切分紅多個分片,分佈到不一樣的集羣節點上。分片對應的是 Lucene 中的索引。服務器
副本分片(Replica shard)每一個主分片能夠有一個或者多個副本。架構
類型(Type)至關於數據庫中的table概念,mapping是針對 Type 的。同一個索引裏能夠包含多個 Type。app
Mapping 至關於數據庫中的schema,用來約束字段的類型,不過 Elasticsearch 的 mapping 能夠自動根據數據建立。elasticsearch
文檔(Document) 至關於數據庫中的row。
字段(Field)至關於數據庫中的column。
分配(Allocation) 將分片分配給某個節點的過程,包括分配主分片或者副本。若是是副本,還包含從主分片複製數據的過程。
搜索引擎 Search
Elasticsearch 除了支持 Lucene 自己的檢索功能外,在之上作了一些擴展。 1. 腳本支持
Elasticsearch 默認支持groovy腳本,擴展了 Lucene 的評分機制,能夠很容易的支持複雜的自定義評分算法。它默認只支持經過sandbox方式實現的腳本語言(如lucene expression,mustache),groovy必須明確設置後才能開啓。Groovy的安全機制是經過java.security.AccessControlContext設置了一個class白名單來控制權限的,1.x版本的時候是本身作的一個白名單過濾器,但限制策略有漏洞,致使一個遠程代碼執行漏洞。 2. 默認會生成一個 _all 字段,將全部其餘字段的值拼接在一塊兒。這樣搜索時能夠不指定字段,而且方便實現跨字段的檢索。 3. Suggester Elasticsearch 經過擴展的索引機制,能夠實現像google那樣的自動完成suggestion以及搜索詞語錯誤糾正的suggestion。
NoSQL 數據庫
Elasticsearch 能夠做爲數據庫使用,主要依賴於它的如下特性:
默認在索引中保存原始數據,並可獲取。這個主要依賴 Lucene 的store功能。
實現了translog,提供了實時的數據讀取能力以及完備的數據持久化能力(在服務器異常掛掉的狀況下依然不會丟數據)。Lucene 由於有 IndexWriter buffer, 若是進程異常掛掉,buffer中的數據是會丟失的。因此 Elasticsearch 經過translog來確保不丟數據。同時經過id直接讀取文檔的時候,Elasticsearch 會先嚐試從translog中讀取,以後才從索引中讀取。也就是說,即使是buffer中的數據還沒有刷新到索引,依然能提供實時的數據讀取能力。Elasticsearch 的translog 默認是每次寫請求完成後統一fsync一次,同時有個定時任務檢測(默認5秒鐘一次)。若是業務場景須要更大的寫吞吐量,能夠調整translog相關的配置進行優化。
強大,其生態圈裏的 Kibana 主要就是依賴aggregation來實現數據分析以及可視化的。
典型應用場景一:雲分析業務
解決方案:根據索引大小分別設置分片數,充分利用type合併索引
除分詞字段外,其餘字段所有存儲爲doc value、master node、data node、client node 分離部署保守設置fielddata內存佔用軟硬限,及其餘內存佔用限制
設置fielddata有效期。
典型應用場景二:casio業務
解決方案:
使用動態mapping自動匹配未知字段
數據分發到全部節點批量導入
所有使用doc value存儲,減小內存消耗
使用模板,分天級、小時級自動建立索引
SSD與SATA分組,冷數據按期自動遷移