ES源码二:集群启动过程

命令行参数解析

Elasticsearch:
image.png
在main里面创建了Elasticsearch实例,然后调用了main方法,这个main方法最终会调用到父类Command的main方法
image.png

这里做了几件事:

  1. 注册一个 ShutdownHook,其作用就是在系统关闭的时候捕获IOException并且进行输出

image.png

  1. 解析命令行参数

image.png

  1. 加载多个路径:data、home、logs,这里会调用到子类EnvironmentAwareCommand的execute方法,将配置解析成hashmap,并且确认 es.path.data、es.path.home、es.path.logs 这几个路径设置的存在,最后调用createEnv方法加载elasticsearch.yml配置文件,在调用Elasticsearch.execute方法

image.png

  1. 加载elasticsearch.yml配置文件

createEnv 函数最终调用了 InternalSettingsPreparer.prepareEnvironment 来加载 elasticsearch.yml 配置文件,并且创建了 command 运行的环境:Environment 对象

  1. 验证配置

image.png

总结一下第一阶段:解析命令行参数并且验证配置

资源检查和本地资源初始化

阶段二主要是在Bootstrap类中进行的,我们进入到Bootstrap.init方法中看
image.png
这个方法特别长,主要做了这样几件事:

  1. 创建BootStrap对象

image.png

  1. 加载elasticsearch.keystore 安全配置:在ES运行后,在config目录会生成一个elasticsearch.keystore文件,这个文件是用来保存一些敏感配置的。因为ES大多数配置都是明文保存的,但是像X-Pack中的security配置需要进行加密保存,所以这些配置信息就是保存到elasticsearch.keystore中。image.pngimage.png
  2. 创建一个新的Environment:根据保存初始化配置的initialEnv和安全配置keystore调用createEnvironment(最终调用prepareEnvironment方法)重新创建一个运行ES必须的环境

image.png

  1. 设置节点名称:这里设置节点的名字,可以在后续的日志输出中使用,否则只要只要ID可用就会使用节点ID(节点ID可读性不好)

image.png

  1. 加载log4j2配置:会加载log4j2.properties文件中的相关配置,然后配置log4j的属性。

image.png

  1. 创建pid文件

image.png

  1. 检查Lucene jar:通过版本号来检查lucene是否被替换掉了,如果被替换无法被启动

image.png

  1. 为创建Node对象实例做准备工作:通过调用INSTANCE.setup(true, environment)为创建Node实例对象做一些准备工作,下面几步我们进入到INSTANCE.setup(true, environment)

image.png
image.png

  1. 为给定模块生成控制器守护程序:尝试为每个模块(modules目录下的模块)生成native控制器守护进程的。

image.png

  1. 初始化本地资源:

image.png
image.png
本地资源初始化主要包括:

  • 不能以root运行
  • 尝试启动系统调用过滤器
  • 尝试调用mlockall,mlockall会将进程使用的部分或者全部的地址空间都锁定在物理内存中,防止其被交换到swap空间
  • 如果是运行在window的话,关闭事件的监听器
  • 尝试设置最大线程数、最大虚拟内存、最大文件size
  • 为lucene设置一个随机的seed

除了调用initializeNatives方法进行本地资源初始化,还调用initializeProbes() 进行初始化探针操作,主要用于操作系统负载监控、jvm 信息获取、进程相关信息获取。
image.png

  1. 注册关闭资源的 ShutdownHook

image.png

  1. 通过调用 JarHell.checkJarHell 检查是否有重复的类。

image.png

  1. 在Debug 模式下以 ifconfig 格式输出网络信息

image.png

  1. 加载安全管理器,进行权限认证:通过调用Security.configure 函数进行安全管理器加载,进行权限认证操作:

image.png

  1. 创建Node实例对象:根据加载的运行环境创建Node实例,也快要进入第三个阶段了

image.png

  1. 启动Node节点:回到了之前set up的地方,然后调用start方法,进行node节点的启动

image.png

节点实例启动

节点创建

之前只是简单的看了一下Node的创建,再回顾一下:
image.png
后续在构造方法里面一共做了这样几件事:

  1. 设置节点的生命周期:将生命周期设置为INITIALIZED,此时节点正处于初始化状态

image.png
image.png

  1. 各种信息的打印:

image.png

  1. 创建插件服务:主要是加载modules目录中的模块和加载plugins目录中已经安装的插件

image.png

  1. 设置格外的节点角色:

image.png

  1. 创建NodeEnvironment:NodeEnvironment实例话的过程中会生成Node ID,最后此处打印节点相关的信息,需要注意的是,此处会通过 Environment.assertEquivalent 函数来保证启动过程中配置没有被更改

image.png

  1. 创建线程池:

