Elasticsearch特色:分佈式,高性能,高可用,高伸縮的搜索和分析;node
1)可做爲一個大型分佈式集羣,處理PB級別的數據,服務大型公司,亦可運行在少數或單臺設備上服務小型公司算法
分佈式的特性:數據庫
Elasticsearch致力於隱藏式分佈式系統的複雜性,以下這些操做都是在底層自動完成的:api
- 將你的文檔分區到不一樣的容器或者分片(shards)中,他們能夠存在於一個或多個節點中
- 將分片均勻的分配到各個節點,對索引和搜索作負載均衡。
- 冗餘每個分片,防止硬件故障形成的數據丟失
- 將集羣中任意一個節點上的請求路由到相應數據所在的節點
- 不管是節點增長或減小,分片均可以作到無縫的擴展和遷移
2)Elasticsearch主要將全文檢索、數據分析以及分佈式技術,合併在了一塊兒;瀏覽器
3)對用戶而言,使用便利服務器
4)相比傳統數據庫做搜索性能和功能有了很大提高(全文檢索,同義詞處理,相關度排名,複雜數據分析,對海量數據近實時處理等等);負載均衡
功能:運維
1)分佈式搜索引擎和數據分析引擎;elasticsearch
2)全文檢索,結構化檢索,數據分析。分佈式
3)對海量數據進行近實時的處理
集羣內部工做方式
Elasticsearch用於構建高可用和可擴展的系統,擴展的方式能夠是購買更高配置的Server(縱向擴展:vertical scale or scaling up)或者購買更多數量的server(橫向擴展:horizontal scale or scaling out).
Elasticsearche雖然說能從更強大的硬件中得到更好的性能,可是縱向擴展仍存在自身的侷限性,真正擴展的每每是橫向擴展,經過增長節點來分擔負載增長可靠習慣。(對於大多數數據庫而言,橫向擴展的意味着你的程序講座很是大的改動才能利用這些添加的設備。ES在這裏就顯現出優勢,由於ES天生就是分佈式的:他知道如何管理節點來提升擴展和高可用,這意味着你的程序不須要關心這些。)
全文檢索和Lucene
1)全文檢索,倒排索引
2)lucene,原本是一個jar包,內部包含了封裝好的各類創建倒排索引,以及進行搜索的代碼,包括各類算法。在使用Java開發的時候,引入lucene的jar包,而後基於lucene的api進行開發時,lucene會幫助咱們在已有的數據中創建索引,幫助咱們組織索引結構,此外還可使用lucene提供的功能和api來針對磁盤上的索引數據,進行搜索。
Elasticsearch的相關名詞解釋
(1)Near Realtime(NRT):近實時,兩層含義:寫入數據到數據能夠被搜索有一個小延遲,基於ES執行搜索和分析能夠達到秒級
(2)Cluster:集羣,包含多個節點,每一個節點屬於哪一個集羣是經過一個配置(集羣名稱默認是elasticsearch)來決定的;
(3)Node:節點,集羣中的一個節點,介意也有一個名稱(默認是隨機分配的),節點名稱也很重要(在執行運維管理操做的時候),默認節點會加入一個名稱爲「elasticsearch」的集羣,假如啓動一堆節點,那麼這些節點會自動組成一個elasticsearch集羣,固然一個節點也能夠組成一個elasticsearch集羣。
(4)Document:文檔,ES中的最小單位,一個document能夠是一條客戶數據,一條商品分類信息,一條訂單數據等等,一般用JSON形式表示,每一個index下的type中均可以存儲多個document。
(5)Index:索引,包含一推有下你故事結構的文檔數據,若有一個客戶索引,商品分類索引,訂單索引,索引有一個名稱。
(6)type:類型,每一個索引裏均可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,如博客系統,有一個索引,能夠定義用戶數據type,博客數據type,評論數據type。
(7)shard:單個機器沒法存儲大量的數據,ES能夠將一個索引中的數據切分爲多個shard,分佈在多臺服務器上存儲,有了shard就能夠橫向擴展,存儲更多數據,讓搜索和分析等操做分佈到多臺服務器上去執行,提高吞吐量和性能,。每一個shard都是一個lucene index。
(8)replicate:任何一個服務器隨時可能故障或宕機,primary shard(創建索引是一個設置,不能修改,默認5個),replicate shard(隨時修改數量,默認一個),默認每一個索引有10個shard,5個primary shard,5個replicate shard,最小的高可用配置,要求2太服務器。
ES與傳統數據庫相比
Elasticsearch | 數據庫 |
Document | 行 |
Type | 表 |
Index | 數據庫 |
空集羣
啓動一個單獨的節點,他尚未數據和索引,以下圖:
一個節點(node)即一個Elasticsearch實例,而一個集羣(cluster)由一個或多個節點組成,他們具備相同的cluster name,他們協同工做,分享數據和負載。當加入新的節點或者刪除一個節點時,集羣就會感知到並平衡數據。
集羣中的一個節點會被選舉爲主節點(master),它將臨時管理集羣級別的一些變動;如新建成或刪除索引、增長或刪除節點等。master不參與文檔級別的變動或搜索,這意味着在流量增加的時候,master不會成爲集羣的瓶頸。任何節點均可以成爲master。這裏的舉例由於只啓動了一個節點,因此它會充當master的角色。
用戶能夠與集羣中的任何節點通訊,包括master,每個節點都知道文檔存在於那個節點上,它們能夠轉發請求到相應的節點上,咱們訪問的節點負責收集各節點返回的數據,最後一塊兒返回給客戶端。這一切都由elasticsearch處理。
ES集羣能夠監控統計不少信息,可是隻有一個最重要:集羣的健康(cluster health)。集羣健康有三種狀態:green、yellow和red。啓動集羣,在瀏覽器中登陸127.0.0.1:5601,而後在Dev Tools中可使用命令來獲取集羣的健康狀態,GET /_cluster/health/
(1)status是咱們關注的字段
三種狀態的解釋:
顏色 | 意義 |
green | 全部主要分片(primary shard)和複製分片(replicate shard)均可用 |
yellow | 全部主要分片可用。但不是全部複製分片均可用 |
red | 不是全部的主要分片均可用 |
添加索引
爲了將數據添加到ES中,咱們須要索引(index)--一個存儲關聯數據的地方,實際上,索引只是一個用來指向一個或多個分片(shards)的「邏輯命名空間(logical namespace)」.一個分片(shards)是一個最小級別「工做單元(work unit)」,它只是保存了索引中全部數據的一部分。分片其實就是一個Lucene實例,而且它自己就是一個完整的搜索引擎。咱們的文檔存儲在分片中,而且在分片中被索引,可是咱們的應用程序不會直接與它們通訊,取而代之的是,直接與索引通訊。分片是ES在集羣中分發數據的關鍵。把分片想象成數據的容器,文檔存儲在分片中,而後分片分配到你集羣中的節點上。當集羣擴縮容時,ES會自動在節點間遷移分片,以使集羣保持平衡。
分片能夠是主分片(primary shard)或者是複製分片(replicate shard)。你索引中的每一個文檔屬於一個primary shard,因此primary shard的數量決定了索引最多能存儲多少數據。
(理論上primary shard能存儲的數據大小是沒有限制的。限制取決於實際使用狀況。shard的最大容量徹底取決於你的使用情況:硬件存儲大小、文檔的大小和複雜度、如何索引和查詢你的文檔,以及你指望的響應時間)
replicate shard只是primary shard的一個副本,它能夠防止硬件故障致使的數據丟失,同時能夠提供讀請求,好比搜索或者從別的shard取回文檔。
當索引建立完成的時候,primary shard的數量就固定了,可是replicate shard的數量能夠隨時調整。