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 '王%';- 无法使用数据库索引,需要全表扫描,性能差
- 只能首尾位模糊匹配,无法实现复杂搜索需求
- 无法得到文档与搜索条件的相关性
-
倒排索引定义:
- 正排索引:以文档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规范统一多源数据字段
- 对热点查询字段合理设置倒排索引属性
- 定期监控段数量,避免过多小段影响性能