elasticsearch集群cluster示例详解

作者:zziawan 时间:2023-12-11 16:49:27 

前言

上一篇通过clusterservice对cluster做了一个简单的概述, 应该能够给大家一个初步认识。本篇将对cluster的代码组成进行详细分析,力求能够对cluster做一个更清晰的描述。cluster作为多个节点的协同工作机制,它需要节点,节点间通信,各个节点的状态及各个节点上的数据(index)状态。因此这一部分代码包括了上述的几个部分。

节点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选举或者是试图加入新组成的集群。这些在后面的分析中可以看到。

来源:https://www.cnblogs.com/zziawanblog/p/6512661.html

标签:elasticsearch,cluster,集群
0
投稿

猜你喜欢

  • asp.net之生成验证码的方法集锦(一)

    2022-09-07 22:37:13
  • Android消息机制Handler用法总结

    2022-08-10 23:58:56
  • Java基础详解之内存泄漏

    2022-04-14 03:45:46
  • Java聊天室之实现客户端一对一聊天功能

    2022-12-28 09:23:30
  • Java实现简单无界面五子棋

    2022-07-10 12:06:02
  • JAVA求两直线交点和三角形内外心的方法

    2023-07-30 02:46:35
  • Java里的static import使用小结

    2023-08-18 18:36:36
  • 安卓逆向半次元app逆向分析源码

    2023-07-28 14:36:05
  • c# 基于任务的异步编程模式(TAP)的异常处理

    2023-08-03 15:44:06
  • Java多线程与线程池技术分享

    2021-07-25 07:35:11
  • SWT(JFace)体验之ApplicationWindow

    2023-01-02 09:59:43
  • 详解Vue响应式的部分实现

    2022-12-21 23:25:53
  • Intellij IDEA全局替换快捷键整理

    2022-06-17 14:51:39
  • Android中判断网络是否可用的代码分享

    2022-01-03 23:59:46
  • 必须了解的高阶JAVA枚举特性!

    2021-11-04 11:26:00
  • Spring Boot实现分布式锁的自动释放的示例代码

    2023-10-17 11:06:24
  • springboot使用之多个filter的执行顺序以及配置方式

    2023-11-09 09:30:59
  • Java有趣好玩的图形界面开发八个案例实现

    2022-12-20 06:20:35
  • 用JAVA 设计生成二维码详细教程

    2021-05-29 05:48:29
  • Android Volley框架使用源码分享

    2023-09-10 09:43:44
  • asp之家 软件编程 m.aspxhome.com