本文继续分析启动流程
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的详细使用还需要另外查下资料
喜欢源码的朋友搜索:红色的梯子 ,一起进步