95_es生產(chǎn)集群部署之部署3個ES 5.5節(jié)點以及zen discovery集群發(fā)現(xiàn)機制
生產(chǎn)環(huán)境集群部署
一點一點講解的,生產(chǎn)環(huán)境去部署的時候球昨,涉及到很多的配置,還有牽扯到了很多的es的知識點
我們先下載es 5.5(7月6號為止)的壓縮包,部署到3個節(jié)點上面去介褥,但是不啟動,因為我們接下來要花費很多講的時間來講解各種生產(chǎn)環(huán)境的參數(shù)的配置
es模擬生產(chǎn)環(huán)境的3節(jié)點的集群給啟動起來递惋,停止es進程柔滔,curl,kibana
1萍虽、在三個節(jié)點上都下載es
如果要安裝es睛廊,首先就要從官網(wǎng)下載es的安裝包,并且最新es版本要求有JDK 8以上的版本
es安裝包的目錄結構大致如下:
bin:存放es的一些可執(zhí)行腳本杉编,比如用于啟動進程的elasticsearch命令超全,以及用于安裝插件的elasticsearch-plugin插件
conf:用于存放es的配置文件咆霜,比如elasticsearch.yml
data:用于存放es的數(shù)據(jù)文件,就是每個索引的shard的數(shù)據(jù)文件
logs:用于存放es的日志文件
plugins:用于存放es的插件
script:用于存放一些腳本文件
2嘶朱、zen discovery集群發(fā)現(xiàn)機制
你會在多臺機器上蛾坯,每臺機器部署一個es進程,每臺機器都啟動一個es進程疏遏,你怎么讓多臺機器上的多個es進程偿衰,互相發(fā)現(xiàn)對方,然后完美的組成一個生產(chǎn)環(huán)境的es集群呢改览?下翎??宝当。视事。。庆揩。
默認情況下俐东,es進程會綁定在自己的回環(huán)地址上,也就是127.0.0.1订晌,然后掃描本機上的9300~9305端口號虏辫,嘗試跟那些端口上啟動的其他es進程進行通信,然后組成一個集群锈拨。這對于在本機上搭建es集群的開發(fā)環(huán)境是很方便的砌庄。但是對于生產(chǎn)環(huán)境下的集群是不行的,需要將每臺es進程綁定在一個非回環(huán)的ip地址上奕枢,才能跟其他節(jié)點進行通信娄昆,同時需要使用集群發(fā)現(xiàn)機制來跟其他節(jié)點上的es node進行通信。
大家還記不記得缝彬,我們?nèi)绻趙indows上自己玩兒的話萌焰,是不是說,你直接啟動多個es進程谷浅,他們自己就會組成一個集群
在生產(chǎn)環(huán)境中的多臺機器上部署es集群扒俯,就涉及到了es的discovery機制,也就是集群中各個節(jié)點互相發(fā)現(xiàn)然后組成一個集群的機制一疯,同時discovery機制也負責es集群的master選舉撼玄,關于master,一會兒會講解s
master node和data node兩種角色
es是一種peer to peer违施,也就是p2p點對點的分布式系統(tǒng)架構互纯,不是hadoop生態(tài)普遍采用的那種master-slave主從架構的分布式系統(tǒng)瑟幕。集群中的每個node是直接跟其他節(jié)點進行通信的磕蒲,而不是hadoop生態(tài)系統(tǒng)中的那種master-slave分布式系統(tǒng)架構留潦。幾乎所有的API操作,比如index辣往,delete兔院,search,等等站削,都不是說client跟master通信坊萝,而是client跟任何一個node進行通信,那個node再將請求轉發(fā)給對應的node來進行執(zhí)行许起。這塊的原理十偶,路由,讀寫原理园细,在入門篇都講解過了惦积。
兩個角色,master node猛频,data node狮崩。正常情況下,就只有一個master node鹿寻。master node的責任就是負責維護整個集群的狀態(tài)信息睦柴,也就是一些集群元數(shù)據(jù)信息,同時在node加入集群或者從集群中下限覅按時毡熏,重新分配shard坦敌,或者是創(chuàng)建或刪除了一個索引。包括每次cluster state如果有改變的化痢法,那么master都會負責將集群狀態(tài)同步給所有的node恬试。
master node負責接收所有的cluster state相關的變化信息,然后將這個改變后的最新的cluster state推動給集群中所有的data node疯暑,集群中所有的node都有一份完整的cluster state训柴。只不過master node負責維護而已。其他的node妇拯,除了master之外的node幻馁,就是負責數(shù)據(jù)的存儲和讀寫的,寫入索引越锈,搜索數(shù)據(jù)仗嗦,data node。
如果要讓多個node組成一個es集群甘凭,首先第一個要設置的參數(shù)稀拐,就是cluster.name,多個node的cluster.name如果一樣丹弱,才滿足組成一個集群的基本條件德撬。
這個cluster.name的默認值是elasticsearch铲咨,在生產(chǎn)環(huán)境中,一定要修改這個值蜓洪,否則可能會導致未知的node無端加入集群纤勒,造成集群運行異常。
而es中默認的discovery機制隆檀,就是zen discovery機制
zen discovery機制提供了unicast discovery集群發(fā)現(xiàn)機制摇天,集群發(fā)現(xiàn)時的節(jié)點間通信是依賴的transport module,也就是es底層的網(wǎng)絡通信模塊和協(xié)議恐仑。
es默認配置為使用unicast集群發(fā)現(xiàn)機制泉坐,以讓經(jīng)過特殊配置的節(jié)點可以組成一個集群,而不是隨便哪個節(jié)點都可以組成一個集群裳仆。但是默認配置下坚冀,unicast是本機,也就是localhost鉴逞,因此只能在一臺機器上啟動多個node來組成一個集群记某。雖然es還是會提供multicast plugin作為一個發(fā)現(xiàn)機制,但是已經(jīng)不建議在生產(chǎn)環(huán)境中使用了构捡。雖然我們可能想要multicast的簡單性液南,就是所有的node可以再接收到一條multicast ping之后就立即自動加入集群。但是multicast機制有很多的問題勾徽,而且很脆弱滑凉,比如網(wǎng)絡有輕微的調整,就可能導致節(jié)點無法發(fā)現(xiàn)對方喘帚。因此現(xiàn)在建議在生產(chǎn)環(huán)境中用unicast機制畅姊,提供一個es種子node作為中轉路由節(jié)點就可以了。
(0)master node吹由、data node若未、network.host
給集群規(guī)劃出專門的master eligible node和data node
master node,master eligible node倾鲫,data node
你配置的時候粗合,是配置多個node變成master eligible node,但是只是說乌昔,從這些master eligible node選舉一個node出來作為master node隙疚,其他master eligible node只是接下來有那個master node故障的時候,接替他的資格磕道,但是還是作為data node去使用的
一般建議master eligible node給3個即可:node.master: true供屉,node.data: false
剩下的node都設置為data node:node.master: false,node.data: true
但是如果一個小集群,就10個以內(nèi)的節(jié)點伶丐,那就所有節(jié)點都可以作為master eligible node以及data node即可悼做,超過10個node的集群再單獨拆分master和data node吧
如果你的節(jié)點數(shù)量小于10個,小集群撵割,那所有的node贿堰,就不要做額外的配置了辙芍,master eligible node啡彬,同時也是data node
默認情況下,es會將自己綁定到127.0.0.1上故硅,對于運行一個單節(jié)點的開發(fā)模式下的es是ok的庶灿。但是為了讓節(jié)點間可以互相通信以組成一個集群,需要讓節(jié)點綁定到一個ip地址上吃衅,非會換的地址往踢,一般會配置:network.host: 192.168.1.10。一旦我們配置了network.host徘层,那么es就會認為我們從開發(fā)模式遷移到生產(chǎn)模式峻呕,同時會啟用一系列的bootstrap check。
(1)ping
ping是一個node用discovery機制來發(fā)現(xiàn)其他node的一個過程
(2)unicast
unicast discovery集群發(fā)現(xiàn)機制是要求配置一個主機列表趣效,用來作為gossip(流言式)通信協(xié)議的路由器瘦癌。這些機器如果通過hostname來指定,那么在ping的時候會被解析為ip地址跷敬。unicast discovery機制最重要的兩個配置如下所示:
hosts:用逗號分割的主機列表
hosts.resolve_timeout:hostname被DNS解析為ip地址的timeout等待時長
簡單來說讯私,如果要讓多個節(jié)點發(fā)現(xiàn)對方并且組成一個集群,那么就得有一個中間的公共節(jié)點西傀,然后不同的節(jié)點就發(fā)送請求到這些公共節(jié)點斤寇,接著通過這些公共節(jié)點交換各自的信息,進而讓所有的node感知到其他的node存在拥褂,并且進行通信娘锁,最后組成一個集群。這就是基于gossip流言式通信協(xié)議的unicast集群發(fā)現(xiàn)機制饺鹃。
當一個node與unicast node list中的一個成員通信之后致盟,就會接收到一份完整的集群狀態(tài),這里會列出集群中所有的node尤慰。接著那個node再通過cluster state跟master通信馏锡,并且加入集群中。這就意味著伟端,我們的unicast list node是不需要列出集群中的所有節(jié)點的杯道。只要提供少數(shù)幾個node,比如3個,讓新的node可以連接上即可党巾。如果我們給集群中分配了幾個節(jié)點作為專門的master節(jié)點萎庭,那么只要列出我們那三個專門的master節(jié)點即可。用如下的配置即可:discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]齿拂。
cluster.name
node.name
network.host
discovery.zen.ping.unicast.hosts
(1)已經(jīng)初步配置好了驳规,各個節(jié)點,首先通過network.host綁定到了非回環(huán)的ip地址署海,從而可以跟其他節(jié)點通信
(2)通過discovery.zen.ping.unicast.hosts配置了一批unicast中間路由的node
(3)所有node都可以發(fā)送ping消息到路由node吗购,再從路由node獲取cluster state回來
(4)接著所有node會選舉出一個master
(5)所有node都會跟master進行通信,然后加入master的集群
(6)要求cluster.name必須一樣砸狞,才能組成一個集群
(7)node.name就標識出了每個node我們自己設置的一個名稱
(3)master選舉
在ping發(fā)現(xiàn)過程中捻勉,為集群選舉出一個master也是很重要的,es集群會自動完成這個操作刀森。這里建議設置discovery.zen.ping_timeout參數(shù)(默認是3s)踱启,如果因為網(wǎng)絡慢或者擁塞,導致master選舉超時研底,那么可以增加這個參數(shù)埠偿,確保集群啟動的穩(wěn)定性。
在完成一個集群的master選舉之后榜晦,每次一個新的node加入集群冠蒋,都會發(fā)送一個join request到master node,可以設置discovery.zen.join_timeout保證node穩(wěn)定加入集群芽隆,增加join的timeout等待時長浊服,如果一次join不上,默認會重試20次胚吁。
如果master node被停止了腕扶,或者自己宕機了半抱,那么集群中的node會再次進行一次ping過程,并且選舉出一個新的master炼幔。如果discovery.zen.master_election.ignore_non_master_pings設置為了true乃秀,那么會強制區(qū)分master候選節(jié)點跺讯,如果node的node.master設置為了false刀脏,還來發(fā)送ping請求參與master選舉愈污,那么這些node會被忽略掉,因為他們沒有資格參與茫陆。
discovery.zen.minimum_master_nodes參數(shù)用于設置對于一個新選舉的master擎析,要求必須有多少個master候選node去連接那個新選舉的master揍魂。而且還用于設置一個集群中必須擁有的master候選node棚瘟。如果這些要求沒有被滿足,那么master node就會被停止庄蹋,然后會重新選舉一個新的master迷雪。這個參數(shù)必須設置為我們的master候選node的quorum數(shù)量章咧。一般避免說只有兩個master候選node赁严,因為2的quorum還是2疼约。如果在那個情況下程剥,任何一個master候選節(jié)點宕機了,集群就無法正常運作了茎活。
(4)集群故障的探查
es有兩種集群故障探查機制载荔,第一種是通過master進行的懒熙,master會ping集群中所有的其他node,確保它們是否是存活著的普办。第二種,每個node都會去ping master node來確保master node是存活的衔蹲,否則就會發(fā)起一個選舉過程。
有下面三個參數(shù)用來配置集群故障的探查過程:
ping_interval:每隔多長時間會ping一次node舆驶,默認是1s
ping_timeout:每次ping的timeout等待時長是多長時間橱健,默認是30s
ping_retries:如果一個node被ping多少次都失敗了沙廉,就會認為node故障拘荡,默認是3次
(5)集群狀態(tài)更新
master node是集群中唯一一個可以對cluster state進行更新的node。master node每次會處理一個集群狀態(tài)的更新事件撬陵,應用這次狀態(tài)更新,然后將更新后的狀態(tài)發(fā)布到集群中所有的node上去蟋定。每個node都會接收publish message垢夹,ack這個message,但是不會應用這個更新而晒。如果master沒有在discovery.zen.commit_timeout指定的時間內(nèi)(默認是30s),從至少discovery.zen.minimum_master_nodes個節(jié)點獲取ack響應迅耘,那么這次cluster state change事件就會被reject贱枣,不會應用。
但是一旦在指定時間內(nèi)颤专,指定數(shù)量的node都返回了ack消息纽哥,那么cluster state就會被commit,然后一個message會被發(fā)送給所有的node栖秕。所有的node接收到那個commit message之后春塌,接著才會將之前接收到的集群狀態(tài)應用到自己本地的狀態(tài)副本中去。接著master會等待所有節(jié)點再次響應是否更新自己本地副本狀態(tài)成功簇捍,在一個等待超時時長內(nèi)只壳,如果接收到了響應,那么就會繼續(xù)處理內(nèi)存queue中保存的下一個更新狀態(tài)暑塑。discovery.zen.publish_timeout默認是30s吼句,這個超時等待時長是從plublish cluster state開始計算的。
(6)不因為master宕機阻塞集群操作
如果要讓集群正常運轉事格,那么必須有一個master惕艳,還有discovery.zen.minimum_master_nodes指定數(shù)量的master候選node,都在運行分蓖。discovery.zen.no_master_block可以控制當master宕機時尔艇,什么樣的操作應該被拒絕尔许。有下面兩個選項:
all:一旦master當即么鹤,那么所有的操作都會被拒絕
write:這是默認的選項,所有的寫操作都會被拒絕味廊,但是讀操作是被允許的