ElasticSearch 分析

2026/1/19 11:51:02

ElasticSearch运行流程

一、启动

1.bin/elasticsearch

elasticsearch文件最后调用了源码中org.elasticsearch.bootstrap.ElasticSearch服务。org.elasticsearch.bootstrap.ElasticSearch直接调用Bootstrap.main(args)。

2.环境设置(initialSetting)

Boostrap首先做环境设置(initialSetting),这些设置包括:config目录、data目录、

dataWithCluster目录、home目录、logs目录、plugins目录、work目录、workWithCluater目录;cluster.name。

3.执行初始化

环境设置之后是执行初始化,初始化包括setup和start两个操作。

Setup:建立一个Node;为Node设置环境;为Node设置plugins; 加载Guice模型文件;为Node生成一个client;同时加载一个钩子以便节点退出时执行close()方法。

Start:启动各个服务,这些服务包括:IndicesService、

IndicesClusterStateService、RiversManager、ClusterService、RoutingService、SearchService、MonitorService、RestController、TransportService、DiscoveryService、GatewayService、HttpServer、JmxService。

二、服务 1.IndicesService

AbstractLifecycleComponent+start()+stop()+close()+doStart()+doStop()+doClose()+lifecycleState()+addLifecycleListener()+removeLifecycleListener()AbstractComponent+nodeName()+AbstractComponent()InternalIndicesService+add()+doStart()+doStop()+doClose()+remove()+state()+changesAllowed()+UnmodifiableIterator()+hasIndex()+indices()+indexService()+indexServiceSafe()+createIndex()+cleanIndex()+deleteIndex()+CacheReaderPurgeListener()<>IndicesService+state()+hasIndex()+indicesLifecycle()+indices()+indexService()+indexServiceSafe()+createIndex()+deleteIndex()+cleanIndex()

从Bootstrap中的Start()可以看到 IndicesService的启动是从调用start()开始的。在模型文件中可以发现IndicesService的启动实例为InternalIndicesService。此类继承自AbstractLifecycleComponent。

InternalIndicesService并没有start()方法,而是从其父类

AbstractLifecycleComponent继承而来。执行start()方法时先判断能否启动,如果可以则启动监听器,再调用doStart()方法,doStart()方法可在InternalIndicesService中进行实现。

2.IndicesClusterStateService

IndicesClusterStateService与IndicesService服务启动过程类似,只不过执行doStar()方法的实现类是IndicesClusterStateService。

protected void doStart() throws ElasticSearchException { clusterService.add(this);

}

从doStart()方法来看,似乎是要将这个实例加进ClusterService的监听器列表。

AbstractLifecycleComponent+start()+stop()+close()+doStart()+doStop()+doClose()+lifecycleState()+addLifecycleListener()+removeLifecycleListener()AbstractComponent+nodeName()+AbstractComponent()IndicesClusterStateService+doStart()+doStop()+doClose()+clusterChanged()+applyNewIndices()+applyMappings()+applyNewOrUpdatedShards()+applyDeletedIndices()+applyDeletedShards()+applyCleanedIndices()+applySettings()<>ClusterStateListener+clusterChanged()

在ClusterStateListener接口中定义了clusterChanged()方法,当簇状态发生改变时,这个方法就会被调用(调用者是谁?)。当clusterChanged(clusterChangedEvent)被调用时,ClusterStateListener中其它索引的方法会被依次执行。根据传过来的事件对索引进行修改。

3.RiversManager

和前面一样RiversManager 的实现类是RiversManager,此类也是继承自

AbstractLifecycleComponent。没有实现任何接口。

除了构造方法外,也只有doStart()、doStop()、doClose()三个方法。分别如下。 protected void doStart() throws ElasticSearchException { riversRouter.start(); riversService.start(); clusterService.start(); }

protected void doStop() throws ElasticSearchException { riversRouter.stop(); clusterService.stop(); riversService.stop(); }

protected void doClose() throws ElasticSearchException { riversRouter.close(); clusterService.close(); riversService.close();

}

3.1 RiversRouter

RiversRouter和前面其它服务一样继承自AbstractLifecycleComponent类,实现了ClusterStateListener接口。

doStart()、doStop()、doClose()三个方法都未做实现,而是实现了clusterChanged()方法,在这个方法中先判断自己是不是master节点,如果不是则不理,否则向RiverClusterService提交一个远端节点状态发生改变的更新任务。

在传向RiverClusterService传了一份路由。

3.1.1 RiverClusterService

RiverClusterService继承自AbstractLifecycleComponent类,没有实现任何接口。

这个类在doStart()中会用newSingleThreadExecutor(daemonThreadFactory(settings, \来创建一个后台线程。同时提供了add()和remove方法用来增加和删除监听器。

submitStateUpdateTask()对于提交过来的请求… 好像是启动了一个线程。


ElasticSearch 分析.doc 将本文的Word文档下载到电脑
搜索更多关于: ElasticSearch 分析 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219