Elasticsearch-數據的存儲、搜索(乾貨)

ES-深刻功能
ES中數據是如何組織的?
邏輯設計:
用於索引和搜索的基本單位是文檔,能夠將其認爲是關係數據庫裏的一行。文檔以類型來分組,類型包含若干文檔,相似表格包含若干行。最終,一個或多個類型存在於同一索引中,索引是更大的容器,相似數據庫。
物理設計:
ES將每一個索引劃分爲分片,每份分片能夠在集羣中的不一樣服務器間遷移。數據庫

1.理解邏輯設計:文檔、類型和索引

1.1文檔:ES是面向文檔的,這意味着索引和搜索的最小單位是文檔。

文檔的重要屬性:
(1)它是自我包含的:一篇文檔同時包含字段和他們的取值。
(2)它能夠是層次型的:文檔中還包含新的文檔。一個字段的取值能夠是簡單的,例如,location字段的取值能夠是字符串。字段還能夠包含其餘字段和取值,例如location字段能夠同事包含城市和街道地址。
(3)它擁有靈活的結構:文檔不依賴於預先定義的模式。例如,並不是全部的文檔都須要description這個字段值,因此能夠完全忽略該字段。可是文檔可能須要新的字段,如location的維度和經度。
一篇文檔一般是數據的JSON表示。和ES溝通最爲普遍使用的方式是HTTP協議的JSON。
文檔的ID沒必要非要是個整數。實際上它是個字符串,並無限制。能夠放置任何對應用有意義的字符。
ES中的文檔是無模式的,也就是說並不是全部的文檔都須要擁有相同的字段,他們不是受限於同一模式的。安全

1.2類型

類型是文檔的邏輯容器,相似於表格是行的容器。在不一樣的類型中,最好放入不一樣結構的文檔。
每一個類型中字段的定義稱爲映射。若是一個字段不是JSON文檔的根節點,在其中搜索時必須指定路徑,如:location中的geolocation字段被稱爲location.geolocation.
若是一篇新近索引的文檔擁有一個映射中尚不存在的字段,ES會自動的將新字段加入映射,爲了添加這個字段,ES不得不肯定它是什麼類型,因而ES會進行猜想,如:若是值是7,ES會假設字段是長整型。這種新字段的自動檢測也有缺點,由於ES可能猜的不對。例如:在索引了值7以後,可能想再索引hello world,這時因爲它是string而不是long,索引就會失敗。對於線上環境,最安全的方式是在索引數據以前,就定義好所需的映射。服務器

1.3索引

索引是映射類型的容器。一個ES索引很是像關係型世界的數據庫,是獨立的大量文檔集合。每一個索引存儲在磁盤上的同組文件中;索引存儲了全部映射類型的字段,還有一些設置。如:每一個索引有一個稱爲refresh_interval的設置,定義了新近索引的文檔對於搜索可見的時間間隔。從性能的角度來看,刷新操做的代價是很是昂貴的,這也是爲何更新只是偶爾進行。默認是每秒更新一次,而不是每來一篇新的文檔就更新一次。ES是準實時的。負載均衡

2.理解物理設計:節點和分片

默認狀況下,每一個索引由5個主要分片組成,而每份主要分片又有一個副本,一共10份分片。副本分片對於可靠性和搜索性能頗有益處。一份分片是一個目錄中的文件,Lucene用這些文件存儲索引數據。分片也是ES將數據從一個節點遷移到另外一個節點的最小單位。分佈式

2.1建立擁有一個或多個節點的集羣

一個節點是一個ES的實例。在服務器上啓動ES以後,就擁有了一個節點。也能夠經過啓動多個ES進程,在同一臺服務器上擁有多個節點。
多個節點能夠加入同一個集羣。在多節點的集羣上,一樣的數據能夠再多臺服務器上傳播。
優勢:
有助於ES的性能,由於ES有了更多的資源。
有助於ES的穩定性,若是每份分片至少有1個副本分片,那麼任何一個節點均可以宕機,而ES依然能夠進行服務,返回全部數據。
默認狀況下,能夠鏈接集羣中的任一節點並訪問完整的數據集。
缺點:
必須肯定節點之間可以足夠快速的通訊,而且不會產生大腦分裂。性能

