Elasticsearch的底層模塊深入解析之node

node module,主要是用來處理各種不同類型的節(jié)點(diǎn)的,es有哪些類型的node巨朦,另外就是對這些類型的node有些什么特殊的參數(shù),對于一個較大的集群來說剑令,如何去規(guī)劃和配置各種各樣的node

1糊啡、node類型

如果我們啟動es的一個實例,那么就是啟動了一個es node吁津,一些es node就可以組成一個es集群悔橄。如果僅僅運(yùn)行了一個es node,那么也有一個es集群腺毫,只是節(jié)點(diǎn)數(shù)量就是1癣疟。

集群中的每個node都可以處理http和transport請求,其中transport層是用來處理節(jié)點(diǎn)間的通信的潮酒,http層是用來處理外部的客戶端rest請求的睛挚。

所有的node都知道集群中的其他node,并且可以將客戶端的請求轉(zhuǎn)發(fā)到適當(dāng)?shù)墓?jié)點(diǎn)上去急黎。

節(jié)點(diǎn)的類型包含以下幾種:

(1)master-eligible node:master候選節(jié)點(diǎn)扎狱,將node.master設(shè)置為true(默認(rèn)),代表這個node就是master的候選節(jié)點(diǎn)勃教,可以被選舉為master node淤击,然后控制整個集群。

(2)data node:將node.data設(shè)置為true(默認(rèn))故源,data node可以存儲數(shù)據(jù)污抬,同時處理這些數(shù)據(jù)相關(guān)的操作,比如CRUD操作绳军,搜索操作印机,聚合操作,等等门驾。

(3)ingest node:將node.ingest設(shè)置為true(默認(rèn))射赛,ingest node是用來對document寫入索引文件之前進(jìn)行預(yù)處理的∧淌牵可以對每個document都執(zhí)行一條ingest pipeline楣责,在document寫入索引文件之前竣灌,先對其數(shù)據(jù)進(jìn)行處理和轉(zhuǎn)化。但是如果要執(zhí)行的ingest操作太過繁重秆麸,那么可以規(guī)劃單獨(dú)的一批ingest node出來初嘹,然后將node.master和node.data都設(shè)置為false即可。

(4)tribe node:tribe node可以通過tribe.*相關(guān)參數(shù)來設(shè)置蛔屹,它是一種特殊的coordinate node削樊,可以連接到多個es集群上去豁生,然后對多個集群執(zhí)行搜索等操作兔毒。

(5)默認(rèn)情況下,每個node的node.master甸箱,node.data育叁,node.ingest都是true,都是master候選節(jié)點(diǎn)芍殖,也可以作為data node存儲和操作數(shù)據(jù)豪嗽,同時也可以作為ingest node對數(shù)據(jù)進(jìn)行預(yù)處理。對于小于20個節(jié)點(diǎn)的小集群來說豌骏,這種架構(gòu)是ok的龟梦,沒問題的。但是如果對于大于20個物理機(jī)的集群來說窃躲,最好是單獨(dú)規(guī)劃出master node计贰、data node和ingest node來。

(6)coordinate node

搜索和bulk等請求可能會涉及到多個節(jié)點(diǎn)上的不同shard里的數(shù)據(jù)蒂窒,比如一個search請求躁倒,就需要兩個階段執(zhí)行,首先第一個階段就是一個coordinating node接收到這個客戶端的search request洒琢。接著秧秉,coordinating node會將這個請求轉(zhuǎn)發(fā)給存儲相關(guān)數(shù)據(jù)的node,每個data node都會在自己本地執(zhí)行這個請求操作衰抑,同時返回結(jié)果給coordinating node象迎,接著coordinating node會將返回過來的所有的請求結(jié)果進(jìn)行縮減和合并,合并為一個global結(jié)果呛踊。

