elasticsearch shard创建过程,查看merge参数传入

来源:互联网 发布:京东关键词排名优化 编辑:程序博客网 时间:2024/06/04 18:35

今天来翻翻源码,看下merge相关的代码,以及ES是如何处理参数。该文章纯属个人记录,仅供自己参考

相关类:
IndicesClusterStateService
IndexService
IndexShard
InternalEngine
StoreRecoveryService
ConcurrentMergeScheduler
TieredMergePolicy
IndexWriter
MergePolicyConfig
MergeSchedulerConfig
EngineConfig

在创建index时每个节点会收到一个clusterChanged事件响应,响应里面包括了很多事件处理
这里写图片描述

这里写图片描述

其他apply方法暂时不关注,我们看下applyNewOrUpdatedShards这个方法,shard的create和update都会调用这个方法进行处理。
这里写图片描述

applyNewOrUpdatedShards方法中会对shard进行template的应用等,然后在上图的代码中判断shard的状态是否是INITIALIZING,如果是则初始化shard,在applyInitializingShard方法中会对index进行判断是否已经存在shard以及判断是否是副本和是否是从别的节点迁移过来的shard。
这里写图片描述

indexService.hasShard判断不存在时则调用createShard方法,传入shardRouting参数,该参数用于封装shard路由信息。
这里写图片描述

创建shard是通过配置好需要的modules,然后通过modules.createChildInjector方法进行注入shardInjector.getInstance(IndexShard.class) 得到Shard实例接着更新shard的routing信息
注意:在注入IndexShard实例时:
1. 在构造方法中初始化MergePolicyConfig策略配置对象,在MergePolicyConfig构造方法中会将参数设置到TieredMergePolicy对象
2. 在构造方法中调用了newEngineConfig方法,在此方法中new EngineConfig对象时将mergePolicy对象传入,也就是MergePolicy实现类

至此elasticsearch的merge参数就这么交给了lucene进行处理
这里写图片描述

创建完shard后调用下图方法
这里写图片描述

继续跟踪代码会进入到一下代码片段,通过generic的threadPool去recover shard
这里写图片描述

一个shard是一个lucene实例,调用createNewEngine..newEngine方法来创建一个新实例
这里写图片描述
创建lucene实例的代码如下,设置mergeScheduler,mergePolicy,以及iwc的相关配置参数,每一个shard都有自己的mergeScheduler,每个shard都是自个merge,这里使用的是es自己的EngineMergeScheduler,而非使用lucene默认的,这是为了ES记录merge的耗时,merge数量,正在merge,merge throttle时间等信息

这里写图片描述
以上就是elasticsearch是怎么把自己的mergeScheduler交给lucene的。

今天到此,后续继续更新

原创粉丝点击