elasticsearch集群cluster示例详解-亚博电竞手机版
目录
- 前言
- 节点discoverynode
- 集群阻塞
- clusterservice接口
- 总结
前言
上一篇通过clusterservice对cluster做了一个简单的概述, 应该能够给大家一个初步认识。本篇将对cluster的代码组成进行详细分析,力求能够对cluster做一个更清晰的描述。cluster作为多个节点的协同工作机制,它需要节点,节点间通信,各个节点的状态及各个节点上的数据(index)状态。因此这一部分代码包括了上述的几个部分。
节点discoverynode
首先是节点(discoverynode),这里的节点不同于之前所说的node,只是集群上一个逻辑意义上的节点,只是一个实际节点的描述信息。它实现了streamable接口和 serializable接口,可以在物理节点上传输。下图是它的field:
可以看到它只是一个节点的信息描述。在集群中每个节点会被抽象成一个discoverynode,这些discoverynode被封装到discoverynodes中,同时提供一下操作如查找,连接等。这样集群维护所有节点的信息,同时可以根据集群状态进行节点的操作。
集群阻塞
集群还需要有一个机制就是集群阻塞,因为处于不同状态的集群能够进行的操作不同,如没有master节点的时候,所有的master操作都要停止,当前的任务是选举master,此时一个block就会引发,通知集群所有节点。不同于同一个jvm中的同步,不同的节点处在不同的jvm中,jvm的同步机制无法使用,因此只能使用这种阻塞机制进行节点间的协调。它的部分代码如下所示:
public class clusterblock implements serializable, streamable, toxcontent { private int id; private string description; private enumset
阻塞主要由三部分组成,描述(description),阻塞级别(read(0),write(1), metadata(2)),及restful状态码reststatus构成。阻塞级别主要用于节点间对于index的操作的阻塞,如某个index在进行恢复过程时,它的状态是matedata级别,此时不能够对其进行任何读写操作。 reststatus主要用于restful请求的阻塞。最后要说的就是ack机制,集群的很多操作都需要节点响应。因此cluster定义了ack的请求和响应接口。所有需要ack的请求通过实现此ack接口都能够实现。另外集群还涉及matedata和routing,这两部分其实都是针对数据(index),如matedata主要是mapping,index, alias的相关元数据,因此这两部分会在分析数据功能时在做分析。
clusterservice接口
说完了discoverynode和block,接下来通过clusterservice接口,它的作用主要是提供对外调用。http://www.cppcns.com这个接口主要提供listener,block的add和remove及cluster状态的更新提交。cluster只是一个理论上的实体,其实并不存在,所有功能都是由各个节点来完成的。因此clusterservice接口主要方法是集群状态监听器的操作。它的类图:
这里着重说一下submitstateupdatetask的实现。对于节点来说,如果它探测到集群hbmnifn状态的更新,如果它是master则它需要向其它节点发布。代码如下:
public void submitstateupdatetask(final string source, priority priority, final clusterstateupdatetask updatetask) { if (!lifecycle.started()) { return; } try { //封装成updatetask final updatetask task = new updatetask(source, priority, updatetask); //会超时的任务 if (updatetask instanceof timeoutclusterstateupdatetask) { final timeoutclusterstateupdatetask timeoutupdatetask = (timeoutclusterstateupdatetask) updatetask; updatetasksexecutor.execute(task, threadpool.scheduler(), timeoutupdatetask.timeout(), new runnable() { @override public void run() { threadpool.generic().execute(new runnable() { @override public void run() { timeoutupdatetask.onfailure(task.source(), new processclustereventtimeoutexception(timeoutupdatetask.timeout(), task.source())); } }); } }); } else { updatetasksexecutor.execute(task); } } catch (esrejectedexecutionexception e) { // ignore cases where we are shutting down..., there is really nothing interestwww.cppcns.coming // to be done here... if (!lifecycle.stoppedorclosed()) { throw e; } } }
上面的代码逻辑很简单,对于提交的task进行封装然后运行。这里运行的是clusterstateupdatetask,它的实现很多,无法一一说明。但是它的方法说明了一切,它的类图如下所示:
子类的主要逻辑实现都在execute方法中,比如zendiscovery中handlemastergone中的实现,master丢失后会进行master选举或者是试图加入新组成的集群。这些在后面的分析中可以看到。
总结
cluster是由很多功能组成的,如discoverynode,block等。这一部分的主要代码是提供一些集群状态更新及监听的接口。集群状态的更新发布master独有的功能,但是监听集群状态变得时每个节点都需要的。
这些功能的具体实现在后面的分析中会逐步分析,希望大家以后多多支持我们!