您当前的位置: 首页 > 

顧棟

暂无认证

  • 0浏览

    0关注

    227博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【ES源码分析】强制合并分段(_forcemerge API)源码分析

顧棟 发布时间:2022-02-17 16:33:02 ,浏览量:0

_forcemerge API 源码分析

文章目录
  • _forcemerge API 源码分析
    • 合并方式
      • 只合并删除文档
      • 没有限制最大segment数的合并
      • 限制了最大segment数的合并
    • 合并策略
      • 合并策略的动态设置
        • ES对于Lucene的策略封装
    • 合并调度
      • 调度相关动态配置
    • 使用场景
    • 使用说明

源码基于6.7.2

合并方式

RestForceMergeAction中提供了对api的处理入口。在做了简单的参数处理之后,将请求转发给TransportForceMergeAction进行进一步的处理,里面有一个分片级的方法shardOperation。通过indicesService找到对应的shard,再执行InternalEngine.forceMerge

    public void forceMerge(final boolean flush, int maxNumSegments, boolean onlyExpungeDeletes,
                           final boolean upgrade, final boolean upgradeOnlyAncientSegments) throws EngineException, IOException {
        assert indexWriter.getConfig().getMergePolicy() instanceof ElasticsearchMergePolicy : "MergePolicy is " +
            indexWriter.getConfig().getMergePolicy().getClass().getName();
        // 获取合并策略
        ElasticsearchMergePolicy mp = (ElasticsearchMergePolicy) indexWriter.getConfig().getMergePolicy();
        optimizeLock.lock();
        try {
            ensureOpen();
            if (upgrade) {
                logger.info("starting segment upgrade upgradeOnlyAncientSegments={}", upgradeOnlyAncientSegments);
                mp.setUpgradeInProgress(true, upgradeOnlyAncientSegments);
            }
            store.incRef(); // increment the ref just to ensure nobody closes the store while we optimize
            try {
                // 将合并分为,1.只合并删除文档 2.没有配置最大segment数的合并 3.配置了最大segment数的合并
                if (onlyExpungeDeletes) {
                    assert upgrade == false;
                    indexWriter.forceMergeDeletes(true /* blocks and waits for merges*/);
                } else if (maxNumSegments             
关注
打赏
1663402667
查看更多评论
0.0515s