Elasticsearch 5.x 源码分析(4)走读发现协议ZenDiscovery

2021-12-28 00:00:00 连接 发送 节点 选举 状态

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();   

相关文章