每個node都是一個coordinating node挖帘。這就意味著如果一個node,將node.master恋技,node.data拇舀,node.ingest全部設(shè)置為false,那么它就是一個純粹的coordinating node蜻底,僅僅用于接收客戶端的請求骄崩,同時進(jìn)行請求的轉(zhuǎn)發(fā)和合并聘鳞。

如果真的是大集群的話,最好也是單獨(dú)規(guī)劃一批node出來要拂,就作為coordinating node抠璃,然后讓es client全部往這些node上去發(fā)送請求。

如果真的是一個大于20個節(jié)點(diǎn)的生產(chǎn)集群的話脱惰,建議將4種node搏嗡,master node,data node拉一,ingest node采盒,cooridating node,全部分離開來

集群中有30臺機(jī)器

master node:3個

ingest node:視具體情況而定蔚润,具體是看你的ingest預(yù)處理操作有多么的復(fù)雜磅氨,耗費(fèi)多少資源,但是一般情況下來說嫡纠,es ingest node用的比較少的烦租,ingest node也可以不用單獨(dú)規(guī)劃一批出來

coordinate node:視具體情況而定,但是對于大集群來說除盏,最好是單獨(dú)拆幾個節(jié)點(diǎn)出來叉橱,用于接收客戶端的請求,3個節(jié)點(diǎn)者蠕。主要是看你的并發(fā)訪問量有多大窃祝,比如說你的最大的QPS也就是10,或者是100蠢棱,那么3個節(jié)點(diǎn)肯定夠了锌杀。如果你的QPS是1000,或者是10000泻仙,那么可能就要規(guī)劃糕再,10個coordinate node,或者100個

data node:24個data node玉转,data node肯定是分配的是最多的突想,主要用來存儲數(shù)據(jù),執(zhí)行各種對數(shù)據(jù)的操作么究抓,資源耗費(fèi)肯定是最多的

2猾担、master eligible node

(1)master-eligible node的介紹以及配置

master node負(fù)責(zé)輕量級的集群管理工作,比如創(chuàng)建和刪除索引刺下,追蹤集群中的每個node绑嘹,決定如何將shards分配給各個node。對于集群來說橘茉,有一個穩(wěn)定的master node工腋,是非常關(guān)鍵的舰蟆。然后master-eligible node都有機(jī)會被選舉為一個master node讶迁,同時master node必須有權(quán)限訪問path.data指定的data目錄,因為master node需要在data目錄中存儲cluster state囱稽。

對數(shù)據(jù)進(jìn)行index和search操作涨颜,會耗費(fèi)大量的cpu誊垢,內(nèi)存悔捶,磁盤io响迂,以及網(wǎng)絡(luò)io,耗費(fèi)的是每個node的資源渗勘。因此我們必須要確保master node是非常穩(wěn)定的沐绒,而且是壓力不大的,對于大集群來說呀邢,比較好的辦法是劃分出單獨(dú)的master node和data node洒沦。如果不拆開的話豹绪,一個node又要是data node价淌,要復(fù)雜存儲數(shù)據(jù),處理各種操作瞒津,同時又要負(fù)責(zé)管理集群蝉衣,可能就會不穩(wěn)定,出問題巷蚪。

同時因為默認(rèn)情況下病毡,master node也能扮演coordinating node的角色,并且將search和index請求路由到對應(yīng)的data node上去執(zhí)行屁柏,最好是不要讓master node來執(zhí)行這些coordinate操作啦膜。因為msater node的穩(wěn)定運(yùn)行對于整個集群來說非常重要,比你利用master node資源來執(zhí)行一些coordinate操作要重要的多淌喻。

如果要設(shè)置一個node為專門的master-eligible node僧家,需要做如下的設(shè)置:

node.master: true
node.data: false
node.ingest: false

(2)通過minimum_master_nodes來避免腦裂問題

要預(yù)防數(shù)據(jù)的丟失,我們就必須設(shè)置discovery.zen.minimum_master_nodes參數(shù)為一個合理的值裸删,這樣的話八拱,每個master-eligible node才知道至少需要多少個master-eligible node才能組成一個集群。

比如說涯塔,我們現(xiàn)在有一個集群肌稻,其中包含兩個master-eligible nodes。然后一個網(wǎng)絡(luò)故障發(fā)生了匕荸,這兩個節(jié)點(diǎn)之間丟失了聯(lián)絡(luò)爹谭。每個節(jié)點(diǎn)都認(rèn)為當(dāng)前只有一個master-eligible node,就是它們自己榛搔。此時如果discovery.zen.minimum_master_nodes參數(shù)的默認(rèn)值是1诺凡,那么每個node就可以讓自己組成一個集群齿风,選舉自己為master node即可。結(jié)果就會導(dǎo)致出現(xiàn)了兩個es集群绑洛,這就是腦裂現(xiàn)象救斑。即使網(wǎng)絡(luò)故障解決了,但是這兩個master node是不可能重新組成一個集群了真屯。除非某個master eligible node重啟脸候,然后自動加入另外一個集群,但是此時寫入這個節(jié)點(diǎn)的數(shù)據(jù)就會徹底丟失绑蔫。

那么如果現(xiàn)在我們有3個master-eligible node运沦,同時將discovery.zen.minimum_master_nodes設(shè)置為2.如果網(wǎng)絡(luò)故障發(fā)生了,此時一個網(wǎng)絡(luò)分區(qū)有1個node配深,另外一個網(wǎng)絡(luò)分區(qū)有2個node携添,只有一個node的那個網(wǎng)絡(luò)分區(qū),沒法檢測到足夠數(shù)量的master-eligible node篓叶,那么此時它就不能選舉一個master node出來組成一個新集群烈掠。但是有兩個node的那個網(wǎng)絡(luò)分區(qū),它們會發(fā)現(xiàn)這里有足夠數(shù)量的master-eligible node缸托,那么就選舉出一個新的master左敌,然后組成一個集群。當(dāng)網(wǎng)絡(luò)故障解除之后俐镐,那個落單的node就會重新加入集群中矫限。

discovery.zen.minimum_master_nodes,必須設(shè)置為master-eligible nodes的quorum佩抹,quorum的公式為:(master_eligible_nodes / 2) + 1叼风。

換句話來說,如果有3個master-eligible nodes棍苹,那么那個參數(shù)就必須設(shè)置為(3 / 2) + 1 = 2无宿,比如下面這樣:

discovery.zen.minimum_master_nodes: 2

隨著集群節(jié)點(diǎn)的上線和下限,這個參數(shù)都是要重新設(shè)置的廊勃,可以通過api來設(shè)置

PUT _cluster/settings
{
  "transient": {
    "discovery.zen.minimum_master_nodes": 2
  }
}

此時將master node和data node分離的好處就出來了懈贺,一般如果單獨(dú)規(guī)劃一個master nodes的話,只要規(guī)劃固定的3個node是master-eligible node就可以了坡垫,那么data node無論上線和下限多少個梭灿,都無所謂的。

3冰悠、data node

data node負(fù)責(zé)存儲shard的數(shù)據(jù)堡妒,也就是那些document。data node可以處理各種操作溉卓,比如CRUD皮迟,搜索搬泥,聚合。這些操作全都是很耗費(fèi)IO伏尼,內(nèi)存和cpu資源的忿檩。因此監(jiān)控這些資源的使用是很重要的,同時如果資源過載了爆阶,那么就要添加更多的data node燥透。

如果要設(shè)置一個專門的data node,需要做出如下的設(shè)置:

node.master: false
node.data: true
node.ingest: false

4辨图、ingest node

nigest node可以執(zhí)行預(yù)處理pipeline班套,包含了多個ingest processors。不同的ingest processor執(zhí)行的操作類型是不同的故河,那么對資源的需求也是不同的吱韭,不過還是最好是規(guī)劃一批單獨(dú)的ingest node出來,不要跟master node和data node混合在一起鱼的。

