三十一、 Elasticsearch集群搭建部署及配置

1、在三个节点上都下载es
如果要安装es,首先就要从官网下载es的linux安装包,并且最新es版本要求有JDK 8以上的版本,将下载的包解压后即可。

2、zen discovery集群发现机制
zen discovery机制提供了unicast discovery集群发现机制,集群发现时的节点间通信是依赖的transport module,也就是es底层的网络通信模块和协议。

es默认配置为使用unicast集群发现机制,还有multicast机制

你会在多台机器上,每台机器部署一个es进程,每台机器都启动一个es进程,你怎么让多台机器上的多个es进程,互相发现对方,然后完美的组成一个生产环境的es集群呢???。。。。

默认情况下,es进程会绑定在自己的回环地址上,也就是127.0.0.1,然后扫描本机上的9300~9305端口号,尝试跟那些端口上启动的其他es进程进行通信,然后组成一个集群。这对于在本机上搭建es集群的开发环境是很方便的。但是对于生产环境下的集群是不行的,需要将每台es进程绑定在一个非回环的ip地址上,才能跟其他节点进行通信,同时需要使用集群发现机制来跟其他节点上的es node进行通信。

我们如果在windows上自己玩儿的话,你直接启动多个es进程,他们自己就会组成一个集群,在生产环境中的多台机器上部署es集群,各个节点互相发现然后组成一个集群的机制,同时也负责es集群的master选举

(1)master node和data node两种角色
client不只跟master通信,而是client跟任何一个node进行通信,node再将请求转发给对应的node来进行执行。正常情况下,就只有一个master node。

master node的责任: 就是负责维护整个集群的状态信息,也就是一些集群元数据信息,同时在node加入集群或者从集群中下线时,重新分配shard,或者是创建或删除了一个索引。包括每次cluster state如果有改变的化,那么master都会负责将集群状态同步给所有的node。
master node负责接收所有的cluster state相关的变化信息,然后将这个改变后的最新的cluster state推动给集群中所有的data node,集群中所有的node都有一份完整的cluster state。只不过master node负责维护而已。其他的node,除了master之外的node,就是负责数据的存储和读写的,写入索引,搜索数据,data node。

如果要让多个node组成一个es集群,首先第一个要设置的参数,就是cluster.name,多个node的cluster.name如果一样,才满足组成一个集群的基本条件。
这个cluster.name的默认值是elasticsearch,在生产环境中,一定要修改这个值,否则可能会导致未知的node无端加入集群,造成集群运行异常。

(2)master node、data node、network.host
你配置的时候,是配置多个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个以内的节点,那就所有节点都可以作为master eligible node以及data node即可,超过10个node的集群再单独拆分master和data node吧
小集群master eligible node,同时也是data node

(3)ping
ping是一个node用discovery机制来发现其他node的一个过程
(4)unicast
unicast discovery集群发现机制是要求配置一个主机列表,用来作为gossip(流言式)通信协议的路由器。这些机器如果通过hostname来指定,那么在ping的时候会被解析为ip地址。unicast discovery机制最重要的两个配置如下所示:

iscovery.zen.ping.unicast.hosts: ["host1", "host2"] 用逗号分割的主机列表
hosts.resolve_timeout:60s hostName被DNS解析为ip地址的timeout等待时长
cluster.name:cluster_name
node.name:cluster_node1
network.host:192.168.1.113

(1)已经初步配置好了,各个节点,首先通过network.host绑定到了非回环的ip地址,从而可以跟其他节点通信
(2)通过discovery.zen.ping.unicast.hosts配置了一批unicast中间路由的node
(3)所有node都可以发送ping消息到路由node,再从路由node获取cluster state回来
(4)接着所有node会选举出一个master
(5)所有node都会跟master进行通信,然后加入master的集群
(6)要求cluster.name必须一样,才能组成一个集群
(7)node.name就标识出了每个node我们自己设置的一个名称

(5)master选举

在ping发现过程中,为集群选举出一个master也是很重要的,es集群会自动完成这个操作。这里建议设置discovery.zen.ping_timeout参数(默认是3s),如果因为网络慢或者拥塞,导致master选举超时,那么可以增加这个参数,确保集群启动的稳定性。

在完成一个集群的master选举之后,每次一个新的node加入集群,都会发送一个join request到master node,可以设置discovery.zen.join_timeout保证node稳定加入集群,增加join的timeout等待时长,如果一次join不上,默认会重试20次。
如果master node被停止了,或者自己宕机了,那么集群中的node会再次进行一次ping过程,并且选举出一个新的master。
如果discovery.zen.master_election.ignore_non_master_pings设置为了true,那么会强制区分master候选节点,如果node的node.master设置为了false,还来发送ping请求参与master选举,那么这些node会被忽略掉,因为他们没有资格参与。

