ElasticSearch之數據分片

1、什么是node

ES集群中每一個節(jié)點就是一個node,或者一個Elasticsearch實例就是一個節(jié)點。

node分類:

a、主節(jié)點:主節(jié)點不接受客戶端的請求,他主要控制Elasticsearch集群,負責集群中的操作,比如創(chuàng)建/刪除一個索引,跟蹤哪些節(jié)點是群集的一部分,并決定哪些分片分配給相關的節(jié)點。主節(jié)點處理集群的狀態(tài)并廣播到其他節(jié)點,并接收其他節(jié)點的確認響應。 默認情況下任何一個集群中的節(jié)點都有可能被選為主節(jié)點,每個節(jié)點都可以通過設定配置文件elasticsearch.yml中的node.master屬性為true(默認),node.data屬性設置為false,成為主節(jié)點。對于大型的生產集群來說,推薦使用一個專門的主節(jié)點來控制集群,該節(jié)點將不處理任何用戶請求,穩(wěn)定的主節(jié)點對集群的健康是非常重要的。

b、數據節(jié)點:該節(jié)點具有存儲數據和執(zhí)行數據相關的操作,如增刪改查,搜索,和聚合操作。數據節(jié)點對cpu,內存,io要求較高,在優(yōu)化的時候需要監(jiān)控數據節(jié)點的狀態(tài),當資源不夠的時候,需要在集群中添加新的節(jié)點。默認情況下,每個節(jié)點都可以通過設定配置文件elasticsearch.yml中的node.data屬性為true(默認)成為數據節(jié)點。如果我們要使用一個專門的主節(jié)點,應將其node.data屬性設置為false。

c、客戶端節(jié)點:該節(jié)點主要將客戶端的請求路由到集群中的各個節(jié)點,扮演一個負載均衡的角色。將node.master屬性和node.data屬性都設置為false,那么該節(jié)點就是一個客戶端節(jié)點。

d、部落節(jié)點:部落節(jié)點可以跨越多個集群,它可以接收每個集群的狀態(tài),然后合并成一個全局集群的狀態(tài),它可以讀寫所有節(jié)點上的數據,部落節(jié)點在elasticsearch.yml中的配置如下:tribe:*:

總結:

如果將master和client獨立出來,一旦出現問題,重啟后幾乎是瞬間就恢復的,對用戶幾乎沒有任何影響。另外將這些角色獨立出來的以后,也將對應的計算資源消耗從data node剝離出來,更容易掌握data node資源消耗與寫入量和查詢量之間的聯系,便于做容量管理和規(guī)劃。

2、什么是shard(分片)

一個 分片 是一個底層的 工作單元 ,它僅保存了全部數據中的一部分,一個分片是一個 Lucene 的實例,它本身就是一個完整的搜索引擎。我們的文檔被存儲和索引到分片內,但是應用程序是直接與索引而不是與分片進行交互。
Elasticsearch 是利用分片將數據分發(fā)到集群內各處的。分片是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節(jié)點里。當你的集群規(guī)模擴大或者縮小時, Elasticsearch 會自動的在各節(jié)點中遷移分片,使得數據仍然均勻分布在集群里。

注意:技術上來說,一個主分片最大能夠存儲 Integer.MAX_VALUE - 128 個文檔,但是實際最大值還需要參考你的使用場景:包括你使用的硬件,文檔的大小和復雜程度,索引和查詢文檔的方式以及你期望的響應時長。

主分片:在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改,索引內任意一個文檔都歸屬于一個主分片,所以主分片的數目決定著索引能夠保存的最大數據量。
副分片:一個副本分片只是一個主分片的拷貝。副本分片作為硬件故障時保護數據不丟失的冗余備份,并為搜索和返回文檔等讀操作提供服務。

3、什么是index(索引)

index是保存相關數據的地方,索引實際上是指向一個或者多個物理 分片的邏輯命名空間 。事實上,我們的數據被存儲和索引在分片(shards)中,索引只是一個把一個或者多個分片分組在一起的邏輯空間,然而內部的一些細節(jié)不需要我們程序關心,文檔存儲在索引(index)中,剩下的需要的工作交由Elasticsearch關心即可。索引命名規(guī)范這個名稱必須全部小寫,不能以下劃線開頭,不能包含逗號。

4、什么是type

