Elasticsearch 5.x 源码分析(4)走读发现协议ZenDiscovery
Elasticsearch 的发现模块应该算是保证Elasticsearch启动并正常工作基本的模块了,可以这么理解,如果启动一个实例后,它连基本的加入一个“组织”都失败的话那么它将无法提供服务。
Elasticsearch的Discovery Module有下面几种实现,
- Azure Classic Discovery
- EC2 Discovery
- Google Compute Engine Discovery
- Zen Discovery
而ZenDiscovery是默认实现,这次主要想走读一下ZenDiscovery的源码来学习一下发现协议是如何运作的。
ZenDiscovery 逻辑起比较重要作用的类有下面几个,也涵盖了这个模块的几大基本功能:
- ZenDiscovery.java 模块的主类,也是启动这个模块的入口,由Node.java调用并初始化,几乎涵盖了全部的发现协议的逻辑,是一个高度内聚了类
- UnicastZenPing.java 是一个ZenPing 实现类,主要是负责底层和其他Nodes建立并维护连接的任务
- PublishClusterStateAction.java 在
ZenDiscovery
中的变量名是publishClusterState
,之前讲过,这些**Action
都是对**Service
的封装,因此它主要是用来处理发送事件和处理事件的接口,比如发送一个clusterStateChangeEvent
和处理这个event,都是通过这个类调用 - MasterFaultDetection.java 构建完cluster后所有的node用来检测master存活状态的类
- NodeFaultDetection.java 构建完cluster后master用来检测其他node存活状态的类
连接
在Node.java的start()
里,discovery代码有4行
Discovery discovery = injector.getInstance(Discovery.class);
clusterService.getMasterService().setClusterStatePublisher(discovery::publish);
// start after transport service so the local disco is known
discovery.start(); // start before cluster service so that it can set initial state on ClusterApplierService
discovery.startInitialJoin();
相关文章