Discovery简介
主要是在节点刚启动或者主节点down了的时候,进行节点发现或者master选举。旨在为集群推选一个合适的master(就像是一个国家,不能一天没有领导人吧)。
算法
目前Elasticsearch有主要有两种
ZEN_DISCOVERY_TYPE
legacy-zen 这是旧的服务发现,主要实现是ZenDiscovery
ZEN2_DISCOVERY_TYPE
zen 第二版(新的),主要实现是Coordinator
流程
服务启动流程
当节点初始化的时候会初始化节点的一些基本信息。Discovery模块是Guice进行管理的,这里不再细说Discovery的构建过程。Discovery的启动是在node.start()过程中,transportService启动之后才会启动Discovery模块。
具体启动顺序简单列举:
- transportService 启动
- discovery启动
- clusterService启动
- transportService运行接受清楚
- discovery 初始化加入集群服务
节点发现流程
首先遍历discovery.seed_hosts 以及最后通信的cluster的符合主节点选举条件的主机列表。该遍历过程分两个阶段进行:首先,每个节点通过连接到每个地址并尝试识别它所连接的节点来探测种子地址。其次,它与远程节点共享所有已知的符合主要资格的节点的地址的列表,并且远程节点把它们已知的节点响应给该节点,然后,该节点将探测它刚刚发现的所有新节点。
如果节点不符合主节点,则它将继续此发现过程,直到它发现了选定的主节点。如果未发现选定的主节点,则节点将在超时后进行重试。
如果该节点符合主节点,则它将继续此发现过程,直到它发现了一个选定的主节点,或者它已发现足够的无主节点符合要求的节点来完成选举。如果这个过程超时,那么节点将重新启动发现流程。
相关配置(部分)
cluster.initial_master_nodes 集群初始化的提供的master候选地址,第一次启动时将从该列表中获取master
discovery.seed_hosts 配置该节点会与哪些候选地址进行通信,hostname,ip ,ip+port
discovery.seed_providers 指定种子地址提供的方式,默认settings,也支持其他Discovery Plugins,包括EC2 Discovery,Azure Classic discovery,GCE discovery( Google Compute Engine discovery )
discovery.seed_providers: file 当指定的时候,可以在该指定文件中填写ip,方便单独维护。
discovery.find_peers_interval 未发现主节点的重试时间,默认1s
discovery.seed_resolver.timeout 种子提供地址的超时时间
discovery.seed_resolver.max_concurrent_resolvers 并发查找的数量
由以下配置提供未填写端口时的端口范围。
transport.profiles.default.port
transport.port
ZenDiscovery简介
protected final ZenPing zenPing; // 节点通信探测器
private final MasterFaultDetection masterFD; //master 探测,定期检查是否存活
private final NodesFaultDetection nodesFD; //节点探测,定期检查是否存活
private final PublishClusterStateAction publishClusterState //发布集群状态
private final MembershipAction membership; // 加入或者离开集群的验证或者消息的发送的相关操作。字面意思其实就是集群会员相关操作。
private final ElectMasterService electMaster; // master选举
private final JoinThreadControl joinThreadControl; //join控制器,保证join在集群状态变更后进行相应的操作
private final PendingClusterStatesQueue pendingStatesQueue; //保存所有的没有来得及处理的集群状态变更的队列
private final NodeJoinController nodeJoinController; //节点join集群的控制器
private final NodeRemovalClusterStateTaskExecutor nodeRemovalExecutor; //节点移除的执行器
private final ClusterApplier clusterApplier;