在Elasticsearch中,我們可以使用相同類型(type)的文檔表示相同的"事物",因為他們的數據結構是相同的,每個類型都有自己的映射(mapping)或者結構定義,就像傳統(tǒng)數據庫表中的列一樣,所有類型下的文檔被儲存在同一個索引下,但是類型的映射(mapping)會告訴Elasticsearch不同的文檔如何被索引。_type的命名規(guī)范,它的名字可以是大寫或者小寫,不能包含下劃線或逗號,后面我們將使用employee作為類型名。

5、什么是document(文檔)

一條記錄,類似數據庫中的一列。在 Elasticsearch 中,術語 文檔 有著特定的含義,它是指最頂層或者根對象, 這個根對象被序列化成 JSON 并存儲到 Elasticsearch 中,指定了唯一 ID。

文檔元數據:_index:文檔在哪存放; _type:文檔表示的對象類別; _id:文檔唯一標識(可以提供自己的 _id ,也可以讓 Elasticsearch 幫你生成)。通過_index、_type、_id 可以唯一確定 Elasticsearch 中的一個文檔。

當然,一個文檔僅僅是在檢查的時候不存在,并不意味著一毫秒之后它也不存在:也許同時正好另一個進程就創(chuàng)建了該文檔。

6、什么是documnet routing(數據路由)

當客戶端發(fā)起創(chuàng)建document的時候,es需要確定這個document放在該index哪個shard上。這個過程就是數據路由。

路由過程:

路由算法:shard = hash(routing) % number_of_primary_shards

routing:每次增刪改查一個document的時候,都會帶過來一個routing number,他的默認值就是這個document的_id(可能是手動指定,也可能是自動生成)routing = _id,所以決定一個document在哪個shard上,最重要的一個值就是routing值。相同的routing值,從hash函數中,產出的hash值一定是相同的。

    number_of_primary_shards:主分片。

    例如:假設_id=1會將這個routing值,傳入一個hash函數中,產出一個routing值的hash值,hash(routing) = 21,然后將hash函數產出的值對這個index的primaryshard的數量求余數,21 % 3 = 0 就決定了,這個document就放在P0上。

手動指定routing:PUT /index/type/id?routing=user_id

手動指定routing value,可以保證某一類document一定被路由到一個shard上去,那么在后續(xù)進行應用級別的負載均衡以及提升批量讀取的性能的時候,是很有幫助的。

7、為什么primary shard數量不可變

*  假如我們的集群在初始化的時候有5個primary shard,我們望里邊加入一個document id=5,假如hash(5)=23,這時該document 將被加入 (shard=23%5=3)P3這個分片上。如果隨后我們給es集群添加一個primary shard ,此時就有6個primary shard,當我們GET id=5 ,這條數據的時候,es會計算該請求的路由信息找到存儲他的 primary shard(shard=23%6=5) ,根據計算結果定位到P5分片上。而我們的數據在P3上。所以es集群無法添加primary shard,但是可以擴展replicas shard。 *

8、ES document增刪改的處理流程

image

ES增刪改的處理流程:增刪該的請求一定作用在主分片上。

假如我們es集群有3個node,每個node上一個主分片一個復制分片。

1、客戶端發(fā)起一個PUT請求,假如該請求被發(fā)送到第一個node節(jié)點,那么該節(jié)點將成為協調節(jié)點(coordinating node),如圖P1所在的節(jié)點就是協調節(jié)點。他將根據該請求的路由信息計算,該document將被存儲到哪個分片。

2、第二步 通過計算發(fā)現該document被存儲到p0分片,那么就將請求轉發(fā)到node2節(jié)點。

3、第三步 P0根據請求信息創(chuàng)建document,和相應的索引信息,創(chuàng)建完畢后將信息同步到自己的副本節(jié)點R0上。

4、第四步 P0和R0將通知我們的協調節(jié)點,任務完成情況。

5、第五部 協調節(jié)點響應客戶端最終的處理結果。

9、ES document讀請求流程

image

1、第一步客戶端發(fā)送讀器請求到協調節(jié)點(coordinate node)。
2、第二步協調節(jié)點(coordinate node)根據請求信息對document進行路由計算,將請求轉發(fā)到對應的node,node2 或者node3。 此時會使用round-robin隨機輪詢算法,在primary shard以及其所有replica(副本)中隨機選擇一個,讓讀請求負載均衡。
3、第三步相應接收到請求的節(jié)點(node2或者node3)將處理結果返回給協調節(jié)點(coordinate node)。
4、協調節(jié)點將最終的結果反饋給客戶端。

注意:document如果還在建立索引過程中,可能只有primary shard有,任何一個replica shard都沒有,此時請求如果作用到replica shard上可能會導致無法讀取到document信息。但是document完成索引建立之后,primary shard和replica shard就都有了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容