热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch学习笔记——索引过程

Elasticsearch学习笔记——索引过程索引不可变和动态索引es的索引,在落盘之后

Elasticsearch学习笔记——索引过程

索引不可变和动态索引

es的索引,在落盘之后是不可变,即不可对其进行二次修改,如果想要修改,必须先删除,后重建。但是,在实际应用中,索引的更新又是一个不可避免的问题,所以,es在索引不可变的基础上,又增加了动态索引的特性,来解决索引更新的问题。
先来看看,为什么es要把索引设计成不可变的?

  1. 我们知道,es是支持集群的。这就必然涉及到一个多线程多进程的问题。假如索引可变,就必须增加锁的机制。所以,索引不可变的前提了,就不再需要锁了。降低了系统的复杂度。

  2. 索引不可变的另一个好处是可以更有效的利用内存。由于索引不可变,当索引一旦被读入内存,它就可以在一直在那儿。只要系统有足够的内存空间,大量的读就可以直接通过访问内存来完成,极大提高系统的性能。

总结来说,不可变有两个好处,一是不用考虑锁,二是高效利用缓存。
但是,不可变也有问题,即每增加新文档的时候,都需要把旧索引全部删除,再重建。所以,es引入了动态索引。事实上,动态索引的本质就是多个索引,即新增文档时,直接生成一个新的索引,查询时,把每个索引的数据都查出来后,再进行聚合处理。这种方式,既保留了索引不可变的优势,又解决了更新的问题。
但是,这种动态索引又产生了一个新的问题,即当新建的索引越来越多时,会影响到聚合的效率,也就会影响到查询的效率。对于这种情况,我们可能会从业务角度来处理。即选择非热点时段,进行索引的重建和切换。当然,es也为这种情况准备了segment合并的策略。

segment

文档经过es处理后,会形成倒排索引,放到es的某个或某几个分片上。所以,es的每个分片上,往往会包含很多个倒排索引,我们把每一个倒排索引,称之为segment,即段。
在查询的时候,es会把所有的segment的查询结果合并汇总成最后的结果再返回。
索引不可变,事实上就是segment不可变。当segment不断增多时,合并汇总的压力会增大,此时,es会触发segment合并的线程,把许多小的segment合并成一个大的segment,并删除原来的小的segment。

translog

如果有了解过MySQL通过重做日志来实现事务的持久化的话,那么,translog对于es的作用,事实上和重做日志对于MySQL事务是一致的。对于es来说,文档也不是直接就放进文件中,而是先会在内存中进行处理,处理成索引信息后,会等到缓冲区满或显示提交时,才会保存到文件中。
那么,如果在保存之前es进程挂掉,如果没有其它机制,就肯定会丢数据。所以,translog来了。即在数据进行索引前,会先写translog日志,该日志是写在文件中的。当es进程出现问题,需要恢复数据时,就会基于translog进行重放日志。这样,就保证了数据的不丢失。

索引的过程


基于上图,我们可以完整整理出一个es对文档进行索引的基本过程,如下:

  1. 接收到客户端传过来的文档后,会首先写入translog日志和内存缓冲区。

  2. 每隔一秒,缓冲区中的内容会被刷新到filesystem cache中,成为一个新的segment。此时,该segment就会被打开,以便被搜索。这也是es能实现近实时性被搜索的关键。

  3. 每秒都有segment刷入,segment数量不断增长,就会触发合并,即将小的segment合并成大的,再合并成更大的,把较小的删除。

  4. 最后,把合并成的大的segment写入到磁盘上,就完成了整个文档的索引过程。

四个阶段可以整理成四个关键词:translog -> segment -> 合并 -> 写入。

近实时化搜索

近实时化搜索的含义指的是当写入一个文档后,该文档在很短时间内就可以被通过关键词搜索到。
前面提到,es之所以能达到近实时化搜索的关键
,只要缓存区的内容在filesystem cache中形成segment后,它就能被搜索了。对于于早期的lucene,只有当segment被写入磁盘才能被搜索,简直不要进步的太多。对比会发现,这中间,从开始创建到能被搜索,事实上省掉了磁盘IO。

commit point

直译为提交点,es用它来记录当前所有可用segment,以及被删除的segment。commit point在segment合并阶段,起到帮助合并且维持搜索的作用。每次合并都会通过记录commit point的方式,告诉前来的查询,哪些段是可用的,哪些段是已经被删除的。合并过程大致如下:

  1. 选择一些大小相似的segment合并成一个较大的segment。

  2. 将新的segment刷到磁盘上。

  3. 创建新的commit point,其中,记录了新的segment,并删除的旧的。

  4. 将新的segment打开供搜索。

  5. 删除掉的segment。

不断变大的translog和flush

回顾es索引文档的过程,你会发现一个问题:如果按些过程不断重复,translog会不断增大。那么,es解决此问题的方式就是——flush。
首先,我们要理解的一点是,translog是为了在es进程异常时,用于恢复尚未持久化的磁盘中的数据用的。也就是说,如果数据已经被持久化到了磁盘中,那么,translog也就没有存在的必要了。
所以,es制定的策略是,每隔30分钟将translog向磁盘中转移一次,转移完成会清空translog。该操作,称之为flush。当translog达到设定的最大值时,即使不到30分钟,也会进行flush。
可以通过配置修改flush的间隔时长以及触发的最大值等。如下:

  • index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush。默认是 unlimited。

  • index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作。默认是512mb。

  • index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。

  • index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。




推荐阅读
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 本文深入解析了Elasticsearch写入与查询的底层机制。在数据写入过程中,首先会将数据暂存至内存缓冲区,在此阶段数据尚不可被搜索。同时,为了保证数据的持久性和可靠性,系统会将这些数据同步记录到事务日志(translog)中。当内存缓冲区接近满载时,系统会触发刷新操作,将缓冲区中的数据写入到磁盘上的段文件中,从而使其可被搜索。此外,文章还探讨了查询过程中涉及的索引分片、倒排索引等关键技术,为读者提供了全面的技术理解。 ... [详细]
  • 微服务应用性能如何?APM监控工具来告诉你
    当微服务系统越来越庞大,各个服务间的调用关系也变得越来越复杂,需要一个工具来帮忙理清请求调用的服务链路。之前使用的是Sleuth+Zipkin的解决方案,最近发现应 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 【系统架构师精讲】(16):操作系统核心概念——寄存器、内存与缓存机制详解
    在计算机系统架构中,中央处理器(CPU)内部集成了多种高速存储组件,用于临时存储指令、数据和地址。这些组件包括指令寄存器(IR)、程序计数器(PC)和累加器(ACC)。寄存器作为集成电路中的关键存储单元,由触发器构成,具备极高的读写速度,使得数据传输非常迅速。根据功能不同,寄存器可分为基本寄存器和移位寄存器,各自在数据处理中发挥重要作用。此外,寄存器与内存和缓存机制的协同工作,确保了系统的高效运行。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 本文深入探讨了HTTP头部中的Expires与Cache-Control字段及其缓存机制。Cache-Control字段主要用于控制HTTP缓存行为,其在HTTP/1.1中得到了广泛应用,而HTTP/1.0中主要使用Pragma:no-cache来实现类似功能。Expires字段则定义了资源的过期时间,帮助浏览器决定是否从缓存中读取资源。文章详细解析了这两个字段的具体用法、相互关系以及在不同场景下的应用效果,为开发者提供了全面的缓存管理指南。 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
author-avatar
幸运幸福摩天轮的世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有