image.png
ES线程池的实现封装在ThreadPool中。ThreadPool中定义了4种线程池类型:
image.png

  • direct:执行器不支持关闭的线程
  • fixed:拥有固定线程的线程池,当一个任务无法分配一条线程时会被排队
  • fixed_auto_queue_size:和fixed类似,但是任务队列会根据 Little’s Law 自动调整。8.0 后将被移除。
  • scaling, 线程池中线程的数量可变,线程的数量在 core 和 max 间变化,使用 keep_alive 参数可以控制线程在线程池中的空闲时间。

ThreadPool中创建了多个线程池,主要有以下几种:
image.png

  1. 创建NodeClient实例:NodeClient执行本地的action的。

image.png

action的类型定义在ActionType:
image.png

  1. 创建各个模块和服务:各个模块和服务的创建

image.png

  1. **绑定对应的对象到Guice:将实例化的对象绑定要ModulesBuilder中,最后调用 modules.createInjector 创建 injector(注入器)。ES 用到了 **Guice这个谷歌提供的轻量级 IOC 库,bind 和 createInjector 是其提供的基本功能。

image.png
image.png
image.png

  1. 初始化HTTP Handler

image.png

后续就是节点启动的流程了

节点启动

Node.start主要负责启动各个生命周期组件(LifecycleComponent)和从Guice(也就是injector)中获取需要启动的服务类实例,然后调用它们的start方法
image.png
并且后面是一堆server要启动:
image.png

总结一下:

  1. 启动各个生命周期组件和服务,一些重点的服务如下:
服务简介
IndicesService负责索引管理,如创建、删除等操作。
IndicesClusterStateService负责根据各种集群索引状态信息进行相应的操作,如创建或者恢复索引(这些实际的操作会交给具体的模块实现)等。
SnapshotsService负责创建快照,在执行快照创建和删除的时候,所有的执行步骤都在主节点上=进行。
SnapshotShardsService此服务在 data node 上运行,并且控制此节点上运行中的分片快照。其负责开启和停止分片级别的快照。
RepositoriesService负责维护节点快照存储仓库和提供对存储仓库的访问。
SearchService提供搜索支持的服务。
ClusterService集群管理服务,负责管理集群状态、处理集群任务、发布集群状态等。
FsHealthService文件系统健康检查服务。通过创建一个临时文件来检查文件系统是否可写。
MonitorService负责提供操作系统、进程、JVM、文件系统级别的监控服务
NodeConnectionsService该组件负责维护从该节点到集群状态中列出的所有节点的连接,并在节点从集群状态中删除后断开与节点的连接。并且会定期检查所有链接是否在打开状态,并且在需要的时候恢复它们。需要注意的是此组件不负责移除节点!
GatewayService网关服务,负责集群元数据的持久化和恢复。
Discovery节点发现模块是一个可插拔的模块,其负责发现集群中其他的节点,发布集群状态到所有节点,选举主节点和发布集群状态变更事件。
PeerRecoverySourceService负责处理对等分片的恢复请求,并且开启从这个源分片到目标分片的恢复流程。
TransportService负责节点间数据同步。
HttpServerTransport提供 REST 接口服务。
  1. 调用ClusterService.setNodeConnectionService将NodeConnectionService绑定到ClusterService中去
  2. 调用acceptIncomingRequests 尝试接收请求。
  3. 调用discovery.startInitialJoin 开始进行加入集群的循环
  4. 开启线程去检查是否已经加入集群
  5. HttpServerTransport,并且绑定监听地址,接收 REST 请求

4.集群启动流程

  1. Master 选举

根据前面的内容可知,Master 对集群的重要性,所以集群中多个节点启动后首要的任务是选举出一个 Master,有了 Master 后续的集群启动操作将由 Master 主导。

  1. 选择集群元数据

在 Master 被选举出来后,其首要任务就是要选择出集群的元数据信息,这部分的工作主要在 Gateway 模块中处理。Master 会向已经加入到集群的所有节点获取各种的元数据信息,然后选择出版本号最新的那个作为集群的元数据,并向所有节点进行广播。

  1. Allocation

在 allocation 过程中将会选择 shard 级别的元数据信息,并且构建内容路由表。在集群启动的时候,所有的 shard 都是未分配的,allocation 会决定哪个 shard 被分配到哪个节点,并且把这个关系记录下来写入到内容路由表。
我们知道 ES 的分片分为主分片和副分片,所以在分配的时候会先选择出主分片,然后再选择出副分配。

  1. 索引恢复(recovery )

为了保证数据的可靠性,在启动的时候主分片需要执行 recovery 流程来恢复没有来得及刷盘的数据。而副分片除了要恢复没有刷盘的数据外,还要恢复主分片已经写入但是副分片还没有写入的数据来保证数据的一致性。
集群的启动主要就是上述的几大流程,经过这些流程后,一般来说集群就可以提供对外的服务了。

