首页 > 其他分享 >es 索引生命周期管理的原理

es 索引生命周期管理的原理

时间:2023-12-28 16:25:32浏览次数:27  
标签:生命周期 newState currentState 索引 rolloverIndexName final es metadata

es 的索引生命周期管理 index lifecycle management 即 ILM,控制着索引的创建、滚动、删除、归档,属实好用,那么它是如何实现的呢?

可以想象得到,es 的 master 执行一个定时任务,定期检查关联了 ilm 的索引,判断索引的状态,执行状态的流转。

ILM 相关代码在 x-pack 的 plugin 目录中,主类是 IndexLifecycleService,它实现了 SchedulerEngine.Listener 接口,其实现的 triggered 方法就是上面提到的定时任务。

// org.elasticsearch.xpack.ilm.IndexLifecycleService#triggered
    @Override
    public void triggered(SchedulerEngine.Event event) {
        if (event.getJobName().equals(XPackField.INDEX_LIFECYCLE)) {
            logger.trace("job triggered: " + event.getJobName() + ", " + event.getScheduledTime() + ", " + event.getTriggeredTime());
            triggerPolicies(clusterService.state(), false);
        }
    }

通过源码启动 elastic search,创建好 ilm,模板,索引,并写入数据。本文从索引 rollover 的场景调试代码。

为方便调试,可以设置 ilm rollover 的 max_doc 为 2,es 代码的执行流充满了异步操作,对代码有了一定的基础了解后,我们知道索引 rollover 的操作在 TransportRolloverAction 中:

真正执行 rollover 的逻辑如下,即创建新的索引,并绑定别名和新建索引,更新集群状态版本号

// org.elasticsearch.action.admin.indices.rollover.MetadataRolloverService#rolloverAlias
private RolloverResult rolloverAlias(
        ClusterState currentState,
        IndexAbstraction.Alias alias,
        String aliasName,
        String newIndexName,
        CreateIndexRequest createIndexRequest,
        List<Condition<?>> metConditions,
        boolean silent,
        boolean onlyValidate
    ) throws Exception {
        final NameResolution names = resolveAliasRolloverNames(currentState.metadata(), alias, newIndexName);
        final String sourceIndexName = names.sourceName;
        final String rolloverIndexName = names.rolloverName;
        final String unresolvedName = names.unresolvedName;
        final Metadata metadata = currentState.metadata();
        final IndexMetadata writeIndex = currentState.metadata().index(alias.getWriteIndex());
        final AliasMetadata aliasMetadata = writeIndex.getAliases().get(alias.getName());
        final boolean explicitWriteIndex = Boolean.TRUE.equals(aliasMetadata.writeIndex());
        final Boolean isHidden = IndexMetadata.INDEX_HIDDEN_SETTING.exists(createIndexRequest.settings())
            ? IndexMetadata.INDEX_HIDDEN_SETTING.get(createIndexRequest.settings())
            : null;
        MetadataCreateIndexService.validateIndexName(rolloverIndexName, currentState); // fails if the index already exists
        checkNoDuplicatedAliasInIndexTemplate(metadata, rolloverIndexName, aliasName, isHidden);
        if (onlyValidate) {
            return new RolloverResult(rolloverIndexName, sourceIndexName, currentState);
        }

        CreateIndexClusterStateUpdateRequest createIndexClusterStateRequest = prepareCreateIndexRequest(
            unresolvedName,
            rolloverIndexName,
            createIndexRequest
        );
        ClusterState newState = createIndexService.applyCreateIndexRequest(currentState, createIndexClusterStateRequest, silent);
        newState = indexAliasesService.applyAliasActions(
            newState,
            rolloverAliasToNewIndex(sourceIndexName, rolloverIndexName, explicitWriteIndex, aliasMetadata.isHidden(), aliasName)
        );

        RolloverInfo rolloverInfo = new RolloverInfo(aliasName, metConditions, threadPool.absoluteTimeInMillis());
        newState = ClusterState.builder(newState)
            .metadata(
                Metadata.builder(newState.metadata())
                    .put(IndexMetadata.builder(newState.metadata().index(sourceIndexName)).putRolloverInfo(rolloverInfo))
            )
            .build();

        return new RolloverResult(rolloverIndexName, sourceIndexName, newState);
    }