1. 當索引一篇文檔時發生了什麼
a. 首先根據文檔ID的散列值選擇一個主分片
b. 並將文檔發送到該主分片,這份主分片可能位於另外一個節點
c. 文檔被髮送到該主分片的全部副本分片進行索引。這使得副本分片和主分片之間保持數據同步。數據同步使得副本分片能夠服務於搜索請求,並在原有主分片沒法訪問時自動升級爲主分片。
2. 搜索索引時發生了什麼
ES須要在該索引的完整分片集合中進行查找。這些分片可使主分片,也能夠是副本分片,緣由是對應的主分片和副本分片一般包含同樣的文檔。ES在索引的主分片和副本分片中進行搜索請求的負載均衡,使得副本分片對於搜索性能和容錯都有所幫助。
2.2理解主分片和副本分片
分片:ES處理的最小單元。一份分片是Lucene的索引(因此ES的索引由多個Lucene的索引組成):一個包含倒排索引的文件目錄。倒排索引的結構使得ES在不掃描全部文檔的狀況下,就能找出哪些文檔包含特定的詞條(單詞)。
下圖是一個分片,是一個Lucene索引、一個倒排索引。它默認存儲原始文檔的內容,再加上一些額外的信息,如詞條字典和詞頻。spa

詞條字典將每一個詞條和包含該詞條的文檔映射起來。搜索的時候,ES沒有必要爲了某個詞條掃描全部的文檔,而是根據這個字典快速地識別匹配的文檔。
詞頻使得ES能夠快速地獲取某篇文檔中某個詞條出現的次數。這對於計算結果的相關性得分很是重要。
分片可使主分片,也能夠是副本分片,其中副本分片是主分片的完整副本。副本分片用於搜索,或者在原有主分片丟失後稱爲新的主分片。
ES索引由一個或多個主分片以及零個或多個副本分片構成。副本分片能夠在運行的時候進行添加和移除,而主分片不能夠。能夠在任什麼時候候改變每一個分片的副本分片數量,由於副本分片老是能夠被建立和移除。這並不適用於索引劃分爲主分片的數量,在建立索引以前,必須決定主分片的數量。過少的分片將限制可擴展性,可是過多的分片會影響性能。默認設置的5個分片是一個不錯的選擇。設計

2.3在集羣中分發分片

最簡單的ES集羣只有一個節點:一臺機器上運行着一個ES進程。
水平擴展:隨着愈來愈多的節點被添加到同一個集羣中,現有的分片將在全部的節點中進行負載均衡。所以,在那些分片上的索引和搜索請求均可以從額外增長的節點中獲益。集羣中加入更多節點稱爲水平擴展,請求會被分發,工做負載會被分攤。
垂直擴展:爲ES的節點增長更多硬件資源,多是爲虛擬機分配更多處理器,或是爲物理機增長更多的內存,儘管垂直擴展每次都能提高性能,可是它並不是老是可行的或經濟的。blog

 

2.4分佈式索引和搜索

接受索引請求的ES節點首先選擇文檔索引到那個分片。默認的,文檔在分片中均勻分佈:對於每篇文檔,分片是經過其ID字符串的散列決定的。每份分片擁有相同的散列範圍,接收新文檔的機會均等。一旦目標分片肯定,接受請求的節點將文檔轉發到該分片所在的節點。隨後,索引操做在全部目標分片的全部副本分片中進行。在全部可用副本分片完成文檔的索引後,索引命令就會成功返回。索引

 

在搜索的時候,接受請求的節點將請求轉發到一組包含全部數據的分片。ES使用round-robin的輪訓機制選擇可用的分片(主分片或副本分片),並將搜索請求轉發過去。ES從這些分片收集結果,將其彙集到單一的回覆,而後將回復返回給客戶端應用程序。

 

默認狀況下,搜索請求經過round-robin輪詢機制選中主分片和副本分片,其假設集羣中全部的節點是一樣快的。若是不是如此,能夠組織數據或配置分片,防止較慢的節點稱爲瓶頸。 

相關文章
相關標籤/搜索