1字柠、什么是node
ES集群中每一個節(jié)點就是一個node枣接,或者一個Elasticsearch實例就是一個節(jié)點护蝶。
node分類:
a白嘁、主節(jié)點:主節(jié)點不接受客戶端的請求,他主要控制Elasticsearch集群智什,負(fù)責(zé)集群中的操作动漾,比如創(chuàng)建/刪除一個索引,跟蹤哪些節(jié)點是群集的一部分荠锭,并決定哪些分片分配給相關(guān)的節(jié)點旱眯。主節(jié)點處理集群的狀態(tài)并廣播到其他節(jié)點,并接收其他節(jié)點的確認(rèn)響應(yīng)。 默認(rèn)情況下任何一個集群中的節(jié)點都有可能被選為主節(jié)點删豺,每個節(jié)點都可以通過設(shè)定配置文件elasticsearch.yml中的node.master屬性為true(默認(rèn))共虑,node.data屬性設(shè)置為false,成為主節(jié)點呀页。對于大型的生產(chǎn)集群來說妈拌,推薦使用一個專門的主節(jié)點來控制集群,該節(jié)點將不處理任何用戶請求赔桌,穩(wěn)定的主節(jié)點對集群的健康是非常重要的供炎。
b、數(shù)據(jù)節(jié)點:該節(jié)點具有存儲數(shù)據(jù)和執(zhí)行數(shù)據(jù)相關(guān)的操作疾党,如增刪改查,搜索惨奕,和聚合操作雪位。數(shù)據(jù)節(jié)點對cpu,內(nèi)存梨撞,io要求較高雹洗,在優(yōu)化的時候需要監(jiān)控數(shù)據(jù)節(jié)點的狀態(tài),當(dāng)資源不夠的時候卧波,需要在集群中添加新的節(jié)點时肿。默認(rèn)情況下,每個節(jié)點都可以通過設(shè)定配置文件elasticsearch.yml中的node.data屬性為true(默認(rèn))成為數(shù)據(jù)節(jié)點港粱。如果我們要使用一個專門的主節(jié)點螃成,應(yīng)將其node.data屬性設(shè)置為false。
c查坪、客戶端節(jié)點:該節(jié)點主要將客戶端的請求路由到集群中的各個節(jié)點寸宏,扮演一個負(fù)載均衡的角色。將node.master屬性和node.data屬性都設(shè)置為false偿曙,那么該節(jié)點就是一個客戶端節(jié)點氮凝。
d、部落節(jié)點:部落節(jié)點可以跨越多個集群望忆,它可以接收每個集群的狀態(tài)罩阵,然后合并成一個全局集群的狀態(tài),它可以讀寫所有節(jié)點上的數(shù)據(jù)启摄,部落節(jié)點在elasticsearch.yml中的配置如下:tribe:*:
總結(jié):
如果將master和client獨立出來稿壁,一旦出現(xiàn)問題,重啟后幾乎是瞬間就恢復(fù)的鞋仍,對用戶幾乎沒有任何影響常摧。另外將這些角色獨立出來的以后,也將對應(yīng)的計算資源消耗從data node剝離出來,更容易掌握data node資源消耗與寫入量和查詢量之間的聯(lián)系落午,便于做容量管理和規(guī)劃谎懦。
2、什么是shard(分片)
一個 分片 是一個底層的 工作單元 溃斋,它僅保存了全部數(shù)據(jù)中的一部分界拦,一個分片是一個 Lucene 的實例,它本身就是一個完整的搜索引擎梗劫。我們的文檔被存儲和索引到分片內(nèi)享甸,但是應(yīng)用程序是直接與索引而不是與分片進(jìn)行交互。
Elasticsearch 是利用分片將數(shù)據(jù)分發(fā)到集群內(nèi)各處的梳侨。分片是數(shù)據(jù)的容器蛉威,文檔保存在分片內(nèi),分片又被分配到集群內(nèi)的各個節(jié)點里走哺。當(dāng)你的集群規(guī)模擴(kuò)大或者縮小時蚯嫌, Elasticsearch 會自動的在各節(jié)點中遷移分片,使得數(shù)據(jù)仍然均勻分布在集群里丙躏。
注意:技術(shù)上來說择示,一個主分片最大能夠存儲 Integer.MAX_VALUE - 128 個文檔,但是實際最大值還需要參考你的使用場景:包括你使用的硬件,文檔的大小和復(fù)雜程度晒旅,索引和查詢文檔的方式以及你期望的響應(yīng)時長栅盲。
主分片:在索引建立的時候就已經(jīng)確定了主分片數(shù),但是副本分片數(shù)可以隨時修改废恋,索引內(nèi)任意一個文檔都?xì)w屬于一個主分片谈秫,所以主分片的數(shù)目決定著索引能夠保存的最大數(shù)據(jù)量。
副分片:一個副本分片只是一個主分片的拷貝拴签。副本分片作為硬件故障時保護(hù)數(shù)據(jù)不丟失的冗余備份孝常,并為搜索和返回文檔等讀操作提供服務(wù)。
3蚓哩、什么是index(索引)
index是保存相關(guān)數(shù)據(jù)的地方构灸,索引實際上是指向一個或者多個物理 分片的邏輯命名空間 。事實上岸梨,我們的數(shù)據(jù)被存儲和索引在分片(shards)中,索引只是一個把一個或者多個分片分組在一起的邏輯空間喜颁,然而內(nèi)部的一些細(xì)節(jié)不需要我們程序關(guān)心,文檔存儲在索引(index)中曹阔,剩下的需要的工作交由Elasticsearch關(guān)心即可半开。索引命名規(guī)范這個名稱必須全部小寫,不能以下劃線開頭赃份,不能包含逗號寂拆。
4奢米、什么是type
在Elasticsearch中,我們可以使用相同類型(type)的文檔表示相同的"事物"纠永,因為他們的數(shù)據(jù)結(jié)構(gòu)是相同的鬓长,每個類型都有自己的映射(mapping)或者結(jié)構(gòu)定義,就像傳統(tǒng)數(shù)據(jù)庫表中的列一樣尝江,所有類型下的文檔被儲存在同一個索引下涉波,但是類型的映射(mapping)會告訴Elasticsearch不同的文檔如何被索引。_type的命名規(guī)范炭序,它的名字可以是大寫或者小寫啤覆,不能包含下劃線或逗號,后面我們將使用employee作為類型名惭聂。
5窗声、什么是document(文檔)
一條記錄,類似數(shù)據(jù)庫中的一列彼妻。在 Elasticsearch 中嫌佑,術(shù)語 文檔 有著特定的含義,它是指最頂層或者根對象, 這個根對象被序列化成 JSON 并存儲到 Elasticsearch 中侨歉,指定了唯一 ID。
文檔元數(shù)據(jù):_index:文檔在哪存放; _type:文檔表示的對象類別; _id:文檔唯一標(biāo)識(可以提供自己的 _id
揩魂,也可以讓 Elasticsearch 幫你生成)幽邓。通過_index、_type火脉、_id 可以唯一確定 Elasticsearch 中的一個文檔牵舵。
當(dāng)然,一個文檔僅僅是在檢查的時候不存在倦挂,并不意味著一毫秒之后它也不存在:也許同時正好另一個進(jìn)程就創(chuàng)建了該文檔畸颅。
6、什么是documnet routing(數(shù)據(jù)路由)
當(dāng)客戶端發(fā)起創(chuàng)建document的時候方援,es需要確定這個document放在該index哪個shard上没炒。這個過程就是數(shù)據(jù)路由。
路由過程:
路由算法:shard = hash(routing) % number_of_primary_shards
routing:每次增刪改查一個document的時候犯戏,都會帶過來一個routing number送火,他的默認(rèn)值就是這個document的_id(可能是手動指定,也可能是自動生成)routing = _id先匪,所以決定一個document在哪個shard上种吸,最重要的一個值就是routing值。相同的routing值呀非,從hash函數(shù)中坚俗,產(chǎn)出的hash值一定是相同的镜盯。
number_of_primary_shards:主分片。
例如:假設(shè)_id=1會將這個routing值猖败,傳入一個hash函數(shù)中速缆,產(chǎn)出一個routing值的hash值,hash(routing) = 21辙浑,然后將hash函數(shù)產(chǎn)出的值對這個index的primaryshard的數(shù)量求余數(shù)激涤,21 % 3 = 0 就決定了,這個document就放在P0上判呕。
手動指定routing:PUT /index/type/id?routing=user_id
手動指定routing value倦踢,可以保證某一類document一定被路由到一個shard上去,那么在后續(xù)進(jìn)行應(yīng)用級別的負(fù)載均衡以及提升批量讀取的性能的時候侠草,是很有幫助的辱挥。
7、為什么primary shard數(shù)量不可變
* 假如我們的集群在初始化的時候有5個primary shard边涕,我們望里邊加入一個document id=5晤碘,假如hash(5)=23,這時該document 將被加入 (shard=23%5=3)P3這個分片上。如果隨后我們給es集群添加一個primary shard 功蜓,此時就有6個primary shard园爷,當(dāng)我們GET id=5 ,這條數(shù)據(jù)的時候式撼,es會計算該請求的路由信息找到存儲他的 primary shard(shard=23%6=5) 童社,根據(jù)計算結(jié)果定位到P5分片上。而我們的數(shù)據(jù)在P3上著隆。所以es集群無法添加primary shard扰楼,但是可以擴(kuò)展replicas shard。 *
8美浦、ES document增刪改的處理流程
ES增刪改的處理流程:增刪該的請求一定作用在主分片上弦赖。
假如我們es集群有3個node,每個node上一個主分片一個復(fù)制分片浦辨。
1蹬竖、客戶端發(fā)起一個PUT請求,假如該請求被發(fā)送到第一個node節(jié)點荤牍,那么該節(jié)點將成為協(xié)調(diào)節(jié)點(coordinating node)案腺,如圖P1所在的節(jié)點就是協(xié)調(diào)節(jié)點。他將根據(jù)該請求的路由信息計算康吵,該document將被存儲到哪個分片劈榨。
2、第二步 通過計算發(fā)現(xiàn)該document被存儲到p0分片晦嵌,那么就將請求轉(zhuǎn)發(fā)到node2節(jié)點同辣。
3拷姿、第三步 P0根據(jù)請求信息創(chuàng)建document,和相應(yīng)的索引信息旱函,創(chuàng)建完畢后將信息同步到自己的副本節(jié)點R0上响巢。
4、第四步 P0和R0將通知我們的協(xié)調(diào)節(jié)點棒妨,任務(wù)完成情況踪古。
5、第五部 協(xié)調(diào)節(jié)點響應(yīng)客戶端最終的處理結(jié)果券腔。
9伏穆、ES document讀請求流程
1、第一步客戶端發(fā)送讀器請求到協(xié)調(diào)節(jié)點(coordinate node)纷纫。
2枕扫、第二步協(xié)調(diào)節(jié)點(coordinate node)根據(jù)請求信息對document進(jìn)行路由計算,將請求轉(zhuǎn)發(fā)到對應(yīng)的node辱魁,node2 或者node3烟瞧。 此時會使用round-robin隨機(jī)輪詢算法,在primary shard以及其所有replica(副本)中隨機(jī)選擇一個染簇,讓讀請求負(fù)載均衡参滴。
3、第三步相應(yīng)接收到請求的節(jié)點(node2或者node3)將處理結(jié)果返回給協(xié)調(diào)節(jié)點(coordinate node)锻弓。
4卵洗、協(xié)調(diào)節(jié)點將最終的結(jié)果反饋給客戶端。
注意:document如果還在建立索引過程中弥咪,可能只有primary shard有,任何一個replica shard都沒有十绑,此時請求如果作用到replica shard上可能會導(dǎo)致無法讀取到document信息聚至。但是document完成索引建立之后,primary shard和replica shard就都有了本橙。