到此,可以认为 rollover 的请求得到了处理,那么往前推,这个 rollover 的请求是如何生成的呢,仍然是在 TransportRolloverAction 中打断点,通过下图的调用栈,可以看到与前面的定时任务关联上了。

 

标签:生命周期,newState,currentState,索引,rolloverIndexName,final,es,metadata
From: https://www.cnblogs.com/allenwas3/p/17932937.html

相关文章

  • codeforces刷题(1100):1902B_div2
    B、GettingPoints跳转原题点击此:该题地址1、题目大意  Monocarp为了完成总共n天的某学期的p学分任务。Monocarp每天可以选择两种度过方式:上一次课和完成最多两个任务或者休息一天。其中上课获得l学分,每个任务获得t学分,其中任务不可以重复接取,并且每周获得一个新的任务(第一......
  • centos7 yum安装Postgresql14和postgis
    1.安装postgresql#安装依赖包yuminstall-yglibc-develbisonflexreadline-develzlib-develpgdg-srpm-macroslz4-devellibicu-develllvm5.0-develllvm-toolset-7-clangkrb5-devele2fsprogs-devel\openldap-develpam-develperl-ExtUtils-Embedpython3-develt......
  • 高性能与成本效益兼备:Flomesh 服务网格 FSM 数据平面性能基准测试
    FlomeshServiceMesh(FSM)旨在提供服务网格功能、注重高性能和低资源消耗。这使得资源受限的边缘环境能够利用类似云的服务网格功能。在本次测试中,我们对FSM(v1.1.4)和Istio(v1.19.3)进行了基准测试。主要关注在使用两种不同网格时的服务延迟分布,以及数据平面的资源开销。FSM使用P......
  • 【类型转换】使用c#实现简易的类型转换(Emit,Expression,反射)
    引言哈喽。大家好,好久不见,最近遇到了一个场景,就是在FrameWork的asp.netmvc中,有个系统里面使用的是EntityFramework的框架,在这个框架里,提供了一个SqlQuery的方法,这个方法很好用啊,以至于在EFCORE8里面又添加了回来,不过不知道性能怎么样,我遇到的场景是通过SqlQuery查询的时......
  • 为什么要实践 A+ES & CQRS ?
    Wow:基于DDD&EventSourcing的现代响应式CQRS架构微服务开发框架中文文档领域驱动|事件驱动|测试驱动|声明式设计|响应式编程|命令查询职责分离|事件溯源简介Wow是一个基于领域驱动设计和事件溯源的现代响应式CQRS微服务开发框架,历经多年生产环境......
  • James F. Kurose, Keith W. Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出
    JamesF.Kurose,KeithW.Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出版社,2014 n计算机网络课程学习什么?nn计算机网络是计算机专业和信息安全专业的专业基础课程,课程主要介绍计算机网络的基本原理和技术,通过对网络协议模型多层次功能结构的展开与探讨,详细介绍......
  • VMware vCenter Server 7.0、vSphere Client 7.0 修改会话超时时间(session timeout pe
    vCenterServer7.0(仅有vCenterServerAppliance和H5vSphereClien)使用SSH登录vCenterServerAppliance执行shell命令修改如下配置文件:vi/etc/vmware/vsphere-ui/webclient.properties修改如下内容:session.timeout=*value(默认120,单位分钟,例如修改为10080,7天)重启服......
  • Chrome 不能打开 kubernetes Dashboard 解决方法
    Chrome不能打开kubernetesDashboard解决方法步骤:mkdirkey&&cdkey#生成证书opensslgenrsa-outdashboard.key2048opensslreq-new-outdashboard.csr-keydashboard.key-subj'/CN=kubernetes-dashboard-certs'opensslx509-req-indashboard.csr-s......
  • 项目启动报错 No Spring Session store is configured: set the ‘spring.session.sto
    NoSpringSessionstoreisconfigured:setthe‘spring.session.store-type‘property项目启动为啥会报这个错误?这个错误信息表明你的SpringBoot应用程序没有配置SpringSession的存储类型。SpringSession是Spring框架提供的一个用于管理HTTP会话的组件,它可以与不同的存储......
  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......