ES的Zen发现机制

ESZen发现机制

Zen发现机制是ElasticSearch默认的发现模块。它提供的是单播发现,但是可被拓展为支持云环境下或者其他形式的发现机制。zen 发现模块集成了其他模块,如在发现期间,节点的通信就是通过transport模块实现 。

zen发现模块可以细分以下几块:

Ping

这是一个节点通过发现机制查找其他节点的进程

Unicast

单播发现需要一组主机列表来充当gossip routers,这些主机可以提供主机名称或者主机的IP;当在Ping的过程中,提供名称的主机被解析成IP地址。需要注意的是你的环境中如果DNS解析如果随着时间变化的话,你需要调整JVMsecurity settings.

推荐设置是将单播列表作为当前集群的master后续列表。

单播发现提供的配置是以discovery.zen.ping.unicast开头:

名称

描述

默认值

hosts

可以是数组设置或者通过“,”分割的设置,每个值的格式是:host:port或者host,如果port可以通过transport.profiles.default.port设置,如果不设置,将会使用transport.tcp.port(默认是9300),需要注意的是如果使用的IPv6的话,必须通过括号括起来

127.0.0.1,[::1]

Hosts.resolve_timeout

DNS解析的时间。需要指定单位

5s

 

 Master选举

作为ping进程的一部分,集群的master被选举出来或者加入其中。这个过程是自动完成的。discovery.zen.ping_timeout(默认是3s)决定了一个节点在决定开始选举还是加入一个存在集群的等待时间。在超过这个时间后,会尝试3次ping。如果已经达到了超时时间,还没有做出决定,则pnig进程会重启。在一个缓慢的或者拥挤的网络中,3s或许不足以在做出决定前,发觉环境中的其他节点。在这种情况下,应该提升超时时间,进而让选举工作慢下来。一旦一个节点决定加入一个现有的网络,则其会向master发送一个20倍ping超时的加入请求。

当master节点停止或者发生问题时,集群则重新开始选举。这个互相ping也作为了网络出问题的一种保障,当一个节点没有意识到master已经失败了(这个理解应该有错误)。在这种情况下,一个节点可以从其他节点处的得到当前的master节点。

discovery.zen.master_election.ignore_non_master_pings被设置为true,在选举过程中,来自非master候选节点的pings将会被忽略。默认值是false.

通过node.master设置为false,将该节点排除,避免其成为matster节点。

discovery.zen.minimum_master_nodes设置参选master的最小值,需要加入新选的master,来完成选举工作,同时,接受master节点的身份。这个参数同样控制最少活跃候选节点的数量,这些节点应该是集群的一部分。如果没有达到这个值,则当前master将要下台,开始新的选举工作。

这个参数必须设置候选节点的有效值。建议避免有两个候选节点,因为两个的有效值是两个。这样,当丢失其中一个候选节点的结果是集群不可用。

故障检测

在es集群中会存在两种故障检测进程,一种是master节点发起的,检测是否可以ping通集群中的节点,同时判断节点是否还存活;另一种是由其他节点发起的,用于判断master节点是否还存活以及是否有必要重新发起选举。相关故障检测参数配置是由discovery.zen.fd为前缀的,相关参数如下:

名称

描述

默认值

ping_interval

Ping的时间间隔

1s

ping_timeout

等待结果响应的超时时间

30s

ping_retries

失败或者超时后重试的次数

3s

 

 

 

 

 

 

  • 集群状态更新

Master节点是集群中唯一可以更新集群状态的节点。Master节点一次处理一个集群状态的更新,应用所需的更改,并将集群的状态发布给集群中的其他节点。每一个节点接受到状态后,确认收到消息,但是并不应用该消息。如果master节点没有在规定的时间内(discovery.zen.commit_timeout默认30s)的得到discovery.zen.minimum_master_nodes节点的认可,则集群状态更新废弃。

一旦得到足够的响应,则集群的状态将被提交,同时,消息也会告知其他节点。然后,节点将状态应用到期内部状态中。Master节点会等待所有节点的响应直到超时,然后去处理队列中新的更新。这discovery.zen.publish_timeout默认是30s,是从状态发布开始计算的。这个超时时间是可以通过api动态更新。

No master block

一个集群可以完整的操作,它必须有一个活的master节点和足够数量的候选master节点来满足discovery.zen.minimum_master_nodes。discovery.zen.no_master_block控制哪些操作将被丢弃,当集群没有master节点时。

discovery.zen.no_master_block有两个有效值:

all

所有的操作,如读和写都将被丢弃。这个同样应用在集群状态的读写api操作,如get index setting, put mapping 和集群状态的api

write

(默认)写操作将被丢弃。根据最后的已知的集群配置,读操作可以成功。这个可能读取部分结果,因为查询的节点可能是一个与其他节点隔离(其实简单的说,就是已经脑裂了)。

 

 

 

 

 

 

discovery.zen.no_master_block这个参数对于节点相关的api无效(如集群属性,节点信息,节点属性)。这些请求的api都不会被拒绝,并且可以运行在任意可用节点。

posted @ 2018-04-15 00:38  woniu4  阅读(906)  评论(0编辑  收藏  举报