如果要配置一個單獨(dú)的ingest node:

node.master: false
node.data: false
node.ingest: true
search.remote.connect: false

5理盆、cooridnating only node

如果我們規(guī)劃了一批專門的master node,data node以及ingest node鸳吸,那么此時還遺留下來了一種node熏挎,那就是coordinating node速勇,這些node專門用來接收客戶端的請求晌砾,同時對請求進(jìn)行路由和轉(zhuǎn)發(fā),并對請求的結(jié)果進(jìn)行合并烦磁。

coordinating only nodes對于大集群來說养匈,可以使用專門的node來負(fù)載coordinate操作,而不是讓coordinate操作的工作負(fù)載集中到master node和data node上去都伪。coordinating node也會加入cluster呕乎,同時可以獲取到完整的cluster state,它們主要是用cluster state中包含的node info來進(jìn)行請求轉(zhuǎn)發(fā)陨晶。

如果在一個集群中規(guī)劃太多的coordinating node可能會加重整個集群的負(fù)擔(dān)猬仁,因為被選舉出來的master node必須要從所有的node上得到cluster state update的ack,如果coordinating nodes過多先誉,那么可能會加重master node的負(fù)擔(dān)湿刽。

如果要設(shè)置coordinating only node的話:

node.master: false
node.data: false
node.ingest: false
search.remote.connect: false

6、node data path設(shè)置

(1)path.data

每個data和master-eligible node都需要能夠訪問data目錄褐耳,在那里存儲了每個shard的數(shù)據(jù)诈闺,包括cluster state也存儲在那里。path.data默認(rèn)是指向$ES_HOME/data目錄的铃芦,但是在生產(chǎn)環(huán)境中雅镊,肯定是不能這樣設(shè)置的襟雷,因為在升級es的時候,可能會導(dǎo)致數(shù)據(jù)被清空或者覆蓋仁烹。

此時一般需要在elasticsearch.yml中設(shè)置path.data:

path.data: /var/elasticsearch/data

(2)node.max_local_storage_nodes

data目錄可以被多個node共享耸弄,即使是不同集群中的es node,也許他們在一個物理機(jī)上啟動了卓缰。這個共享的方式對于我們測試failover是很有用的叙赚,以及在開發(fā)機(jī)上測試不同的配置。但是在生產(chǎn)環(huán)境下僚饭,絕對不用這么做震叮,一個data目錄就給一個es node使用即可。默認(rèn)情況下鳍鸵,es被配置成阻止超過一個node共享data目錄中的數(shù)據(jù)苇瓣,如果要允許多個node共享一個data目錄,需要設(shè)置node.max_local_storage_nodes為一個超過1的數(shù)字偿乖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击罪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贪薪,更是在濱河造成了極大的恐慌媳禁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件画切,死亡現(xiàn)場離奇詭異竣稽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霍弹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門毫别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人典格,你說我怎么就攤上這事岛宦。” “怎么了耍缴?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵砾肺,是天一觀的道長。 經(jīng)常有香客問我防嗡,道長变汪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任本鸣,我火速辦了婚禮疫衩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己闷煤,他們只是感情好童芹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲤拿,像睡著了一般假褪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上近顷,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天生音,我揣著相機(jī)與錄音,去河邊找鬼窒升。 笑死缀遍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饱须。 我是一名探鬼主播域醇,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓉媳!你這毒婦竟也來了譬挚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤酪呻,失蹤者是張志新(化名)和其女友劉穎减宣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玩荠,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漆腌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姨蟋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屉凯。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖眼溶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晓勇,我是刑警寧澤堂飞,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站绑咱,受9級特大地震影響绰筛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜描融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一铝噩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窿克,春花似錦骏庸、人聲如沸毛甲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玻募。三九已至,卻和暖如春一姿,著一層夾襖步出監(jiān)牢的瞬間七咧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工叮叹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艾栋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓蛉顽,卻偏偏與公主長得像裹粤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜂林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容