elasticsearch Discovery 发现模块学习

发现模块和集群的造成
目标
  • 发现节点
  • Master选举
  • 组成集群,在Master信息发生变化时及时更新。
  • 故障检测
细分为几个子模块
Discovery发现模块

Discover是在集群Master节点未知时,互相发现对方的过程,例如新节点的加入或是先前的主节点宕机,若是一个节点不知足Master资格,则它将继续发现,直到发现了选定的主节点为止,其中,重试配置的属性为:discovery.find_peers_interval,默认值1s。node

官网上master-eligible的含义:设置了node-master:true的节点,表示有资格成为Master的节点。json

1、基于单播的方式发现api

能够在 elasticsearch.yml 配置文件中使用discovery.zen.ping.unicast.hosts静态设置设置主机列表。
discovery.zen.ping.unicast.hosts: ["host1", "host2"]
具体的值是一个主机数组或逗号分隔的字符串。每一个值应采用host:port或host的形式(其中port默认为设置transport.profiles.default.port数组

过期配置 配置(新)
discovery.zen.ping.unicast.hosts discovery.seed_hosts
discovery.zen.hosts_provider discovery.seed_providers
discovery.zen.no_master_block cluster.no_master_block

2、基于配置文件的方式发现服务器

elasticsearch能够在文件中配置种子主机列表,来进行节点发现,这种方式在容器化环境能够很好的支持动态扩展,能够随时更改文件内容,不用重启节点。
文件配置方式为主机ip,主机ip:端口,也可使用主机名配置,这会触发DNS查找,每次在DNS查找中的等待时间属性:discovery.zen.ping.unicast.resolve_timeout,默认为5S,如不指定端口,默认按顺序搜索transport.profiles.default.port、transport.port。
注意: 若是还配置了discovery.seed_hosts,则会把两个配置合并起来。网络

选举

1、选举Master
选举Master须要全部的Master候选节点共同工做,即便某些节点发生了故障,这个工做也必须可以正常进行,es须要经过仲裁的方式选取出还能正常工做的节点,再组成集群,避免造成“脑裂”,这里“脑裂”是指,可能出现不止一个Master节点,好比节点间的通讯断开后,各个Master候选节点都有可能认为其余节点都宕机,提高本身为Master,形成集群状态不一致的状况。由此衍生出参与选主时,须要配置能通讯的候选节点数量。discovery.zen.minimum_master_nodes,缺省配置是1.一个基本的原则是这里须要设置成 N/2+1, N是集群中节点的数量。app

由上面的分析咱们能够知道,是否发生选举,在于节点彼此间的通讯感知,由此可知节点间的网络通讯一样重要,就像是API接口调用,有调用就会有超时,因此在网络环境差的状况下,超时配置显得尤其重要。discovery.zen.ping.timeout用来指定两个节点间的通讯超时时间,默认是3S。根据网络状况,调整这个参数,尽可能避免因为网络延迟,带来的没必要要的选举。curl

2、改变集群状态elasticsearch

投票配置

在elasticsearch7的版本中,当有一半的候选主节点宕机后,集群将不会自动恢复,在剩下的,这种极端状况下,最容易的解决办法就是让这些节点从新上线,
在三个节点的集群中,一般能容忍一个节点的宕机。节点加入或离开集群后,Elasticsearch会经过自动对投票配置进行相应的更改来作出反应,以确保集群尽量具备弹性。相关配置以下:ide

# 将节点加入投票配置排除列表中
# 默认超时时间30s,能够指定超时时间
POST /_cluster/voting_config_exclusions/node_name?timeout=1m
集群启动项

1、集群自举
首次启动Elasticsearch集群须要在集群中的一个或多个Master候选节点上显式定义初始一组主资格节点 . 这个行为称为集群自举。
符合主机要求的初始节点集是在cluster.initial_master_nodes设置中,要求以下:

节点的节点名称。
该节点的主机名,若是node.name没有设置,由于node.name默认为节点的主机名. 根据系统配置,必须使用标准主机名或裸机主机名.
节点的发布地址的IP地址(若是没法使用该节点的node.name 。这是network.host解析到的IP地址,可是能够覆盖此IP地址。
节点发布地址的IP地址和端口,格式为IP:PORT ,若是不可能使用节点的node.name ,而且有多个节点共享一个IP地址

注意:启动Master候选节点时,能够在命令行上或elasticsearch.yml文件中提供此设置. 群集造成后,再也不须要此设置,而且会忽略它,也就是说,这个属性就只是在集群首次启动时有用。而且能够不须要在非Master候选节点上设置。
特别要当心的是,对于Master候选节点的配置最好采用持久化的方式来替代使用CMD命令行的方式启动,由于若是一旦重启Master候选节点时,指定错误,则有可能造成两套不相同的集群。这有可能带来数据丢失的。

file

经过cluster.name设置,能够建立彼此分离的多个群集. 节点在首次相互链接时会验证它们是否赞成其集群名称,而且Elasticsearch将仅由具备相同集群名称的节点组成集群. 集群名称的默认值是elasticsearch ,可是建议更改此值以反映集群的逻辑名称。

添加OR删除节点

因为elasticsearch集群节点时能够动态上线下线的,那在这个过程当中,咱们可以理解或须要够操做什么呢。在主服务器选举期间或加入现有的已造成集群时,节点会向主服务器发送加入请求,以便将其正式添加到集群中. 可使用cluster.join.timeout设置来配置节点在发送加入集群的请求后等待多长时间. 其默认值为30s。

删除符合主机资格的节点时,重要的是不要同时删除太多节点。 例如,若是当前有七个Master候选的节点,但愿将其减小到三个,则不可能简单地一次中止四个节点:这样作将只剩下三个节点,这少于一半投票配置,这意味着群集没法采起任何进一步的措施.只要集群中至少有三个符合主控条件的节点,一般,最好一次删除一个节点,从而为集群留出足够的时间来自动调整表决配置并适应故障新节点集的容差级别。
这里,咱们须要注意,节点上线下线,咱们都须要关注防止“脑裂”的配置,经过调用Elasticsearch APi的方式,将配置持久化下来,而不用重启节点。

curl  -uelastic:passwd -XGET "EsIP:9200/_cluster/settings" -H "Content-Type:application/json" -d '
{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}
'
发布集群的状态

只有Master节点能够更改集群状态。更改后会将更新的状态发布到集群中全部的节点上,每一个节点都会接受这个消息,并进行Ack确认。可是不会应用这个更新。主节点须要在
discovery.zen.commit_timeout配置的时间内获取discovery.zen.minimum_master_nodes个Ack响应,才算是状态成功的发布,不然此次发布就是失败的,不会被应用。
对于那些未收到确认的节点被称为滞后,由于它们的群集状态已落后于主服务器的最新状态. 主机等待滞后的节点再追赶一段时间,经过cluster.follower_lag.timeout ,默认为90s . 若是节点在此时间内仍未成功应用集群状态更新,则认为该节点已失败并从集群中删除。

Master确认Ack数量知足后,才会继续发送确认消息给全部节点,此时节点才会真正的应用这个集群的状态信息,这第二个过程是经过discovery.zen.publish_timeout配置的,默认是30s,这个超时等待时长是从第二次发布时开始计算的。

由上述能够,在发布集群状态时,获取Master候选节点的Ack是很重要的,节点数量由discovery.zen.minimum_master_nodes配置。而没有主节点时,也有相关配置须要了解,它就是:discovery.zen.no_master_block。
discovery.zen.no_master_block设置了没有主节点时,集群的限制操做。
all。表明全部操做均不可用,包括读写等全部api的调用。
write。这是默认值,只有写操做会被拒绝,同时须要注意,这个属性对Node level相关的api是无效的。

集群故障检查

当选的主节点会按期检查群集中的每一个节点,以确保它们仍处于链接状态而且运行情况良好. 群集中的每一个节点还按期检查当选的主机的运行情况. 这些检查分别称为 follower checks 和 leader checks。
相关配置cluster.fault开头,更改默认设置可能会致使群集变得不稳定,不建议修改。

发现和造成集群的配置

这里列举几个必要重要的配置,发现模块的其余配置,已经整理成思惟导图,【侠梦的开发笔记】公众号回复,【发现】获取完整图片。

  • discovery.seed_hosts

提供集群中符合主机要求的节点的列表. 每一个值的格式为host:port或host ,其中port默认为设置transport.profiles.default.port。

  • discovery.seed_providers

以文件的方式提供主机列表,能够动态修改,而不用重启节点(容器化环境适用)

  • cluster.initial_master_nodes

设置全新群集中符合主机要求的节点的初始集合. 默认状况下,该列表为空,这意味着该节点但愿加入已经被引导的集群

  • discovery.find_peers_interval

选定主节点发现时间间隔,默认1S

欢迎关注vx公众号【侠梦的开发笔记】
相关文章
相关标签/搜索