Elasticsearch相关技术点
目录ES数据结构、倒排索引、写入流程、读取流程ES检索快的核心原因Elasticsearch 性能优化Elasticsearch 和 Kafka 数据结构对比什么场景下使用了ES?//todo 项目中什么场景用了ESES 怎么用的?数据量级多少?为什么用ES 不用Hbase?倒排索引 是什么讲一下?为什么ES检索比较快?ES 数据结构是怎么样的?ES查询流程?ES如果要查10条数据需要从各个分片上各取多少条数据?ElasticSearch性能优化详解1. 硬件优化2. JVM 配置优化3. 索引优化4. 查询优化5. 集群优化6. 写入优化7. 缓存优化8. 监控与调优9. 其他优化总结一、ElasticSearch 核心面试题1. 基础概念与特点2. 核心原理:倒排索引3. 核心概念:索引、分片、副本4. 集群与节点角色5. 写入与搜索流程6. 性能与运维调优二、ELK 栈与分布式日志收集面试题1. ELK 基础2. ELK 工作流程3. 引入Kafka的架构(ELK + Kafka)4. Kafka核心概念(在日志收集场景下)5. 系统设计ElasticSearch知识体系详解| Java 全栈知识体系快手 Java 面试 | 小林codingES详解 - 优化:ElasticSearch性能优化详解 | Java 全栈知识体系ES数据结构、倒排索引、写入流程、读取流程概念定义与角色核心目的关键过程与特点对检索速度的贡献索引逻辑容器,最高层的数据集合。数据的逻辑分组与操作入口。可定义映射(Schema),是操作的主要对象。提供清晰的数据边界和操作目标。分片索引的水平分割。一个分片就是一个完整的Lucene索引。分布式存储与计算,实现水平扩展和高可用。1. 主/副本分片机制。2. 是数据分布和并行处理的基本单元。并行计算:查询可以同时发送到所有相关分片(主分片或副本)执行,极大提升吞吐量。Segment分片的物理组成部分,是最小的、不可变的倒排索引文件。实现高效、可靠的索引与检索机制。1.不可变(删除文档仅为标记)。2. 搜索时需遍历分片内所有Segment。3. 后台自动合并以优化性能与空间。不可变性:无需锁,支持高效的缓存和并发读取。合并优化:减少Segment数量,提升查询效率。倒排索引Segment内部的核心数据结构,一种“从词找文档”的索引。实现毫秒级的全文检索。1. 包含词典和记录文档ID、词频、位置的倒排表。2. 支持快速的布尔运算(与/或)。算法核心:直接通过关键词定位文档,而非逐行扫描,这是全文检索快的根本。Term Index倒排索引的加速索引,通常是词典的前缀索引,存在于内存中。快速定位到Term Dictionary中的词项。1. 类似于字典的部首目录。2. 常驻内存,检索速度快。内存加速:将磁盘上的词典查找转化为高效的内存查找,极大减少了磁盘随机I/O。Stored Fields按行存储的原始字段值。返回指定的原始字段内容。1. 存储未被分析的原始值。2. 用于获取搜索结果中要展示的字段内容。快速取回:在找到文档ID后,能高效地获取要返回的字段值,完成查询的最后一步。Doc Values按列存储的字段值,在索引时创建。高效执行聚合、排序、脚本访问。1.列式存储,针对聚合和大规模数值处理高度优化。2. 默认存储在磁盘,但可高效缓存到内存。列式处理:对于聚合、排序等操作,无需加载整行数据,可以快速对某一列进行顺序计算,比使用倒排索引做这些操作快得多。写入流程文档从接收到持久化的过程。持久化数据并使其可被搜索。1.写入缓冲与刷新机制。2.近实时搜索(NRT)。近实时性:数据在写入后约1秒即可被搜索到,平衡了写入性能与检索的实时性需求。查询流程从接收搜索请求到返回结果的过程。快速、准确地检索数据。1.分发-并行搜索-合并。2. 综合利用上述所有数据结构。协同优化:整个流程完美结合了分布式并行(分片)、内存加速(Term Index)、高效算法(倒排索引)、列式处理(Doc Values)和实时获取(Stored Fields)。ES检索快的核心原因分布式并行处理:利用分片将数据和计算压力分散到集群多个节点。高效的数据结构:核心是倒排索引,实现了从词到文档的快速映射。内存加速:使用Term Index等结构将磁盘查找转化为内存查找。列式存储优化:Doc Values为聚合、排序等操作提供了极快的列式数据访问路径。近实时设计:通过刷新机制,使新数据能很快被搜索到。不可变性与缓存友好:Segment的不可变性使得缓存策略高效,支持高并发读。Elasticsearch 性能优化优化维度具体优化点核心思路与操作预期收益与注意事项索引设计优化1. 合理设置分片数-黄金法则:单个分片大小建议在10GB - 50GB 之间(基于SSD)。- 考虑数据总量和增长。- 分片数 = 总数据量 / 30GB。分片过小则开销大,过大则影响迁移恢复。避免分片过多导致元数据膨胀和调度开销,也避免分片过大导致恢复慢、查询慢。2. 精心设计Mapping- 明确字段类型,避免动态映射。- 对无需分词的字段(如ID、状态码、标签)使用keyword 类型。- 对无需搜索、仅用于返回的字段,设置"index": false。- 合理使用copy_to 合并字段,减少查询条件。节省存储,提升索引和查询速度。keyword类型利用Doc Values,聚合和排序极快。3. 索引生命周期管理- 使用ILM 或定时任务,按时间滚动索引(如按天、月)。- 对历史索引进行_forcemerge(合并Segment,设为max_num_segments=1)。- 对冷数据索引设置"codec": "best_compression"并关闭副本。控制单个索引大小,提升热点索引性能;大幅降低冷数据存储成本。集群与分片优化1. 避免“过度分片”监控集群总分片数。一个小型集群总分片数建议控制在几千以内。通过ILM或扩大索引分片容量来减少分片总数。降低主节点元数据管理和调度压力,提升集群稳定性。2. 使用冷热架构节点分为“热”节点(SSD,高性能CPU)和“冷”节点(HDD,大容量)。将当前活跃索引分配到热节点,历史索引迁移到冷节点。用最低成本同时满足高性能查询和大容量存储的需求。3. 设置合理的副本数初期可设为1。在写入压力大但可容忍暂时丢失数据时,可临时设为0,写入完成后再恢复。副本提高读取吞吐和可用性,但会增加写入开销和存储成本。搜索查询优化1. 善用Filter Context对不需要相关性算分的查询(如term,range,bool中的过滤条件),务必放入filter 子句。结果可被缓存,跳过算分阶段,大幅提升查询速度。2. 避免深度分页和超大结果集- 避免使用from + size做深度分页(如 1000)。改用search_after。- 避免使用size: 0获取全量数据做聚合,应通过聚合直接出结果。深度分页涉及全局排序,开销极大。search_after性能恒定。3. 优化查询语句- 限制返回字段(_sourcefiltering)。- 使用更高效的查询(如用term而非match查keyword字段)。- 避免通配符开头的模糊查询(wildcard)。- 对范围查询,考虑使用日期/数值字段。减少网络传输和序列化开销,利用更高效的查询逻辑。4. 使用路由在写入和查询时指定routing 参数(如用户ID),将相关数据集中到同一分片。避免查询时广播到所有分片,将全局查询变为分片局部查询,大幅提升效率。写入优化1. 批量写入使用Bulk API,单批次大小建议在5-15 MB。通过测试找到最佳值。减少网络往返和索引创建开销,写入吞吐量可提升数个量级。2. 调整刷新间隔对写入速度要求高、实时性要求不高的场景,可临时调大索引的refresh_interval(如至30s)。减少生成Segment(刷新)的频率,降低写入开销,提升吞吐。3. 临时关闭副本与刷新大规模初始导入时:1. 设置index.number_of_replicas: 02. 设置refresh_interval: -1导入完成后恢复。写入期间完全不构建副本、不刷新,使写入速度达到物理极限。4. 优化硬件与OS配置- 使用SSD。- 为ES进程预留足够内存(通常为系统内存的50%,不超过32GB)。- 调整Linux的vm.max_map_count和文件描述符限制。磁盘IO是主要瓶颈,SSD提升最大。足够的内存用于JVM堆和操作系统缓存。资源与监控1. 监控关键指标-节点级别:CPU、内存、磁盘IO、磁盘空间。-索引/分片级别:查询/索引延迟、拒绝率、Segment数量和大小(_cat/indices?v)。-集群级别:总分片数、未分配分片、主节点负载。及时发现瓶颈(如磁盘IO打满、GC频繁、某个索引查询慢)。2. 强制合并Segment对不再写入的只读索引,执行POST /index_name/_forcemerge?max_num_segments=1。极大减少Segment数量,提升查询速度,并释放磁盘空间。3. 合理设置JVM堆设置为机器内存的50%,且不超过32GB(以利用压缩指针)。建议设置-Xms和-Xmx相等。避免堆过大导致GC停顿时间过长,或堆过小导致频繁GC。总结:性能优化是一个系统工程,需在资源投入、数据设计、查询模式三者间找到最佳平衡。核心思路是:设计阶段做好规划(Mapping、分片) -写入时用批量、调参数 -查询时用对语法、避坑 -事后监控、持续调优。Elasticsearch 和 Kafka 数据结构对比对比维度Elasticsearch (面向搜索的存储)Kafka (面向流的数据总线)核心差异解读核心数据模型索引 - 类型(已弃用) - 文档以“文档”为实体,建立反向索引以支持复杂查询。主题 - 分区 - 消息以“消息”为实体,按顺序组织成持久化日志。ES是状态数据库,存储当前数据状态并支持查询;Kafka是日志流,记录事件的变更序列。核心存储单元分片: 索引的水平切片,是一个独立的Lucene索引。Segment: 分片内不可变的倒排索引文件。分区: 主题的水平切片,是一个独立的顺序写入日志。日志段: 分区内按时间或大小切分的物理文件(.log)。ES的存储单元为搜索优化(倒排索引);Kafka的存储单元为顺序IO优化(追加日志)。索引机制倒排索引: 核心结构,实现“词-文档”的快速映射。Doc Values: 列式存储,用于聚合排序。偏移量索引: 内存映射文件,实现“消息偏移量-物理文件位置”的映射。时间索引: 支持按时间戳查找消息。ES的索引用于内容检索;Kafka的索引用于位置定位,以加速按偏移量或时间戳的消息读取。数据组织方式按内容索引: 数据被分析、分词,并建立复杂的索引结构以供多维查询。按顺序追加
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416031.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!