Elasticsearch學習(1)—— 簡介

【簡介】html

  1. Elasticsearch ( ES ) 是一個基於 Lucene實時分佈式開源的全文搜索和分析引擎。它不但穩定、可靠、快速,並且也具備良好的水平擴展能力,是專門爲分佈式環境設計的。
  2. Elasticsearch 一般用於單頁面應用 ( Single Page Application ) 項目中,這個應用程序像 Google 和百度同樣,提供一個搜索框用於輸入關鍵字,而後返回一個包含搜索結果的列表。
  3. Elasticsearch 使用 Java 語言開發,使用 Elastic 開源協議,已經被世界各地的各個大型的公司或組織使用。
  4. Elasticsearch 經過 RESTful Web 服務接口訪問,並使用 JSON 文檔來存儲數據。

【Elasticsearch 優勢】java

  1. 跨平臺:Elasticsearch 使用 Java 做爲開發語言,因此能夠運行在任何平臺上;node

  2. 近實時:在Elasticsearch和磁盤之間是文件系統緩存,內存buffer生成一個新的segment,刷到文件系統緩存中,Lucene便可檢索到這個新的segment。刷到文件系統緩存中這個步驟,Elasticsearch默認1s的時間間隔,這也就是說至關因而實時搜索的python

  3. 分片機制提供更好的分佈性:同一個索引分紅多個分片(sharding),這點相似於HDFS的塊機制;分而治之的方式來提高處理效率,相信你們都不會陌生;數據庫

  4. 橫向可擴展性:只須要增長一臺服務器,作一點兒配置,啓動一下ES進程就能夠併入集羣;各類規模的公司均可以選用,根據本身的數據規模選擇集羣的大小,而且有合理的分佈式架構,單個計算節點宕機不會形成總體系統的崩潰;
  5. 高可用:提供複製(replica)機制,一個分片能夠設置多個複製,使得某臺服務器宕機的狀況下,集羣仍舊能夠照常運行,並會把因爲服務器宕機丟失的複製恢復到其它可用節點上;這點也相似於HDFS的複製機制(HDFS中默認是3份複製);
  6. 彈性:硬件故障。網絡瞬斷。Elasticsearch 爲您檢測這些故障並確保您的集羣(數據)安全和可用。json

  7. 靈活性:數字、文本、地理位置、結構化、非結構化。全部的數據類型都歡迎。應用搜索、安全分析或是日誌分析只是全球衆多公司利用 Elasticsearch 解決各類挑戰的冰山一角。緩存

  8. 多租戶:與 Apache Solr 相比,Elasticsearch 中處理多租戶很是容易;安全

  9. Elasticsearch 使用 JSON 對象做爲響應,這是當下最流行的數據交換格式;服務器

  10. Elasticsearch 幾乎支持全部文檔類型,但不能渲染的文本除外,例如二進制數據;網絡

【Elasticsearch 缺點】

  1. 各節點的一致性問題:其默認的機制是經過多播機制,同步元數據信息,可是在比較繁忙的集羣中,可能會因爲網絡的阻塞,或者節點處理能力達到飽和致使各節點元數據不一致——也就是所謂的腦裂問題,這樣會使集羣處於不一致狀態。目前並無一個完全的解決方案來解決這個問題,可是能夠經過將工做節點與元數據節點分開的部署方案來緩解這種狀況。
  2. 沒有細緻的權限管理機制,也就是說,沒有像MySQL那樣的分各類用戶,每一個用戶又有不一樣的權限。因此在操做上的限制須要本身開發一個系統來完成;

==================================================

Elasticsearch分佈式搜索引擎架構圖

RESTful API:使用 HTTP 做爲傳輸協議,使用 JSON 做爲數據交換格式,全部的語言均可以使用 RESTful API,經過 9200 端口的與 Elasticsearch 進行通訊。

常見的請求格式:

curl -X<VERB> -HContent-Type:application/json '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