5.总结

通过 Elasticsearch 这个类,系统进行了命令行参数解析与配置加载。通过 Bootstrap 类进行了资源检查与本地资源初始化。最后实例化了 Node 类,其负责加载各个模块和插件、创建线程池、创建 keepalive 线程等工作,在 Node.start 方法中获取了各个服务的实例并且调用它们的 start 方法。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件,贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …

C++11(下篇)

文章目录 C111. 模版的可变参数1.1 模版参数包的使用 2. lambda表达式2.1 Lambda表达式语法捕获列表说明 2.2 lambda的底层 3. 包装器3.1 function包装器3.2 bind 4. 线程库4.1 thread类4.2 mutex类4.3 atomic类4.4 condition_variable类 C11 1. 模版的可变参数 C11支持模版的…

当全连接队列满了,tcp客户端收到服务端RST信令的模拟

当tcp服务端全连接队列满了后,并且服务端也不accept取出连接,客户端再次连接时,服务端能够看到SYN_RECV状态。但是客户端看到的是ESTABLISHED状态,所以客户端自认为成功建立了连接,故其写往服务端写数据,发…

鸿蒙入门02-首次安装和配置

注:还没有安装编辑器( deveco studio )的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器( deveco studio )安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会(CAIIAC)是中国人工智能技术发展和应用的重要展示平台,不仅关注创新,还涵盖了市场和监管方面的内容,对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…

026——项目管理与由来

目录 作者有话说 项目的管理方式 develop分支管理 作者有话说 已经出了25期的文章了,一直没说过我在做个什么。相信大家也有这个以后,作者写了几M的代码到现在不会只是为了点个灯吧。要是这我几十行代码就能解决。 这是一个小故事,老粉丝都…

FILE类与IO流

目录 File类的实例化与常用方法 File类的理解 文件路径的表示方式: API的使用 IO流概述与流的分类 I/O流中的是Input/Output的缩写 IO流的分类(不同角度) Java程序中的IO流涉及40多个,但实际上都是由4个抽象类衍生出来的。 F…

SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息

文章目录 SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息1、在pom.xml中导入xxl-job的maven依赖,可以看我这篇文章使用抽离出来的xxl-job的starter2、配置xxl-job的相关配置,若上一步使用了自己创建的starter则…

Python基于深度学习的车辆特征分析系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

高标准化及可扩展的产品能力,助力声通科技运营效率不断提升

高标准化及可扩展的产品能力对企业发展具有重要意义,有助于企业提高运营效率、增强市场竞争力,并推动企业实现规模化发展。上海声通信息科技股份有限公司(下文称:声通科技或公司)作为我国领先的企业级全栈交互式人工智…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet:用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络(CNNs),尤其是UNet,是生物医学分割的默认架构…

Java报表是什么?盘点2023最实用的四款Java报表

从字面义就可以推知,Java报表指的是在Java环境下开发或使用的报表工具。Java语言因其功能强大和简单易用的特点,是静态面向对象编程语言的代表,在Java环境开发使用的这些报表工具,可以通过提供可视化操作界面制作报表,…

如果补货机器人也开始搬砖

过去几年,如果一位顾客的欲购商品疑似缺货,“请稍等,我去后台查一下”便是最常听到的一句话。随着过去几年劳动力短缺的加剧,货架并不总像许多人习惯的那样满满当当。为减轻不断补货的负担,使员工可以将精力集中于其他…

LINUX网卡一般性问题分析

一、网卡相关概念 网卡:网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。 网络模型:OSI网络模型、TCP/IP网络模型 LINUX网络收发流程: 1. 内核分配一个主内存地址段(DMA缓冲区),网卡设备可以在…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目,…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分:html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web &am…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域,多模态大型语言模型(MLLM)的研究一直是一个热门话题。近期,一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架,实现了多种不同模态与自然语言的高效对齐,为多模态…

操作系统—GCC与编译全流程

文章目录 GCC与编译全流程1.GCC是什么?2.编译全流程(1).GCC到底做了哪些事情?(2).预处理I.预处理会做什么II.预处理器主要包含什么?III.宏的一些魔法 (3).编译I.基本流程II.编译优化III.一点例子 (4).汇编(5).链接(6).说到这里,为…

解剖this指针

目录 this指针的理解 1. this指针的用处 2.this指针的使用 3.this指针的使用 this指针来源 this指针的理解 通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样…

windows网络驱动开发

基石:WFP 1、简介 Windows过滤平台(Windows Filtering Platform, WFP),是从Vista系统后新增的一套系统API和服务。开发者可以在WFP框架已划分的不同分层中进行过滤、重定向、修改网络数据包,以实现防火墙、入侵检测系…