【簡介】html
【Elasticsearch 優勢】java
跨平臺:Elasticsearch 使用 Java 做爲開發語言,因此能夠運行在任何平臺上;node
近實時:在Elasticsearch和磁盤之間是文件系統緩存,內存buffer生成一個新的segment,刷到文件系統緩存中,Lucene便可檢索到這個新的segment。刷到文件系統緩存中這個步驟,Elasticsearch默認1s的時間間隔,這也就是說至關因而實時搜索的;python
分片機制提供更好的分佈性:同一個索引分紅多個分片(sharding),這點相似於HDFS的塊機制;分而治之的方式來提高處理效率,相信你們都不會陌生;數據庫
彈性:硬件故障。網絡瞬斷。Elasticsearch 爲您檢測這些故障並確保您的集羣(數據)安全和可用。json
靈活性:數字、文本、地理位置、結構化、非結構化。全部的數據類型都歡迎。應用搜索、安全分析或是日誌分析只是全球衆多公司利用 Elasticsearch 解決各類挑戰的冰山一角。緩存
多租戶:與 Apache Solr 相比,Elasticsearch 中處理多租戶很是容易;安全
Elasticsearch 使用 JSON 對象做爲響應,這是當下最流行的數據交換格式;服務器
Elasticsearch 幾乎支持全部文檔類型,但不能渲染的文本除外,例如二進制數據;網絡
【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的從新分配。
目前支持的自動發現機制:
- Azure discovery 插件方式,多播
- EC2 discovery 插件方式,多播
- Google Compute Engine (GCE)discovery 插件方式多播
- 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 雲存儲服務。