參數 說明
VERB HTTP 請求方法:GET, POST, PUT, HEAD, DELETE
Content-Type:application/json 可選,用於指定請求正文的數據格式爲 JSON
PROTOCOL http 或者 https 協議,只有在 Elasticsearch 前有 https 代理的時候可用
HOST Elasticsearch 集羣中的任何一個節點的主機名,若是是在本地的節點,則是 localhost
PORT Elasticsearch HTTP 服務所在的端口,默認爲9200
PATH API 路徑 ( 例如 _count 將返回集羣中文檔的數量
PATH 能夠包含多個組件,例如 _cluster/stats 或者 _nodes/stats/jvm
QUERY_STRING 一些可選的查詢請求參數,例如 ?pretty參數將使請求返回更加美觀易讀的 JSON 數據
BODY 一個 JSON 格式的請求主體,若是請求須要的話

網絡層使用Netty,提供http rest和RPC兩種協議。

Rest 和 RPC:

Elasticsearch 的rest請求的傳遞流程如上圖(這裏對實際流程作了簡化): 1. 用戶發起http請求,Elasticsearch 的9200端口接受請求後,傳遞給對應的RestAction。 2. RestAction作的事情很簡單,將rest請求轉換爲RPC的TransportRequest,而後調用NodeClient,至關於用客戶端的方式請求RPC服務,只不過transport層會對本節點的請求特殊處理。

 Transport:elasticsearch 內部的節點或者集羣與客戶端之間的交互方式。同時兼有client和server功能,server端接收其餘節點的鏈接,client維持和其餘節點的鏈接,承擔了節點之間請求轉發的功能。Elasticsearch 爲了不傳輸流量比較大的操做堵塞鏈接,因此會按照優先級建立多個鏈接,稱爲channel。

默認的內部是使用 tcp 協議來進行交互的,同時它支持 http 協議(json格式)、thrift、servlet、memcached、zeroMQ等多種的傳輸協議(經過插件方式集成)。

  • recovery: 2個channel專門用作恢復數據。若是爲了不恢復數據時將帶寬佔滿,還能夠設置恢復數據時的網絡傳輸速度。
  • bulk: 3個channel用來傳輸批量請求等基本比較低的請求。
  • regular: 6個channel用來傳輸通用正常的請求,中等級別。
  • state: 1個channel保留給集羣狀態相關的操做,好比集羣狀態變動的傳輸,高級別。
  • ping: 1個channel專門用來ping,進行故障檢測。

 每一個節點默認都會建立13個到其餘節點的鏈接,而且節點之間是互相鏈接的,每增長一個節點,該節點會到每一個節點建立13個鏈接,而其餘每一個節點也會建立13個連回來的鏈接。

JMX:(Java Management Extensions,即Java管理擴展)是一個爲應用程序、設備、系統等植入管理功能的框架。JMX能夠跨越一系列異構操做系統平臺、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。

Discovery:該模塊主要負責集羣中節點的自動發現和Master節點的選舉。節點之間使用p2p的方式進行直接通訊,不存在單點故障的問題。Elasticsearch中,Master節點維護集羣的全局狀態,好比節點加入和離開時進行shard的從新分配。

目前支持的自動發現機制:

  1. Azure discovery 插件方式,多播
  2. EC2 discovery 插件方式,多播
  3. Google Compute Engine (GCE)discovery 插件方式多播
  4. zen discovery 默認實現 多播/單播

Scripting:使用腳本語言能夠計算自定義表達式的值,好比計算自定義查詢相關度評分。支持的腳本語言有groovy,js,mvel(1.3.0廢棄),python等。

Index,Search,Mapping以後講

River:表明的是一個數據源,這也是其它存儲方式(好比:數據庫)同步數據到 elasticsearch 的一個方法。它是以插件方式存在的一個 elasticsearch 服務,經過讀取 river 中的數據並把它索引到 elasticsearch 當中去,官方的 river 有 couchDB、RabbitMQ、Twitter、Wikipedia。

Distributed Lucene Directory:Elasticsearch是基於Lucene的搜索引擎。

一個 Lucene 的索引是由多個Segment構成的,一個段又是一個完整的倒排索引。段是不可變的,使 Lucene 能夠將新的文檔以增量的形式加入到索引,無須對索引進行重建,每一個段都會消耗 CPU 時鐘,文件句柄和內存。這也意味着段越多,搜索的性能將會越差。

爲了解決這個問題,Elasticsearch 會將不少小段合併成大的段(以下圖所示),並將新的合併的段提交到磁盤,而後刪除老的小段。

這個過程是在後臺自動執行的,不會影響索引或搜索。由於段合併會佔用資源並影響搜索的性能,Elasticsearch 會對合並進程節流,保證搜索有足夠可用的資源。

Gateway:gateway 表明 elasticsearch 索引的持久化存儲方式,elasticsearch 默認是先把索引存放到內存中去,當內存滿了的時候再持久化到硬盤裏。當這個 elasticsearch 集羣關閉或者再次從新啓動時就會從 gateway 中讀取索引數據。elasticsearch 支持多種類型的 gateway,有本地文件系統(默認),分佈式文件系統,Hadoop 的 HDFS 和 amazon 的 s3 雲存儲服務。

相關文章
相關標籤/搜索