discovery.zen.minimum_master_nodes参数用于设置对于一个新选举的master,要求必须有多少个master候选node去连接那个新选举的master。而且还用于设置一个集群中必须拥有的master候选node。如果这些要求没有被满足,那么master node就会被停止,然后会重新选举一个新的master。这个参数必须设置为我们的master候选node的quorum数量。一般避免说只有两个master候选node,因为2的quorum还是2。如果在那个情况下,任何一个master候选节点宕机了,集群就无法正常运作了。

(6)集群故障的探查

es有两种集群故障探查机制,第一种是通过master进行的,master会ping集群中所有的其他node,确保它们是否是存活着的。第二种,每个node都会去ping master node来确保master node是存活的,否则就会发起一个选举过程。

有下面三个参数用来配置集群故障的探查过程:

ping_interval:每隔多长时间会ping一次node,默认是1s
ping_timeout:每次ping的timeout等待时长是多长时间,默认是30s
ping_retries:如果一个node被ping多少次都失败了,就会认为node故障,默认是3次

(7)集群状态更新

master node是集群中唯一一个可以对cluster state进行更新的node。master node每次会处理一个集群状态的更新事件,应用这次状态更新,然后将更新后的状态发布到集群中所有的node上去。每个node都会接收publish message,ack这个message,但是不会应用这个更新。如果master没有在discovery.zen.commit_timeout指定的时间内(默认是30s),从至少discovery.zen.minimum_master_nodes个节点获取ack响应,那么这次cluster state change事件就会被reject,不会应用。

但是一旦在指定时间内,指定数量的node都返回了ack消息,那么cluster state就会被commit,然后一个message会被发送给所有的node。所有的node接收到那个commit message之后,接着才会将之前接收到的集群状态应用到自己本地的状态副本中去。接着master会等待所有节点再次响应是否更新自己本地副本状态成功,在一个等待超时时长内,如果接收到了响应,那么就会继续处理内存queue中保存的下一个更新状态。discovery.zen.publish_timeout默认是30s,这个超时等待时长是从plublish cluster state开始计算的。

(8)master宕机阻塞集群操作

如果要让集群正常运转,那么必须有一个master,还有discovery.zen.minimum_master_nodes指定数量的master候选node,都在运行。discovery.zen.no_master_block可以控制当master宕机时,什么样的操作应该被拒绝。有下面两个选项:
all:一旦master宕机,那么所有的操作都会被拒绝
write:这是默认的选项,所有的写操作都会被拒绝,但是读操作是被允许的
3、生产集群部署之必须根据自己的集群设置的一些重要参数
(1)、集群名和节点名
cluster.name,node.name
(2)、文件路径
将重要的日志及配置文件放入到指定的目录中,避免升级的时候补删除
path.logs: /var/log/elasticsearch
path.data: /var/data/elasticsearch
path.plugins: /var/plugin/elasticsearch
config:/etc/elasticsearch
es有两个配置文件,elasticsearch.yml,用于配置es,还有一个log4j.properties用来配置es日志打印。这些文件都被放在config目录下,默认就是ES_HOME/config。可以通过下面的命令来重新设置:./bin/elasticsearch -Epath.conf=/path/to/my/config/。
(3)、日志配置

es使用log4j2来记录日志,log4j2可以通过log4j2.properties文件来进行配置。比如下面的这份配置文件:

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类型是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,就配置了将日志每天写一份到/var/log/elasticsearch/production-2017-01-01.log文件中

appender.rolling.policies.time.type = TimeBasedTriggeringPolic,这里配置了用基于时间的roll策略

appender.rolling.policies.time.interval = 1,这个设置了每天一份日志文件

appender.rolling.policies.time.modulate = true,这个设置了根据自然天来划分文件,而不是24小时

还可以配置将日志文件保留一段时间内,同时删除之前的日志文件

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}-* 

第一行是配置了默认的DefaultRolloverStrategy
第二行是配置了Delete action,在rollover之后,就会删除文件
第三行是配置了es log的基础路径
第四行是配置了rollover发生的条件,是基于IfLastModified
第五行是配置了保留的天数,这里是7天
第六行是配置了删除匹配7天前的文件
第七行是配置了一个删除文件的格式,这样就只是删除过期日志文件,但是不要删除慢查询日志

你可能感兴趣的:(三十一、 Elasticsearch集群搭建部署及配置)