当前位置:首页 > ElasticSearch 分析
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
从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
在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()对于提交过来的请求… 好像是启动了一个线程。
共分享92篇相关文档