[源码解析] elastic search 8.0.0 的启动过程(四)

本文继续分析启动流程

1、ShardLimitValidator

集群中每个node上分片的数量最大默认是1000

2、MetadataCreateIndexService

主要负责处理创建索引

3、ActionModule

里面有一个入参IndexScopedSettings

表示索引层面一些内置的参数值,共计120个,里面有很多参数是经常接触的。

我们选几个典型的。比如

index.search.slowlog.threshold.fetch.trace -> {Setting@12155} "{
  "key" : "index.search.slowlog.threshold.fetch.trace",
  "properties" : [
    "Dynamic",
    "IndexScope"
  ],
  "is_group_setting" : false,
  "default" : "-1"
}"
index.number_of_shards -> {Setting@12205} "{
  "key" : "index.number_of_shards",
  "properties" : [
    "Final",
    "IndexScope"
  ],
  "is_group_setting" : false,
  "default" : "1"
}"

默认分片是1

系统内置的Action会放到ActionRegistry中,Action就是将es各种操作封装成了该对象。

public abstract class TransportAction<Request extends ActionRequest, Response extends ActionResponse> 

顶级抽象类的声明,它的2个泛型,有请求有返回,就是我们作为es的调用方经常使用的各个api的抽象。比如

public class TransportCreateIndexAction extends TransportMasterNodeAction<CreateIndexRequest, CreateIndexResponse> 
public abstract class HandledTransportAction<Request extends ActionRequest, Response extends ActionResponse>
        extends TransportAction<Request, Response> 
public class TransportBulkAction extends HandledTransportAction<BulkRequest, BulkResponse>
public class TransportSearchAction extends HandledTransportAction<SearchRequest, SearchResponse> 

除了上面的内容之外,还会有在集群的配置里添加2项配置,其中一个是默认自动创建索引为true。不能想象什么情况不让创建呢?

mapping请求的校验,别名请求的校验。这2项都是从plugin中获取。

还会创建RestController对象,该对象的核心目的Dispatches HTTP requests,找到合适的handler进行处理。那如何找呢,主要是根据request中的uri params method .最后找到RestHandler。此类是一个接口,里面的核心方法

@Override
    public final void handleRequest(RestRequest request, RestChannel channel, NodeClient client) throws Exception {
        // execute the action
        action.accept(channel);
}

4、NetworkModule

对加载到的NetworkPlugin进行解析。相关的共4个

最终获取到的

final Transport transport = networkModule.getTransportSupplier().get();

最终transport的实例化对象类型如下

transport是干什么的呢?

它是用于处理集群内部节点之间的连接的。比如查询请求,request从一个node到另外一个node就是通过transport来完成。而且是通过异步的方式完成的,不会造成线程的阻塞。它的传输是基于tcp进行的,

5、UpgradeService

MetadataIndexUpgradeService 主要负责将遗留下的索引的元数据升级到当前集群最新的版本。比较典型的使用场景是集群升级的时候,或者dangling索引被导入到集群的时候

TemplateUpgradeService 描述的是模板相关的,我个人模板用的比较少。不过据说有的公司有专门的es维护团队,经常操作的api里是有很多template相关的。该service描述的是当一个node要加入集群时安装plugin安装到一半的时候会升级template

6、RepositoriesModule+SnapshotsService

创建该RepositoriesModule模块,是为了快照和restore做准备。快照snapshot是增量存储的,你可以存储的是一个索引的不同的快照,也可以是一个集群的不同的快照。存储在哪里呢?可以存储在本地或者云盘上可以存储的地方都可以。类型如图所示

创建SnapshotsService的时候会向transportservice注册一个快照state变更的handler

还创建了一个分片级别的快照服务,它负责管理开始和停止在分片上的快照操作

接着创建恢复服务RestoreService,是主要处理快照的恢复

7、DiscoveryModule

该模块指的是node之间会相互寻找,最终形成一个集群。主要场景是当es启动或者新的master节点刚选举完成后。discover的过程分2步,第一步,首先要在setting里提供seed host list.然后每一个node会尝试与list中的机器相连接,会看下是不是node或者是不是有潜力成为master的node。第二步,第一步如果成功了,node会和连接成功的节点分享它已获取到的master的竞选者node信息。被成功连接的节点也会按次返回自己的伙伴们的地址。然后node就会尝试与这些新返回的地址相连接

8、NodeClient初始化

在当前的node执行各种操作的客户端

最后再初始化HTTP handler 

es默认几乎所有的action都有通过HTTP进行处理的方式,这张截图只是局部

public void initRestHandlers(Supplier<DiscoveryNodes> nodesInCluster) {
        List<AbstractCatAction> catActions = new ArrayList<>();
        Consumer<RestHandler> registerHandler = handler -> {
            if (handler instanceof AbstractCatAction) {
                catActions.add((AbstractCatAction) handler);
            }
            restController.registerHandler(handler);
        };
        registerHandler.accept(new RestAddVotingConfigExclusionAction());
        registerHandler.accept(new RestClearVotingConfigExclusionsAction());
        registerHandler.accept(new RestMainAction());
        registerHandler.accept(new RestNodesInfoAction(settingsFilter));
        registerHandler.accept(new RestRemoteClusterInfoAction());
        registerHandler.accept(new RestNodesStatsAction());
        registerHandler.accept(new RestNodesUsageAction());
        registerHandler.accept(new RestNodesHotThreadsAction());
        registerHandler.accept(new RestClusterAllocationExplainAction());
        registerHandler.accept(new RestClusterStatsAction());
        registerHandler.accept(new RestClusterStateAction(settingsFilter));
        registerHandler.accept(new RestClusterHealthAction());
        registerHandler.accept(new RestClusterUpdateSettingsAction());
        registerHandler.accept(new RestClusterGetSettingsAction(settings, clusterSettings, settingsFilter));
        registerHandler.accept(new RestClusterRerouteAction(settingsFilter));
        registerHandler.accept(new RestClusterSearchShardsAction());
        registerHandler.accept(new RestPendingClusterTasksAction());
        registerHandler.accept(new RestPutRepositoryAction());
        registerHandler.accept(new RestGetRepositoriesAction(settingsFilter));
        registerHandler.accept(new RestDeleteRepositoryAction());
        registerHandler.accept(new RestVerifyRepositoryAction());
}

终于node实例起来啦!!!!!

9、小结

在创建node过程中看到了很多依赖注入相关的对象比如以Module结尾,bind方法等,没错,es正是使用Guice 依赖注入框架完成各个对象之间的依赖关系。

关于Guice的详细使用还需要另外查下资料

喜欢源码的朋友搜索:红色的梯子 ,一起进步

猜你喜欢

转载自blog.csdn.net/weixin_39394909/article/details/108438968