温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

elasticsearch集群cluster怎么用

发布时间:2022-04-21 17:10:26 来源:亿速云 阅读:232 作者:zzz 栏目:开发技术

这篇文章主要介绍“elasticsearch集群cluster怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elasticsearch集群cluster怎么用”文章能帮助大家解决问题。

节点DiscoveryNode

首先是节点(DiscoveryNode),这里的节点不同于之前所说的node,只是集群上一个逻辑意义上的节点,只是一个实际节点的描述信息。它实现了Streamable接口和  serializable接口,可以在物理节点上传输。下图是它的field:

elasticsearch集群cluster怎么用

可以看到它只是一个节点的信息描述。在集群中每个节点会被抽象成一个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<ClusterBlockLevel> levels;     private boolean retryable;     private boolean disableStatePersistence = false;     private RestStatus status;     ClusterBlock() {     }     public ClusterBlock(int id, String description, boolean retryable, boolean disableStatePersistence, RestStatus status, EnumSet<ClusterBlockLevel> levels) {         this.id = id;         this.description = description;         this.retryable = retryable;         this.disableStatePersistence = disableStatePersistence;         this.status = status;         this.levels = levels;     } }

阻塞主要由三部分组成,描述(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接口,它的作用主要是提供对外调用。这个接口主要提供Listener,block的add和remove及cluster状态的更新提交。cluster只是一个理论上的实体,其实并不存在,所有功能都是由各个节点来完成的。因此clusterService接口主要方法是集群状态监听器的操作。它的类图:

elasticsearch集群cluster怎么用

这里着重说一下submitStateUpdateTask的实现。对于节点来说,如果它探测到集群状态的更新,如果它是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, 它的实现很多,无法一一说明。但是它的方法说明了一切,它的类图如下所示:

elasticsearch集群cluster怎么用

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

关于“elasticsearch集群cluster怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI