一. ?Elasticsearch架構(gòu)原理
1、Elasticsearch的節(jié)點類型
在Elasticsearch主要分成兩類節(jié)點,一類是Master(主節(jié)點),一類是DataNode(數(shù)據(jù)節(jié)點),還有一種叫客戶端節(jié)點。
在配置文件中體現(xiàn)為:
????????主節(jié)點選舉資格:node.master:true
????????數(shù)據(jù)節(jié)點選舉資格: node.data: true
默認兩個配置都為true,代表都有被選舉為主節(jié)點和數(shù)據(jù)節(jié)點的資格。
1.1 ?Master節(jié)點
????????在Elasticsearch啟動時,會選舉出來一個Master節(jié)點。當(dāng)某個節(jié)點啟動后,然后使用Zen Discovery機制找到集群中的其他節(jié)點,并建立連接。(ES啟動時,也可以在elasticsearch.yml配置中指定當(dāng)前節(jié)點是什么類型)
????????發(fā)現(xiàn)機制前提每個節(jié)點的集群名字要一樣,這就是為什么集群名要一樣。
Master節(jié)點主要負責(zé):
- 管理索引(創(chuàng)建索引、刪除索引)、分配分片:操作索引,決定哪些分片分配給相關(guān)的節(jié)點
- 維護元數(shù)據(jù)(就是mapping等信息)
- 管理集群節(jié)點狀態(tài)
- 不負責(zé)數(shù)據(jù)寫入和查詢,比較輕量級
一個Elasticsearch集群中,只有一個Master節(jié)點。在生產(chǎn)環(huán)境中,內(nèi)存可以相對小一點,但機器要穩(wěn)定。(索引的操作)
1.2 ?DataNode節(jié)點
????????在Elasticsearch集群中,會有N個DataNode節(jié)點。DataNode節(jié)點主要負責(zé):文檔寫入、文檔檢索,大部分Elasticsearch的壓力都在DataNode節(jié)點上。所以在生產(chǎn)環(huán)境中,內(nèi)存最好配置大一些(4個G)。(文檔的操作)
1.3 客戶端節(jié)點
????????當(dāng)主節(jié)點和數(shù)據(jù)節(jié)點配置都設(shè)置為false的時候,代表該節(jié)點即沒有選舉主節(jié)點的資格,也沒有選舉數(shù)據(jù)節(jié)點的資格,該節(jié)點只能處理路由請求,處理搜索,分發(fā)索引操作等,從本質(zhì)上來說該客戶節(jié)點表現(xiàn)為智能負載平衡器。
????????獨立的客戶端節(jié)點在一個比較大的集群中是非常有用的,他協(xié)調(diào)主節(jié)點和數(shù)據(jù)節(jié)點,客戶端節(jié)點加入集群可以得到集群的狀態(tài),根據(jù)集群的狀態(tài)可以直接路由請求。
經(jīng)驗:
????????在生產(chǎn)架構(gòu)中,至少要三臺機器有可以競選主節(jié)點的資格。在實際生產(chǎn)環(huán)境中,可能節(jié)點的功能會比較細化??赡軙袔着_指定為主節(jié)點,有另外幾臺專門作為數(shù)據(jù)節(jié)點。一般建議至少三臺,都設(shè)為true或保持默認。
????????在一個生產(chǎn)集群中我們可以對這些節(jié)點的職責(zé)進行劃分,建議集群中設(shè)置3臺以上的節(jié)點作為master節(jié)點,這些節(jié)點只負責(zé)成為主節(jié)點,維護整個集群的狀態(tài)。再根據(jù)數(shù)據(jù)量設(shè)置一批data節(jié)點,這些節(jié)點只負責(zé)存儲數(shù)據(jù),后期提供查詢索引的服務(wù),這樣的話如果用戶請求比較頻繁,這些節(jié)點的壓力也會比較大,所以在集群中建議再設(shè)置一批client節(jié)點(node.master: false node.data: false),這些節(jié)點只負責(zé)處理用戶請求,實現(xiàn)請求轉(zhuǎn)發(fā),負載均衡等功能。
二 、分片和副本機制
1 、分片(Shard)
?????????Elasticsearch是一個分布式的搜索引擎,索引的數(shù)據(jù)也是分成若干部分,分布在不同的服務(wù)器節(jié)點中。分布在不同服務(wù)器節(jié)點中的索引數(shù)據(jù),就是分片(Shard)。Elasticsearch會自動管理分片,如果發(fā)現(xiàn)分片分布不均衡,就會自動遷移。
????????一個索引(index)由多個shard(分片)組成,而分片是分布在不同的服務(wù)器上的
2、副本
????????為了對Elasticsearch的分片進行容錯,假設(shè)某個節(jié)點不可用,會導(dǎo)致整個索引庫都將不可用。所以,需要對分片進行副本容錯。每一個分片都會有對應(yīng)的副本。
????????在Elasticsearch中,默認(7.x版本)創(chuàng)建的索引為1個分片、每個分片有1個主分片和1個副本分片。但是都是可以設(shè)置的,如果指定了多個主分片,則寫入數(shù)據(jù)的時候可能就寫入其中一個分片中,然后同步備份到若干個副分片中。如果幾個主分片分布于不同的節(jié)點,則同一個索引庫的數(shù)據(jù)自然而然就分布在不同的節(jié)點中。
????????每個分片都會有一個Primary Shard(主分片)和若干個Replica Shard(副本分片),Primary Shard和Replica Shard不在同一個節(jié)點上。如下面的0、1、2,有一個主分片,兩個副本分片。
(在創(chuàng)建索引庫的時候可以通過settings來指定主分片分數(shù)量以及每個主分片有幾個副分片)
(這里表示job_idx_shar這個索引庫有三個主分片,每個主分片又會有兩個副分片。粗的是主分片,細框是副分片)
????????如果node-1掛掉了,則0、1主分片就掛掉了,那就會在node-2和node-3中的兩個0副分片中選一個作為0的主分片;兩個1副分片中選一個作為1的主分片。這樣還是會有一個套主分片和一套副分片,會比較安全。
3、指定分片、副本數(shù)量
#?創(chuàng)建指定分片數(shù)量、副本數(shù)量的索引
PUT /job_idx_shard_temp
{
"mappings":{
"properties":{
"id":{"type":"long","store":true},
"area":{"type":"keyword","store":true},
"exp":{"type":"keyword","store":true},
"edu":{"type":"keyword","store":true},
"salary":{"type":"keyword","store":true},
"job_type":{"type":"keyword","store":true},
"cmp":{"type":"keyword","store":true},
"pv":{"type":"keyword","store":true},
"title":{"type":"text","store":true},
"jd":{"type":"text"}
}
},
# 如下配置會有9個分片,三個主分片六個副本分片
"settings":{
# 指定三個主分片
"number_of_shards":3,
# 指定一個主分片會有兩個副本分片
"number_of_replicas":2
}
}
#?查看分片、主分片、副本分片
GET?/_cat/indices?v
三、Elasticsearch重要工作流程
1、Elasticsearch文檔寫入原理
? ? ? ? 1)選擇任意一個DataNode發(fā)送請求,例如:node2。此時,node2就成為一個coordinating node(協(xié)調(diào)節(jié)點)
? ? ? ? 2)計算得到文檔要寫入的分片,至于寫入哪個分片中是由下面算法計算出來的,routing可以指定,默認是文檔的id,算法的結(jié)果必定是在分片數(shù)量之間。
shard = hash(routing) % number_of_primary_shards
? ? ? ? 3)coordinating node會進行路由,將請求轉(zhuǎn)發(fā)給對應(yīng)的primary shard所在的DataNode(假設(shè)primary shard在node1、replica shard在node2)
? ? ? ? 4)node1節(jié)點上的Primary Shard處理請求,寫入數(shù)據(jù)到索引庫中,并將數(shù)據(jù)同步到Replica shard
? ? ? ? 5)Primary Shard和Replica Shard都保存好了文檔,返回client
2、Elasticsearch檢索原理
? ? ? ? 1)client發(fā)起查詢請求,某個DataNode接收到請求,該DataNode就會成為協(xié)調(diào)節(jié)點(Coordinating Node)。
? ? ? ? 2)協(xié)調(diào)節(jié)點(Coordinating Node)將查詢請求廣播到每一個數(shù)據(jù)節(jié)點,這些數(shù)據(jù)節(jié)點的分片會處理該查詢請求。
? ? ? ? ?3)每個分片進行數(shù)據(jù)查詢,將符合條件的數(shù)據(jù)放在一個優(yōu)先隊列中,并將這些數(shù)據(jù)的文檔ID、節(jié)點信息、分片信息返回給協(xié)調(diào)節(jié)點;協(xié)調(diào)節(jié)點將所有的結(jié)果進行匯總,并進行全局排序。(協(xié)調(diào)匯總,從這里也能看出數(shù)據(jù)節(jié)點壓力大一些,要多分配一些內(nèi)存)
? ? ? ? 4)協(xié)調(diào)節(jié)點向包含這些文檔ID的分片發(fā)送get請求,對應(yīng)的分片將文檔數(shù)據(jù)返回給協(xié)調(diào)節(jié)點,最后協(xié)調(diào)節(jié)點將數(shù)據(jù)返回給客戶端
? ? ? ? 由此可見,分片越多,查詢的效率肯定會有一定影響的。
四、Elasticsearch準(zhǔn)實時索引實現(xiàn)
1、寫入實現(xiàn)
? ? ? ? 1)溢寫到文件系統(tǒng)緩存
????????當(dāng)數(shù)據(jù)寫入到ES分片時,會首先寫入到內(nèi)存中,然后通過內(nèi)存的buffer生成一個segment,并刷到文件系統(tǒng)緩存中,數(shù)據(jù)可以被檢索(注意不是直接刷到磁盤)
ES中默認1秒,refresh一次
????????2)寫translog保障容錯
?????????在寫入到內(nèi)存中的同時,也會記錄translog日志,在refresh期間出現(xiàn)異常,會根據(jù)translog來進行數(shù)據(jù)恢復(fù)
????????等到文件系統(tǒng)緩存中的segment數(shù)據(jù)都刷到磁盤中,清空translog文件
????????3)flush到磁盤
????????ES默認每隔30分鐘會將文件系統(tǒng)緩存的數(shù)據(jù)刷入到磁盤
? ? ? ? 4)segment合并
????????Segment太多時,ES定期會將多個segment合并成為大的segment,減少索引查詢時IO開銷,此階段ES會真正的物理刪除(之前執(zhí)行過的delete的數(shù)據(jù))
總結(jié):
? ? ? ? 1、實時搜索與準(zhǔn)實時搜索
????????實時搜索:剛剛加進去的數(shù)據(jù)就能被查詢出來。
????????ES準(zhǔn)實時:數(shù)據(jù)先被寫入內(nèi)存里面去,(內(nèi)存中的數(shù)據(jù)能不能被讀取呢?es底層基于lucence,lucence是不能夠直讀取內(nèi)存中的數(shù)據(jù)的,只能讀取磁盤,相對速度較慢)。寫入到內(nèi)存中后這個時候是不能被查詢的,每隔一秒中會刷新到文件緩存系統(tǒng)中去(不是磁盤,屬于高速緩沖區(qū),在里面讀數(shù)據(jù)是很快的),這里面查詢速度是很快的,那就意味著每一秒中都會被查詢到的,所以說是準(zhǔn)實時的,然后每隔三十分鐘刷新到磁盤中去。solr就不行,實時性差。
? ? ? ? 2、面試點:如果中間(內(nèi)存刷文件緩存系統(tǒng)/文件緩存系統(tǒng)刷磁盤)宕機了怎么辦?文章來源:http://www.zghlxwxcb.cn/news/detail-428727.html
????????translog,如果中間宕機了,會根據(jù)translog這個日志進行數(shù)據(jù)恢復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-428727.html
到了這里,關(guān)于ElasticSearch集群架構(gòu)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!