Elasticsearches的集群搭建及數(shù)據(jù)分片過(guò)程詳解
Elasticsearch高級(jí)之集群搭建,數(shù)據(jù)分片
es使用兩種不同的方式來(lái)發(fā)現(xiàn)對(duì)方:
廣播
單播
也可以同時(shí)使用兩者,但默認(rèn)的廣播,單播需要已知節(jié)點(diǎn)列表來(lái)完成
廣播方式
當(dāng)es實(shí)例啟動(dòng)的時(shí)候,它發(fā)送了廣播的ping請(qǐng)求到地址224.2.2.4:54328。而其他的es實(shí)例使用同樣的集群名稱響應(yīng)了這個(gè)請(qǐng)求。

一般這個(gè)默認(rèn)的集群名稱就是上面的cluster_name對(duì)應(yīng)的elasticsearch。通常而言,廣播是個(gè)很好地方式。想象一下,廣播發(fā)現(xiàn)就像你大吼一聲:別說(shuō)話了,再說(shuō)話我就發(fā)紅包了!然后所有聽(tīng)見(jiàn)的紛紛響應(yīng)你。
但是,廣播也有不好之處,過(guò)程不可控。
- 在本地單獨(dú)的目錄中,再?gòu)?fù)制一份elasticsearch文件
- 分別啟動(dòng)bin目錄中的啟動(dòng)文件
- 在瀏覽器里輸入:http://127.0.0.1:9200/_cluster/health?pretty
- 通過(guò)number_of_nodes可以看到,目前集群中已經(jīng)有了兩個(gè)節(jié)點(diǎn)了
單播方式
當(dāng)節(jié)點(diǎn)的ip(想象一下我們的ip地址是不是一直在變)不經(jīng)常變化的時(shí)候,或者es只連接特定的節(jié)點(diǎn)。單播發(fā)現(xiàn)是個(gè)很理想的模式。使用單播時(shí),我們告訴es集群其他節(jié)點(diǎn)的ip及(可選的)端口及端口范圍。我們?cè)?code>elasticsearch.yml配置文件中設(shè)置:
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.3:9300", "10.0.0.6[9300-9400]"]
大家就像交換微信名片一樣,相互傳傳就加群了.....

