Elasticsearches的集群搭建及數(shù)據(jù)分片過程詳解
Elasticsearch高級之集群搭建,數(shù)據(jù)分片
es使用兩種不同的方式來發(fā)現(xiàn)對方:
廣播
單播
也可以同時使用兩者,但默認的廣播,單播需要已知節(jié)點列表來完成
廣播方式
當es實例啟動的時候,它發(fā)送了廣播的ping請求到地址224.2.2.4:54328。而其他的es實例使用同樣的集群名稱響應(yīng)了這個請求。
一般這個默認的集群名稱就是上面的cluster_name
對應(yīng)的elasticsearch
。通常而言,廣播是個很好地方式。想象一下,廣播發(fā)現(xiàn)就像你大吼一聲:別說話了,再說話我就發(fā)紅包了!然后所有聽見的紛紛響應(yīng)你。
但是,廣播也有不好之處,過程不可控。
- 在本地單獨的目錄中,再復(fù)制一份elasticsearch文件
- 分別啟動bin目錄中的啟動文件
- 在瀏覽器里輸入:http://127.0.0.1:9200/_cluster/health?pretty
- 通過number_of_nodes可以看到,目前集群中已經(jīng)有了兩個節(jié)點了
單播方式
當節(jié)點的ip(想象一下我們的ip地址是不是一直在變)不經(jīng)常變化的時候,或者es只連接特定的節(jié)點。單播發(fā)現(xiàn)是個很理想的模式。使用單播時,我們告訴es集群其他節(jié)點的ip及(可選的)端口及端口范圍。我們在elasticsearch.yml
配置文件中設(shè)置:
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.3:9300", "10.0.0.6[9300-9400]"]
大家就像交換微信名片一樣,相互傳傳就加群了.....
一般的,我們沒必要關(guān)閉單播發(fā)現(xiàn),如果你需要廣播發(fā)現(xiàn)的話,配置文件中的列表保持空白即可。
#現(xiàn)在,我們?yōu)檫@個集群增加一些單播配置,打開各節(jié)點內(nèi)的\config\elasticsearch.yml文件。每個節(jié)點的配置如下(原配置文件都被注釋了,可以理解為空,我寫好各節(jié)點的配置,直接粘貼進去,沒有動注釋的,出現(xiàn)問題了好恢復(fù)): #1 elasticsearch2節(jié)點,,集群名稱是my_es1,集群端口是9300;節(jié)點名稱是node1,監(jiān)聽本地9200端口,可以有權(quán)限成為主節(jié)點和讀寫磁盤(不寫就是默認的)。 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é)點,集群名稱是my_es1,集群端口是9302;節(jié)點名稱是node2,監(jiān)聽本地9202端口,可以有權(quán)限成為主節(jié)點和讀寫磁盤。 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é)點,集群名稱是my_es1,集群端口是9303;節(jié)點名稱是node3,監(jiān)聽本地9203端口,可以有權(quán)限成為主節(jié)點和讀寫磁盤。 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é)點,集群名稱是my_es1,集群端口是9304;節(jié)點名稱是node4,監(jiān)聽本地9204端口,僅能讀寫磁盤而不能被選舉為主節(jié)點。 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é)點有一個共同的名字my_es1,但由于是本地環(huán)境,所以各節(jié)點的名字不能一致,我們分別啟動它們,它們通過單播列表相互介紹,發(fā)現(xiàn)彼此,然后組成一個my_es1集群。誰是老大則是要看誰先啟動了!
選取主節(jié)點
無論是廣播發(fā)現(xiàn)還是到單播發(fā)現(xiàn),一旦集群中的節(jié)點發(fā)生變化,它們就會協(xié)商誰將成為主節(jié)點,elasticsearch認為所有節(jié)點都有資格成為主節(jié)點。
如果集群中只有一個節(jié)點,那么該節(jié)點首先會等一段時間,如果還是沒有發(fā)現(xiàn)其他節(jié)點,就會任命自己為主節(jié)點。
對于節(jié)點數(shù)較少的集群,我們可以設(shè)置主節(jié)點的最小數(shù)量,雖然這么設(shè)置看上去集群可以擁有多個主節(jié)點。
實際上這么設(shè)置是告訴集群有多少個節(jié)點有資格成為主節(jié)點。
怎么設(shè)置呢?修改配置文件中的:
discovery.zen.minimum_master_nodes: 3
一般的規(guī)則是集群節(jié)點數(shù)除以2(向下取整)再加一。比如3個節(jié)點集群要設(shè)置為2。這么著是為了防止腦裂(split brain)問題。
什么是腦裂
腦裂這個詞描述的是這樣的一個場景:
(通常是在重負荷或網(wǎng)絡(luò)存在問題時)elasticsearch集群中一個或者多個節(jié)點失去和主節(jié)點的通信,然后各節(jié)點就開始選舉新的主節(jié)點,繼續(xù)處理請求。
這個時候,可能有兩個不同的集群在相互運行著,這就是腦裂一詞的由來,因為單一集群被分成了兩部分。
為了防止這種情況的發(fā)生,我們就需要設(shè)置集群節(jié)點的總數(shù),規(guī)則就是節(jié)點總數(shù)除以2再加一(半數(shù)以上)。這樣,當一個或者多個節(jié)點失去通信,小老弟們就無法選舉出新的主節(jié)點來形成新的集群。因為這些小老弟們無法滿足設(shè)置的規(guī)則數(shù)量。
我們通過下圖來說明如何防止腦裂。比如現(xiàn)在,有這樣一個5個節(jié)點的集群,并且都有資格成為主節(jié)點:
為了防止腦裂,我們對該集群設(shè)置參數(shù):
discovery.zen.minimum_master_nodes: 3 # 3=5/2+1
之前原集群的主節(jié)點是node1,由于網(wǎng)絡(luò)和負荷等原因,原集群被分為了兩個switch:node1 、2和node3、4、5。
因為minimum_master_nodes參數(shù)是3,所以node3、4、5可以組成集群,并且選舉出了主節(jié)點node3。
而node1、2節(jié)點因為不滿足minimum_master_nodes條件而無法選舉,只能一直尋求加入集群(還記得單播列表嗎?),要么網(wǎng)絡(luò)和負荷恢復(fù)正常后加入node3、4、5組成的集群中,要么就是一直處于尋找集群狀態(tài),這樣就防止了集群的腦裂問題。
除了設(shè)置minimum_master_nodes參數(shù),有時候還需要設(shè)置node_master參數(shù),比如有兩個節(jié)點的集群,如果出現(xiàn)腦裂問題,那么它們自己都無法選舉,因為都不符合半數(shù)以上。
這時我們可以指定node_master,讓其中一個節(jié)點有資格成為主節(jié)點,另外一個節(jié)點只能做存儲用。當然這是特殊情況。
那么,主節(jié)點是如何知道某個節(jié)點還活著呢?這就要說到錯誤識別了。
錯誤識別
其實錯誤識別,就是當主節(jié)點被確定后,建立起內(nèi)部的ping機制來確保每個節(jié)點在集群中保持活躍和健康,這就是錯誤識別。
主節(jié)點ping集群中的其他節(jié)點,而且每個節(jié)點也會ping主節(jié)點來確認主節(jié)點還活著,如果沒有響應(yīng),則宣布該節(jié)點失聯(lián)。想象一下,老大要時不常的看看(循環(huán))小弟們是否還活著,而小老弟們也要時不常的看看老大還在不在,不在了就趕緊再選舉一個出來!
但是,怎么看?多久沒聯(lián)系算是失聯(lián)?這些細節(jié)都是可以設(shè)置的,不是一拍腦門子,就說某個小老弟掛了!在配置文件中,可以設(shè)置:
discovery.zen.fd.ping_interval: 1 discovery.zen.fd.ping_timeout: 30 discovery_zen.fd.ping_retries: 3
每個節(jié)點每隔discovery.zen.fd.ping_interval的時間(默認1秒)發(fā)送一個ping請求,等待discovery.zen.fd.ping_timeout的時間(默認30秒),并嘗試最多discovery.zen.fd.ping_retries次(默認3次),無果的話,宣布節(jié)點失聯(lián),并且在需要的時候進行新的分片和主節(jié)點選舉。
根據(jù)開發(fā)環(huán)境,適當修改這些值。
以上就是Elasticsearches的集群搭建及數(shù)據(jù)分片過程詳解的詳細內(nèi)容,更多關(guān)于Elasticsearches集群搭建數(shù)據(jù)分片的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Kmeans聚類算法python sklearn用戶畫像教程
這篇文章主要介紹了Kmeans聚類算法python sklearn用戶畫像教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07python實現(xiàn)從ftp服務(wù)器下載文件的方法
這篇文章主要介紹了python實現(xiàn)從ftp服務(wù)器下載文件的方法,涉及Python操作FTP的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04pyinstaller打包單文件時--uac-admin選項不起作用怎么辦
這篇文章主要介紹了pyinstaller打包單文件時--uac-admin選項不起作用怎么辦,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04