ElasticSearch ( 二 )
字数 2854 2025-08-10 19:49:11

ElasticSearch 核心原理与架构详解

一、Lucene 核心原理

1.1 倒排索引

1.1.1 倒排索引概念

倒排索引(Inverted Index)是全文搜索引擎的核心数据结构,用于解决传统关系型数据库在全文检索方面的不足:

  • 传统SQL问题

    SELECT * FROM hotel_table WHERE hotel_name LIKE '王%';
    
    1. 无法使用数据库索引,需要全表扫描,性能差
    2. 只能首尾位模糊匹配,无法实现复杂搜索需求
    3. 无法得到文档与搜索条件的相关性
  • 倒排索引定义

    • 正排索引:以文档ID为索引,文档内容为记录
    • 倒排索引:以文档内容中的单词为索引,包含该词的文档ID为记录

1.1.2 倒排索引生成过程

示例文档:

  1. "苏州街维亚大厦"
  2. "桔子酒店苏州街店"

处理步骤:

  1. 正排索引编号文档
  2. 字段内容分词(如:"苏州街"、"维亚大厦"、"桔子酒店")
  3. 以单词为索引,文档ID为值建立链表

1.1.3 倒排索引结构

  • Term Dictionary (索引表)

    • 存储所有分词后的单词(Term)
    • 类似Map结构的Key部分
  • Postings List (记录表)

    • 包含文档ID(DocId)
    • 词频(Term Frequency)
    • 位置(Position)
    • 偏移(Offset)

1.1.4 Lucene倒排索引实现

存储挑战

  1. Dictionary可能非常大(上千万个Term)
  2. Postings可能占用大量存储(一个Term对应数百万doc)

解决方案

  • 将Postings List拆分为三个文件:
    • .doc:文档ID和词频
    • .pay:Payload和偏移量
    • .pos:位置信息

Term Dictionary实现

  • 使用FST(Finite State Transducer)高效存储和查询Term
  • 通过.tip文件存储Term Index
  • 通过.tim文件存储Term Dictionary

查询流程

  1. 通过.tip文件获取字段的FST
  2. 通过FST找到Term可能存在的Block
  3. 加载Block到内存,遍历查找Term
  4. 通过TermStat获取Posting数据
  5. 遍历TermFreqs或使用SkipData跳转

1.2 数据分段(Segment)

1.2.1 分段概念

  • 将大索引拆分为多个子文件(段)
  • 每个段是独立可搜索的数据集
  • 段具有不变性(写入磁盘后不可修改)

1.2.2 写操作实现

  • 新增:新建段存储新增数据
  • 删除:在.del文件中记录被删除的数据ID
  • 更新:删除旧数据+新增更新后数据

1.2.3 段不变性优缺点

优点

  1. 不需要锁(无并发冲突)
  2. 常驻内存(提升查询性能)
  3. 缓存友好(生命周期内有效)
  4. 增量创建(轻量级更新)

缺点

  1. 删除数据不能立即释放空间
  2. 更新操作浪费空间
  3. 段数量多时消耗资源
  4. 查询需过滤已删除数据

1.2.4 准实时搜索实现

  • 延迟写策略
    1. 新数据先写入内存
    2. 批量写入磁盘(默认1秒或达到阈值)
    3. 生成提交点(commit point)
    4. 清空内存等待新数据

1.2.5 段合并策略

合并原因

  • 段数量过多消耗资源
  • 影响检索性能(需合并多段结果)

合并策略

  1. 按段大小分组
  2. 优先合并中小段
  3. 超大段不参与合并

关键参数

  • mergeFactor:每次合并最少段数(默认10)
  • SegmentSize:段实际大小
  • minMergeSize:小于此值的段分到一组
  • maxMergeSize:大于此值的段不参与合并

合并步骤

  1. 标准化段大小:logMergeFactorSegmentSize
  2. 按时间排序并计算标准化值
  3. 找到最大段,生成区间[最大段值-0.75, 最大段值]
  4. 查找落在区间的段进行合并
  5. 排除超大段后判断是否满足合并条件

二、ELK技术栈

2.1 ELK组成

  • Elasticsearch:分布式搜索引擎
    • 特点:分布式、零配置、自动发现、索引自动分片、RESTful接口
  • Logstash:日志收集、分析、过滤工具
    • 工作方式:C/S架构,Client收集日志,Server过滤转发
  • Kibana:数据可视化Web界面
  • Filebeat:轻量级日志收集工具(属于Beats家族)

2.2 Filebeat详解

Beats家族

  1. Packetbeat:网络流量数据
  2. Topbeat:系统/进程/文件系统数据
  3. Filebeat:文件数据
  4. Winlogbeat:Windows事件日志

Filebeat组件

  1. Harvester

    • 读取单个文件内容
    • 每个文件一个Harvester
    • 保持文件打开直到close_inactive(默认5分钟)
  2. Prospector

    • 管理Harvester
    • 查找所有读取源
    • 检查文件是否需要启动Harvester

关键参数

  • scan_frequency:检查新文件频率(默认10秒)
  • close_inactive:文件不活动后关闭句柄时间

三、Elasticsearch在安全领域的应用

3.1 安全分析挑战

  1. 海量安全数据存储与检索
  2. 多源异构数据统一分析
  3. 实时威胁检测需求

3.2 ES安全解决方案

3.2.1 数据采集

数据类型 采集工具
网络数据 Packetbeat
系统指标 Metricbeat
文件日志 Filebeat
Windows事件 Winlogbeat
第三方服务日志 Logstash插件

3.2.2 数据标准化

  • ECS(Elastic Common Schema)
    • 统一字段命名规范
    • 专业分类方法
    • Elastic生态组件均遵循

3.2.3 数据增强

  1. Beats增强

    • 添加主机信息
    • 地理IP解析
    • 自定义字段
  2. Logstash过滤

    • Grok解析
    • 字段转换
    • 条件处理
  3. Elasticsearch处理器

    • 日期解析
    • 字段重命名
    • 脚本处理

四、关键知识点总结

  1. 倒排索引是ES高效搜索的核心,通过Term Dictionary和Postings List实现
  2. 数据分段机制解决了大索引更新问题,通过段不变性+延迟写实现准实时
  3. 段合并策略平衡了存储效率与查询性能,优先合并中小段
  4. ELK栈分工明确:Beats采集、Logstash处理、ES存储、Kibana展示
  5. ECS规范解决了安全领域多源数据统一分析的问题
  6. 准实时搜索通过内存缓冲+批量写入实现,非真正实时

五、性能优化建议

  1. 根据业务场景调整mergeFactor和段大小参数
  2. 合理设置close_inactive平衡资源占用与实时性
  3. 使用ECS规范统一多源数据字段
  4. 对热点查询字段合理设置倒排索引属性
  5. 定期监控段数量,避免过多小段影响性能
ElasticSearch 核心原理与架构详解 一、Lucene 核心原理 1.1 倒排索引 1.1.1 倒排索引概念 倒排索引(Inverted Index)是全文搜索引擎的核心数据结构,用于解决传统关系型数据库在全文检索方面的不足: 传统SQL问题 : 无法使用数据库索引,需要全表扫描,性能差 只能首尾位模糊匹配,无法实现复杂搜索需求 无法得到文档与搜索条件的相关性 倒排索引定义 : 正排索引:以文档ID为索引,文档内容为记录 倒排索引:以文档内容中的单词为索引,包含该词的文档ID为记录 1.1.2 倒排索引生成过程 示例文档: "苏州街维亚大厦" "桔子酒店苏州街店" 处理步骤: 正排索引编号文档 字段内容分词(如:"苏州街"、"维亚大厦"、"桔子酒店") 以单词为索引,文档ID为值建立链表 1.1.3 倒排索引结构 Term Dictionary (索引表) : 存储所有分词后的单词(Term) 类似Map结构的Key部分 Postings List (记录表) : 包含文档ID(DocId) 词频(Term Frequency) 位置(Position) 偏移(Offset) 1.1.4 Lucene倒排索引实现 存储挑战 : Dictionary可能非常大(上千万个Term) Postings可能占用大量存储(一个Term对应数百万doc) 解决方案 : 将Postings List拆分为三个文件: .doc :文档ID和词频 .pay :Payload和偏移量 .pos :位置信息 Term Dictionary实现 : 使用FST(Finite State Transducer)高效存储和查询Term 通过 .tip 文件存储Term Index 通过 .tim 文件存储Term Dictionary 查询流程 : 通过.tip文件获取字段的FST 通过FST找到Term可能存在的Block 加载Block到内存,遍历查找Term 通过TermStat获取Posting数据 遍历TermFreqs或使用SkipData跳转 1.2 数据分段(Segment) 1.2.1 分段概念 将大索引拆分为多个子文件(段) 每个段是独立可搜索的数据集 段具有不变性(写入磁盘后不可修改) 1.2.2 写操作实现 新增 :新建段存储新增数据 删除 :在 .del 文件中记录被删除的数据ID 更新 :删除旧数据+新增更新后数据 1.2.3 段不变性优缺点 优点 : 不需要锁(无并发冲突) 常驻内存(提升查询性能) 缓存友好(生命周期内有效) 增量创建(轻量级更新) 缺点 : 删除数据不能立即释放空间 更新操作浪费空间 段数量多时消耗资源 查询需过滤已删除数据 1.2.4 准实时搜索实现 延迟写策略 : 新数据先写入内存 批量写入磁盘(默认1秒或达到阈值) 生成提交点(commit point) 清空内存等待新数据 1.2.5 段合并策略 合并原因 : 段数量过多消耗资源 影响检索性能(需合并多段结果) 合并策略 : 按段大小分组 优先合并中小段 超大段不参与合并 关键参数 : mergeFactor :每次合并最少段数(默认10) SegmentSize :段实际大小 minMergeSize :小于此值的段分到一组 maxMergeSize :大于此值的段不参与合并 合并步骤 : 标准化段大小: logMergeFactorSegmentSize 按时间排序并计算标准化值 找到最大段,生成区间[ 最大段值-0.75, 最大段值 ] 查找落在区间的段进行合并 排除超大段后判断是否满足合并条件 二、ELK技术栈 2.1 ELK组成 Elasticsearch :分布式搜索引擎 特点:分布式、零配置、自动发现、索引自动分片、RESTful接口 Logstash :日志收集、分析、过滤工具 工作方式:C/S架构,Client收集日志,Server过滤转发 Kibana :数据可视化Web界面 Filebeat :轻量级日志收集工具(属于Beats家族) 2.2 Filebeat详解 Beats家族 : Packetbeat:网络流量数据 Topbeat:系统/进程/文件系统数据 Filebeat:文件数据 Winlogbeat:Windows事件日志 Filebeat组件 : Harvester : 读取单个文件内容 每个文件一个Harvester 保持文件打开直到 close_inactive (默认5分钟) Prospector : 管理Harvester 查找所有读取源 检查文件是否需要启动Harvester 关键参数 : scan_frequency :检查新文件频率(默认10秒) close_inactive :文件不活动后关闭句柄时间 三、Elasticsearch在安全领域的应用 3.1 安全分析挑战 海量安全数据存储与检索 多源异构数据统一分析 实时威胁检测需求 3.2 ES安全解决方案 3.2.1 数据采集 | 数据类型 | 采集工具 | |----------------|-------------------| | 网络数据 | Packetbeat | | 系统指标 | Metricbeat | | 文件日志 | Filebeat | | Windows事件 | Winlogbeat | | 第三方服务日志 | Logstash插件 | 3.2.2 数据标准化 ECS(Elastic Common Schema) : 统一字段命名规范 专业分类方法 Elastic生态组件均遵循 3.2.3 数据增强 Beats增强 : 添加主机信息 地理IP解析 自定义字段 Logstash过滤 : Grok解析 字段转换 条件处理 Elasticsearch处理器 : 日期解析 字段重命名 脚本处理 四、关键知识点总结 倒排索引 是ES高效搜索的核心,通过Term Dictionary和Postings List实现 数据分段 机制解决了大索引更新问题,通过段不变性+延迟写实现准实时 段合并 策略平衡了存储效率与查询性能,优先合并中小段 ELK栈 分工明确:Beats采集、Logstash处理、ES存储、Kibana展示 ECS规范 解决了安全领域多源数据统一分析的问题 准实时搜索 通过内存缓冲+批量写入实现,非真正实时 五、性能优化建议 根据业务场景调整 mergeFactor 和段大小参数 合理设置 close_inactive 平衡资源占用与实时性 使用ECS规范统一多源数据字段 对热点查询字段合理设置倒排索引属性 定期监控段数量,避免过多小段影响性能