一般的,我們沒(méi)必要關(guān)閉單播發(fā)現(xiàn),如果你需要廣播發(fā)現(xiàn)的話,配置文件中的列表保持空白即可。
#現(xiàn)在,我們?yōu)檫@個(gè)集群增加一些單播配置,打開各節(jié)點(diǎn)內(nèi)的\config\elasticsearch.yml文件。每個(gè)節(jié)點(diǎn)的配置如下(原配置文件都被注釋了,可以理解為空,我寫好各節(jié)點(diǎn)的配置,直接粘貼進(jìn)去,沒(méi)有動(dòng)注釋的,出現(xiàn)問(wèn)題了好恢復(fù)): #1 elasticsearch2節(jié)點(diǎn),,集群名稱是my_es1,集群端口是9300;節(jié)點(diǎn)名稱是node1,監(jiān)聽(tīng)本地9200端口,可以有權(quán)限成為主節(jié)點(diǎn)和讀寫磁盤(不寫就是默認(rèn)的)。 cluster.name: my_es1 node.name: node1 network.host: 127.0.0.1 http.port: 9200 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9303", "127.0.0.1:9304"] # 2 elasticsearch3節(jié)點(diǎn),集群名稱是my_es1,集群端口是9302;節(jié)點(diǎn)名稱是node2,監(jiān)聽(tīng)本地9202端口,可以有權(quán)限成為主節(jié)點(diǎn)和讀寫磁盤。 cluster.name: my_es1 node.name: node2 network.host: 127.0.0.1 http.port: 9202 transport.tcp.port: 9302 node.master: true node.data: true discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9303", "127.0.0.1:9304"] # 3 elasticsearch3節(jié)點(diǎn),集群名稱是my_es1,集群端口是9303;節(jié)點(diǎn)名稱是node3,監(jiān)聽(tīng)本地9203端口,可以有權(quán)限成為主節(jié)點(diǎn)和讀寫磁盤。 cluster.name: my_es1 node.name: node3 network.host: 127.0.0.1 http.port: 9203 transport.tcp.port: 9303 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9303", "127.0.0.1:9304"] # 4 elasticsearch4節(jié)點(diǎn),集群名稱是my_es1,集群端口是9304;節(jié)點(diǎn)名稱是node4,監(jiān)聽(tīng)本地9204端口,僅能讀寫磁盤而不能被選舉為主節(jié)點(diǎn)。 cluster.name: my_es1 node.name: node4 network.host: 127.0.0.1 http.port: 9204 transport.tcp.port: 9304 node.master: false node.data: true discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9303", "127.0.0.1:9304"]
由上例的配置可以看到,各節(jié)點(diǎn)有一個(gè)共同的名字my_es1,但由于是本地環(huán)境,所以各節(jié)點(diǎn)的名字不能一致,我們分別啟動(dòng)它們,它們通過(guò)單播列表相互介紹,發(fā)現(xiàn)彼此,然后組成一個(gè)my_es1集群。誰(shuí)是老大則是要看誰(shuí)先啟動(dòng)了!
選取主節(jié)點(diǎn)
無(wú)論是廣播發(fā)現(xiàn)還是到單播發(fā)現(xiàn),一旦集群中的節(jié)點(diǎn)發(fā)生變化,它們就會(huì)協(xié)商誰(shuí)將成為主節(jié)點(diǎn),elasticsearch認(rèn)為所有節(jié)點(diǎn)都有資格成為主節(jié)點(diǎn)。
如果集群中只有一個(gè)節(jié)點(diǎn),那么該節(jié)點(diǎn)首先會(huì)等一段時(shí)間,如果還是沒(méi)有發(fā)現(xiàn)其他節(jié)點(diǎn),就會(huì)任命自己為主節(jié)點(diǎn)。
對(duì)于節(jié)點(diǎn)數(shù)較少的集群,我們可以設(shè)置主節(jié)點(diǎn)的最小數(shù)量,雖然這么設(shè)置看上去集群可以擁有多個(gè)主節(jié)點(diǎn)。
實(shí)際上這么設(shè)置是告訴集群有多少個(gè)節(jié)點(diǎn)有資格成為主節(jié)點(diǎn)。
怎么設(shè)置呢?修改配置文件中的:
discovery.zen.minimum_master_nodes: 3
一般的規(guī)則是集群節(jié)點(diǎn)數(shù)除以2(向下取整)再加一。比如3個(gè)節(jié)點(diǎn)集群要設(shè)置為2。這么著是為了防止腦裂(split brain)問(wèn)題。
什么是腦裂
腦裂這個(gè)詞描述的是這樣的一個(gè)場(chǎng)景:
(通常是在重負(fù)荷或網(wǎng)絡(luò)存在問(wèn)題時(shí))elasticsearch集群中一個(gè)或者多個(gè)節(jié)點(diǎn)失去和主節(jié)點(diǎn)的通信,然后各節(jié)點(diǎn)就開始選舉新的主節(jié)點(diǎn),繼續(xù)處理請(qǐng)求。
這個(gè)時(shí)候,可能有兩個(gè)不同的集群在相互運(yùn)行著,這就是腦裂一詞的由來(lái),因?yàn)閱我患罕环殖闪藘刹糠帧?/p>
為了防止這種情況的發(fā)生,我們就需要設(shè)置集群節(jié)點(diǎn)的總數(shù),規(guī)則就是節(jié)點(diǎn)總數(shù)除以2再加一(半數(shù)以上)。這樣,當(dāng)一個(gè)或者多個(gè)節(jié)點(diǎn)失去通信,小老弟們就無(wú)法選舉出新的主節(jié)點(diǎn)來(lái)形成新的集群。因?yàn)檫@些小老弟們無(wú)法滿足設(shè)置的規(guī)則數(shù)量。
我們通過(guò)下圖來(lái)說(shuō)明如何防止腦裂。比如現(xiàn)在,有這樣一個(gè)5個(gè)節(jié)點(diǎn)的集群,并且都有資格成為主節(jié)點(diǎn):

為了防止腦裂,我們對(duì)該集群設(shè)置參數(shù):
discovery.zen.minimum_master_nodes: 3 # 3=5/2+1
之前原集群的主節(jié)點(diǎn)是node1,由于網(wǎng)絡(luò)和負(fù)荷等原因,原集群被分為了兩個(gè)switch:node1 、2和node3、4、5。
因?yàn)閙inimum_master_nodes參數(shù)是3,所以node3、4、5可以組成集群,并且選舉出了主節(jié)點(diǎn)node3。
而node1、2節(jié)點(diǎn)因?yàn)椴粷M足minimum_master_nodes條件而無(wú)法選舉,只能一直尋求加入集群(還記得單播列表嗎?),要么網(wǎng)絡(luò)和負(fù)荷恢復(fù)正常后加入node3、4、5組成的集群中,要么就是一直處于尋找集群狀態(tài),這樣就防止了集群的腦裂問(wèn)題。
除了設(shè)置minimum_master_nodes參數(shù),有時(shí)候還需要設(shè)置node_master參數(shù),比如有兩個(gè)節(jié)點(diǎn)的集群,如果出現(xiàn)腦裂問(wèn)題,那么它們自己都無(wú)法選舉,因?yàn)槎疾环习霐?shù)以上。
這時(shí)我們可以指定node_master,讓其中一個(gè)節(jié)點(diǎn)有資格成為主節(jié)點(diǎn),另外一個(gè)節(jié)點(diǎn)只能做存儲(chǔ)用。當(dāng)然這是特殊情況。
那么,主節(jié)點(diǎn)是如何知道某個(gè)節(jié)點(diǎn)還活著呢?這就要說(shuō)到錯(cuò)誤識(shí)別了。
錯(cuò)誤識(shí)別
其實(shí)錯(cuò)誤識(shí)別,就是當(dāng)主節(jié)點(diǎn)被確定后,建立起內(nèi)部的ping機(jī)制來(lái)確保每個(gè)節(jié)點(diǎn)在集群中保持活躍和健康,這就是錯(cuò)誤識(shí)別。
主節(jié)點(diǎn)ping集群中的其他節(jié)點(diǎn),而且每個(gè)節(jié)點(diǎn)也會(huì)ping主節(jié)點(diǎn)來(lái)確認(rèn)主節(jié)點(diǎn)還活著,如果沒(méi)有響應(yīng),則宣布該節(jié)點(diǎn)失聯(lián)。想象一下,老大要時(shí)不常的看看(循環(huán))小弟們是否還活著,而小老弟們也要時(shí)不常的看看老大還在不在,不在了就趕緊再選舉一個(gè)出來(lái)!

但是,怎么看?多久沒(méi)聯(lián)系算是失聯(lián)?這些細(xì)節(jié)都是可以設(shè)置的,不是一拍腦門子,就說(shuō)某個(gè)小老弟掛了!在配置文件中,可以設(shè)置:
discovery.zen.fd.ping_interval: 1 discovery.zen.fd.ping_timeout: 30 discovery_zen.fd.ping_retries: 3
每個(gè)節(jié)點(diǎn)每隔discovery.zen.fd.ping_interval的時(shí)間(默認(rèn)1秒)發(fā)送一個(gè)ping請(qǐng)求,等待discovery.zen.fd.ping_timeout的時(shí)間(默認(rèn)30秒),并嘗試最多discovery.zen.fd.ping_retries次(默認(rèn)3次),無(wú)果的話,宣布節(jié)點(diǎn)失聯(lián),并且在需要的時(shí)候進(jìn)行新的分片和主節(jié)點(diǎn)選舉。
根據(jù)開發(fā)環(huán)境,適當(dāng)修改這些值。
以上就是Elasticsearches的集群搭建及數(shù)據(jù)分片過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于Elasticsearches集群搭建數(shù)據(jù)分片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python機(jī)器學(xué)習(xí)MATLAB最小二乘法的兩種解讀
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)中MATLAB最小二乘法的兩種解讀方式,有需要的朋友可以借鑒參考下希望能夠有所幫助2022-02-02
對(duì)tf.reduce_sum tensorflow維度上的操作詳解
今天小編就為大家分享一篇對(duì)tf.reduce_sum tensorflow維度上的操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python3安裝及pip3報(bào)ERROR:No?matching?distribution?found?for解
這篇文章主要給大家介紹了關(guān)于python3安裝及pip3報(bào)ERROR:No?matching?distribution?found?for解決的相關(guān)資料,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Pandas.DataFrame重置Series的索引index(reset_index)
本文主要介紹了Pandas.DataFrame重置Series的索引index(reset_index),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
PIL包中Image模塊的convert()函數(shù)的具體使用
這篇文章主要介紹了PIL包中Image模塊的convert()函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
詳解Python中HTML解析庫(kù)pyquery的使用
在工作中難免會(huì)遇到解析 HTML 的場(chǎng)景,比如將網(wǎng)頁(yè)下載下來(lái)之后,要解析出里面圖片的路徑、指定標(biāo)簽里的文本等等,而 pyquery 專門負(fù)責(zé)做這件事,下面我們就來(lái)學(xué)習(xí)一下他的具體用法吧2023-12-12
python subprocess 殺掉全部派生的子進(jìn)程方法
下面小編就為大家?guī)?lái)一篇python subprocess 殺掉全部派生的子進(jìn)程方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01

