天天看点

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

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

相关类:

IndicesClusterStateService

IndexService

IndexShard

InternalEngine

StoreRecoveryService

ConcurrentMergeScheduler

TieredMergePolicy

IndexWriter

MergePolicyConfig

MergeSchedulerConfig

EngineConfig

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

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

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

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

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

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

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

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

创建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进行处理

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

创建完shard后调用下图方法

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

继续跟踪代码会进入到一下代码片段,通过generic的threadPool去recover shard

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

一个shard是一个lucene实例,调用createNewEngine..newEngine方法来创建一个新实例

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

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

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

以上就是elasticsearch是怎么把自己的mergeScheduler交给lucene的。

今天到此,后续继续更新

继续阅读