Elasticsearch集群,elastic 集群_1

  Elasticsearch集群,elastic 集群

  00-1010前言节点发现节点集群阻塞集群服务接口摘要

  00-1010上一篇文章通过clusterservice对集群做了一个简单的概述,应该能让你有一个初步的了解。本文将详细分析集群的代码组成,力求对集群有一个更清晰的描述。集群作为多个节点的协同工作机制,需要节点、节点间的通信、每个节点的状态以及每个节点上的数据(索引)状态。因此,这部分代码包含了上述部分。

  00-1010是第一个节点(发现节点)。这里的节点与上一个节点不同。它只是集群中的一个逻辑节点,只是一个实际节点的描述信息。它实现了可流接口和可序列化接口,可以在物理节点上传输。下图是它的领域:

  你可以看到它只是一个节点的信息描述。集群中的每个节点都会被抽象为一个DiscoveryNode,这些Discovery node会封装在发现节点中,并提供一些搜索、连接等操作。这样集群就维护了所有节点的信息,同时还可以根据集群的状态对节点进行操作。

  00-1010集群还需要一个机制,就是集群阻塞,因为不同状态的集群可以执行不同的操作。例如,当没有主节点时,所有主节点操作都必须停止,当前任务是选举主节点。此时,将触发一个块来通知集群的所有节点。不同于在同一个jvm中的同步,不同的节点在不同的JVM中,所以不能使用JVM的同步机制,只能使用这种阻塞机制来协调节点。它的部分代码如下:

  公共类ClusterBlock实现Serializable、Streamable、ToXContent { private int id私有字符串描述;私有EnumSetClusterBlockLevel级别;私有布尔可重试;private boolean disablestatepistence=false;私有RestStatus状态;cluster block(){ } public cluster block(int id,String description,boolean retryable,boolean disableStatePersistence,RestStatus status,EnumSetClusterBlockLevel levels){ this . id=id;this.description=描述;this . retry able=retry able;this . disablestatepistence=disablestatepistence;this.status=statusthis.levels=级别;}}阻塞主要由三部分组成,描述,阻塞级别(READ(0),WRITE(1),METADATA(2),restful状态码RestStatus。阻塞级主要用于阻塞节点间的索引操作。例如,当一个索引处于恢复过程中时,它的状态是MATEDATA级别,因此此时不能读取或写入它。RestStatus主要用于阻塞restful请求。最后提到了ack机制。集群的很多操作都需要节点响应。因此,集群定义了ack的请求和响应接口。所有需要ack的请求都可以通过实现这个ack接口来实现。此外,集群还涉及matedata和routing,这两者其实都是针对数据(索引)的。比如matedata主要是映射、索引、别名相关的元数据,所以这两部分在分析数据函数的时候会做分析。

  00-1010完成发现节点和块。接下来,通过clusterService接口,它的功能主要是提供外部调用。该接口主要提供监听器的更新提交、块的添加和删除以及集群状态。集群只是一个理论上的实体,但并不存在。所有功能由每个节点完成。因此,集群服务接口的主要方法是集群状态监听器的操作。它的类图:

  让我们在这里关注submitSta

  teUpdateTask的实现。对于节点来说,如果它探测到集群状态的更新,如果它是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 interesting // to be done here... if (!lifecycle.stoppedOrClosed()) { throw e; } } }

上面的代码逻辑很简单,对于提交的task进行封装然后运行。这里运行的是ClusterStateUpdateTask,它的实现很多,无法一一说明。但是它的方法说明了一切,它的类图如下所示:

 

  

 

  子类的主要逻辑实现都在execute方法中,比如ZenDiscovery中handleMasterGone中的实现,master丢失后会进行master选举或者是试图加入新组成的集群。这些在后面的分析中可以看到。

  

 

  

总结

cluster是由很多功能组成的,如DiscoveryNode,block等。这一部分的主要代码是提供一些集群状态更新及监听的接口。集群状态的更新发布master独有的功能,但是监听集群状态变得时每个节点都需要的。

 

  这些功能的具体实现在后面的分析中会逐步分析,希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: