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索引、一個倒排索引。它默認存儲原始文檔的內容,再加上一些額外的信息,如詞條字典和詞頻。

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

2.3在集群中分發分片

最簡單的ES集群只有一個節點:一台機器上運行着一個ES進程。
水平擴展:隨着越來越多的節點被添加到同一個集群中,現有的分片將在所有的節點中進行負載均衡。因此,在那些分片上的索引和搜索請求都可以從額外增加的節點中獲益。集群中加入更多節點稱為水平擴展,請求會被分發,工作負載會被分攤。
垂直擴展:為ES的節點增加更多硬件資源,可能是為虛擬機分配更多處理器,或是為物理機增加更多的內存,盡管垂直擴展每次都能提升性能,但是它並非總是可行的或經濟的。

 

2.4分布式索引和搜索

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

 

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

 

默認情況下,搜索請求通過round-robin輪詢機制選中主分片和副本分片,其假設集群中所有的節點是同樣快的。如果不是如此,可以組織數據或配置分片,防止較慢的節點稱為瓶頸。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM