1、在三個(gè)節(jié)點(diǎn)上都下載es
如果要安裝es,首先就要從官網(wǎng)下載es的linux安裝包,并且最新es版本要求有JDK 8以上的版本,將下載的包解壓后即可。
2、zen discovery集群發(fā)現(xiàn)機(jī)制
zen discovery機(jī)制提供了unicast discovery集群發(fā)現(xiàn)機(jī)制,集群發(fā)現(xiàn)時(shí)的節(jié)點(diǎn)間通信是依賴(lài)的transport module,也就是es底層的網(wǎng)絡(luò)通信模塊和協(xié)議。
es默認(rèn)配置為使用unicast集群發(fā)現(xiàn)機(jī)制,還有multicast機(jī)制
你會(huì)在多臺(tái)機(jī)器上,每臺(tái)機(jī)器部署一個(gè)es進(jìn)程,每臺(tái)機(jī)器都啟動(dòng)一個(gè)es進(jìn)程,你怎么讓多臺(tái)機(jī)器上的多個(gè)es進(jìn)程,互相發(fā)現(xiàn)對(duì)方,然后完美的組成一個(gè)生產(chǎn)環(huán)境的es集群呢???。。。。
默認(rèn)情況下,es進(jìn)程會(huì)綁定在自己的回環(huán)地址上,也就是127.0.0.1,然后掃描本機(jī)上的9300~9305端口號(hào),嘗試跟那些端口上啟動(dòng)的其他es進(jìn)程進(jìn)行通信,然后組成一個(gè)集群。這對(duì)于在本機(jī)上搭建es集群的開(kāi)發(fā)環(huán)境是很方便的。但是對(duì)于生產(chǎn)環(huán)境下的集群是不行的,需要將每臺(tái)es進(jìn)程綁定在一個(gè)非回環(huán)的ip地址上,才能跟其他節(jié)點(diǎn)進(jìn)行通信,同時(shí)需要使用集群發(fā)現(xiàn)機(jī)制來(lái)跟其他節(jié)點(diǎn)上的es node進(jìn)行通信。
我們?nèi)绻趙indows上自己玩兒的話(huà),你直接啟動(dòng)多個(gè)es進(jìn)程,他們自己就會(huì)組成一個(gè)集群,在生產(chǎn)環(huán)境中的多臺(tái)機(jī)器上部署es集群,各個(gè)節(jié)點(diǎn)互相發(fā)現(xiàn)然后組成一個(gè)集群的機(jī)制,同時(shí)也負(fù)責(zé)es集群的master選舉
(1)master node和data node兩種角色
client不只跟master通信,而是client跟任何一個(gè)node進(jìn)行通信,node再將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的node來(lái)進(jìn)行執(zhí)行。正常情況下,就只有一個(gè)master node。
master node的責(zé)任: 就是負(fù)責(zé)維護(hù)整個(gè)集群的狀態(tài)信息,也就是一些集群元數(shù)據(jù)信息,同時(shí)在node加入集群或者從集群中下線(xiàn)時(shí),重新分配shard,或者是創(chuàng)建或刪除了一個(gè)索引。包括每次cluster state如果有改變的化,那么master都會(huì)負(fù)責(zé)將集群狀態(tài)同步給所有的node。
master node負(fù)責(zé)接收所有的cluster state相關(guān)的變化信息,然后將這個(gè)改變后的最新的cluster state推動(dòng)給集群中所有的data node,集群中所有的node都有一份完整的cluster state。只不過(guò)master node負(fù)責(zé)維護(hù)而已。其他的node,除了master之外的node,就是負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀寫(xiě)的,寫(xiě)入索引,搜索數(shù)據(jù),data node。
如果要讓多個(gè)node組成一個(gè)es集群,首先第一個(gè)要設(shè)置的參數(shù),就是cluster.name,多個(gè)node的cluster.name如果一樣,才滿(mǎn)足組成一個(gè)集群的基本條件。
這個(gè)cluster.name的默認(rèn)值是elasticsearch,在生產(chǎn)環(huán)境中,一定要修改這個(gè)值,否則可能會(huì)導(dǎo)致未知的node無(wú)端加入集群,造成集群運(yùn)行異常。
(2)master node、data node、network.host
你配置的時(shí)候,是配置多個(gè)node變成master eligible node,但是只是說(shuō),從這些master eligible node選舉一個(gè)node出來(lái)作為master node,其他master eligible node只是接下來(lái)有那個(gè)master node故障的時(shí)候,接替他的資格,但是還是作為data node去使用的一般建議master eligible node給3個(gè)即可:node.master: true,node.data: false
剩下的node都設(shè)置為data node:node.master: false,node.data: true
但是如果一個(gè)小集群,就10個(gè)以?xún)?nèi)的節(jié)點(diǎn),那就所有節(jié)點(diǎn)都可以作為master eligible node以及data node即可,超過(guò)10個(gè)node的集群再單獨(dú)拆分master和data node吧
小集群master eligible node,同時(shí)也是data node
(3)ping
ping是一個(gè)node用discovery機(jī)制來(lái)發(fā)現(xiàn)其他node的一個(gè)過(guò)程
(4)unicast
unicast discovery集群發(fā)現(xiàn)機(jī)制是要求配置一個(gè)主機(jī)列表,用來(lái)作為gossip(流言式)通信協(xié)議的路由器。這些機(jī)器如果通過(guò)hostname來(lái)指定,那么在ping的時(shí)候會(huì)被解析為ip地址。unicast discovery機(jī)制最重要的兩個(gè)配置如下所示:
iscovery.zen.ping.unicast.hosts: ["host1", "host2"] 用逗號(hào)分割的主機(jī)列表
hosts.resolve_timeout:60s hostName被DNS解析為ip地址的timeout等待時(shí)長(zhǎng)
cluster.name:cluster_name
node.name:cluster_node1
network.host:192.168.1.113
(1)已經(jīng)初步配置好了,各個(gè)節(jié)點(diǎn),首先通過(guò)network.host綁定到了非回環(huán)的ip地址,從而可以跟其他節(jié)點(diǎn)通信
(2)通過(guò)discovery.zen.ping.unicast.hosts配置了一批unicast中間路由的node
(3)所有node都可以發(fā)送ping消息到路由node,再?gòu)穆酚蒼ode獲取cluster state回來(lái)
(4)接著所有node會(huì)選舉出一個(gè)master
(5)所有node都會(huì)跟master進(jìn)行通信,然后加入master的集群
(6)要求cluster.name必須一樣,才能組成一個(gè)集群
(7)node.name就標(biāo)識(shí)出了每個(gè)node我們自己設(shè)置的一個(gè)名稱(chēng)
(5)master選舉
在ping發(fā)現(xiàn)過(guò)程中,為集群選舉出一個(gè)master也是很重要的,es集群會(huì)自動(dòng)完成這個(gè)操作。這里建議設(shè)置discovery.zen.ping_timeout參數(shù)(默認(rèn)是3s),如果因?yàn)榫W(wǎng)絡(luò)慢或者擁塞,導(dǎo)致master選舉超時(shí),那么可以增加這個(gè)參數(shù),確保集群?jiǎn)?dòng)的穩(wěn)定性。
在完成一個(gè)集群的master選舉之后,每次一個(gè)新的node加入集群,都會(huì)發(fā)送一個(gè)join request到master node,可以設(shè)置discovery.zen.join_timeout保證node穩(wěn)定加入集群,增加join的timeout等待時(shí)長(zhǎng),如果一次join不上,默認(rèn)會(huì)重試20次。
如果master node被停止了,或者自己宕機(jī)了,那么集群中的node會(huì)再次進(jìn)行一次ping過(guò)程,并且選舉出一個(gè)新的master。
如果discovery.zen.master_election.ignore_non_master_pings設(shè)置為了true,那么會(huì)強(qiáng)制區(qū)分master候選節(jié)點(diǎn),如果node的node.master設(shè)置為了false,還來(lái)發(fā)送ping請(qǐng)求參與master選舉,那么這些node會(huì)被忽略掉,因?yàn)樗麄儧](méi)有資格參與。
discovery.zen.minimum_master_nodes參數(shù)用于設(shè)置對(duì)于一個(gè)新選舉的master,要求必須有多少個(gè)master候選node去連接那個(gè)新選舉的master。而且還用于設(shè)置一個(gè)集群中必須擁有的master候選node。如果這些要求沒(méi)有被滿(mǎn)足,那么master node就會(huì)被停止,然后會(huì)重新選舉一個(gè)新的master。這個(gè)參數(shù)必須設(shè)置為我們的master候選node的quorum數(shù)量。一般避免說(shuō)只有兩個(gè)master候選node,因?yàn)?的quorum還是2。如果在那個(gè)情況下,任何一個(gè)master候選節(jié)點(diǎn)宕機(jī)了,集群就無(wú)法正常運(yùn)作了。
(6)集群故障的探查
es有兩種集群故障探查機(jī)制,第一種是通過(guò)master進(jìn)行的,master會(huì)ping集群中所有的其他node,確保它們是否是存活著的。第二種,每個(gè)node都會(huì)去ping master node來(lái)確保master node是存活的,否則就會(huì)發(fā)起一個(gè)選舉過(guò)程。
有下面三個(gè)參數(shù)用來(lái)配置集群故障的探查過(guò)程:
ping_interval:每隔多長(zhǎng)時(shí)間會(huì)ping一次node,默認(rèn)是1s
ping_timeout:每次ping的timeout等待時(shí)長(zhǎng)是多長(zhǎng)時(shí)間,默認(rèn)是30s
ping_retries:如果一個(gè)node被ping多少次都失敗了,就會(huì)認(rèn)為node故障,默認(rèn)是3次
(7)集群狀態(tài)更新
master node是集群中唯一一個(gè)可以對(duì)cluster state進(jìn)行更新的node。master node每次會(huì)處理一個(gè)集群狀態(tài)的更新事件,應(yīng)用這次狀態(tài)更新,然后將更新后的狀態(tài)發(fā)布到集群中所有的node上去。每個(gè)node都會(huì)接收publish message,ack這個(gè)message,但是不會(huì)應(yīng)用這個(gè)更新。如果master沒(méi)有在discovery.zen.commit_timeout指定的時(shí)間內(nèi)(默認(rèn)是30s),從至少discovery.zen.minimum_master_nodes個(gè)節(jié)點(diǎn)獲取ack響應(yīng),那么這次cluster state change事件就會(huì)被reject,不會(huì)應(yīng)用。
但是一旦在指定時(shí)間內(nèi),指定數(shù)量的node都返回了ack消息,那么cluster state就會(huì)被commit,然后一個(gè)message會(huì)被發(fā)送給所有的node。所有的node接收到那個(gè)commit message之后,接著才會(huì)將之前接收到的集群狀態(tài)應(yīng)用到自己本地的狀態(tài)副本中去。接著master會(huì)等待所有節(jié)點(diǎn)再次響應(yīng)是否更新自己本地副本狀態(tài)成功,在一個(gè)等待超時(shí)時(shí)長(zhǎng)內(nèi),如果接收到了響應(yīng),那么就會(huì)繼續(xù)處理內(nèi)存queue中保存的下一個(gè)更新?tīng)顟B(tài)。discovery.zen.publish_timeout默認(rèn)是30s,這個(gè)超時(shí)等待時(shí)長(zhǎng)是從plublish cluster state開(kāi)始計(jì)算的。
(8)master宕機(jī)阻塞集群操作
如果要讓集群正常運(yùn)轉(zhuǎn),那么必須有一個(gè)master,還有discovery.zen.minimum_master_nodes指定數(shù)量的master候選node,都在運(yùn)行。discovery.zen.no_master_block可以控制當(dāng)master宕機(jī)時(shí),什么樣的操作應(yīng)該被拒絕。有下面兩個(gè)選項(xiàng):
all:一旦master宕機(jī),那么所有的操作都會(huì)被拒絕
write:這是默認(rèn)的選項(xiàng),所有的寫(xiě)操作都會(huì)被拒絕,但是讀操作是被允許的
3、生產(chǎn)集群部署之必須根據(jù)自己的集群設(shè)置的一些重要參數(shù)
(1)、集群名和節(jié)點(diǎn)名
cluster.name,node.name
(2)、文件路徑
將重要的日志及配置文件放入到指定的目錄中,避免升級(jí)的時(shí)候補(bǔ)刪除
path.logs: /var/log/elasticsearch
path.data: /var/data/elasticsearch
path.plugins: /var/plugin/elasticsearch
config:/etc/elasticsearch
es有兩個(gè)配置文件,elasticsearch.yml,用于配置es,還有一個(gè)log4j.properties用來(lái)配置es日志打印。這些文件都被放在config目錄下,默認(rèn)就是ES_HOME/config??梢酝ㄟ^(guò)下面的命令來(lái)重新設(shè)置:./bin/elasticsearch -Epath.conf=/path/to/my/config/。
(3)、日志配置
es使用log4j2來(lái)記錄日志,log4j2可以通過(guò)log4j2.properties文件來(lái)進(jìn)行配置。比如下面的這份配置文件:
appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.type = RollingFile,就配置了appender類(lèi)型是RollingFile
appender.rolling.fileName = {sys:file.separator}${sys:es.logs.cluster_name}.log,就配置了日志路徑是/var/log/elasticsearch/production.log
appender.rolling.filePattern = {sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log,就配置了將日志每天寫(xiě)一份到/var/log/elasticsearch/production-2017-01-01.log文件中
appender.rolling.policies.time.type = TimeBasedTriggeringPolic,這里配置了用基于時(shí)間的roll策略
appender.rolling.policies.time.interval = 1,這個(gè)設(shè)置了每天一份日志文件
appender.rolling.policies.time.modulate = true,這個(gè)設(shè)置了根據(jù)自然天來(lái)劃分文件,而不是24小時(shí)
還可以配置將日志文件保留一段時(shí)間內(nèi),同時(shí)刪除之前的日志文件
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfLastModified
appender.rolling.strategy.action.condition.age = 7D
appender.rolling.strategy.action.PathConditions.type = IfFileName
appender.rolling.strategy.action.PathConditions.glob = ${sys:es.logs.cluster_name}-*
第一行是配置了默認(rèn)的DefaultRolloverStrategy
第二行是配置了Delete action,在rollover之后,就會(huì)刪除文件
第三行是配置了es log的基礎(chǔ)路徑
第四行是配置了rollover發(fā)生的條件,是基于IfLastModified
第五行是配置了保留的天數(shù),這里是7天
第六行是配置了刪除匹配7天前的文件
第七行是配置了一個(gè)刪除文件的格式,這樣就只是刪除過(guò)期日志文件,但是不要?jiǎng)h除慢查詢(xún)?nèi)罩?/p>