ElasticSearch
一、ElasticSearch 的设计目标与哲学
1.1 核心问题定义(第一性原理)
ElasticSearch 解决的不是“存数据”,而是:
如何在海量数据上,低延迟地完成模糊搜索、相关度计算与聚合分析,并且可以横向扩展。
由此决定了 ES 的一切设计取舍。
1.2 三个基本假设
- **搜索比事务更重要**(Search > Transaction)
- **读多写少,允许近实时**(NRT 而非强一致)
- **数据规模一定会超过单机极限**(必须分布式)
这些假设直接否定了传统 OLTP 数据库的设计路径。
二、ES 的四大第一性模型(世界观层)
2.1 存储模型:不可变段(Immutable Segment)
- 数据一旦写入 Segment,不再修改
- 更新 / 删除 = 标记 + 新写入
- 通过 Merge 解决空间与性能问题
本质动机:
- 避免随机写
- 最大化顺序 IO
- 提升查询并发与缓存命中率
不可变性是 ES 高并发搜索的根基。
2.2 计算模型:Shard 级并行计算
- 一个 Shard = 一个 Lucene Index
- 查询在所有 Shard 上并行执行
- 结果在协调节点做 Reduce
推论:
- Shard 是性能与扩展的最小单元
- 过多 / 过少分片都会导致系统退化
2.3 一致性模型:主分片 + 最终一致
- 写入只发生在 Primary Shard
- Replica 异步复制
- 通过 seq_no + primary_term 实现乐观锁
本质取舍:
用一致性换可用性与性能(CAP 中偏向 AP)。
2.4 扩展性模型:水平扩展优先
- 不支持自动拆分单个 Shard
- 扩展靠 Shard 在节点间重新分布
结论:
分片数是一次性架构决策,不是运行期参数。
三、核心抽象模型(概念边界澄清)
3.1 概念层级映射
| 抽象层 | ES 概念 | 本质含义 |
|---|---|---|
| 集群 | Cluster | 资源与状态一致性边界 |
| 节点 | Node | 计算与存储执行单元 |
| 索引 | Index | 逻辑数据集合 |
| 分片 | Shard | 并行与扩展单位 |
| 段 | Segment | 不可变倒排索引文件 |
| 文档 | Document | 最小检索对象 |
Index ≠ Database,Shard ≠ Table Partition。
四、数据生命周期(从写入到消亡)
4.1 写入路径(近实时本质)
- 写入 Memory Buffer + Translog
- Refresh:生成可搜索 Segment(1s)
- Flush:Segment 持久化 + Commit Point
- Merge:后台合并段文件
关键认知:
- 可搜索 ≠ 已落盘
- Refresh 是搜索语义,Flush 是持久化语义
4.2 读取与搜索路径
- Shard 本地执行 Query
- 利用 Filesystem Cache
- 协调节点完成排序 / 分页 / 聚合
搜索性能 ≈ Cache 命中率 × 并行度
五、分布式查询与算分模型
5.1 两阶段搜索模型
- Query Phase:每个 Shard 本地算分
- Fetch Phase:协调节点拉取文档
5.2 算分不准的根因
- Shard 之间统计信息隔离
- IDF 基于局部数据
解决方案:
- 单主分片
- dfs_query_then_fetch
六、数据建模的工程哲学
6.1 建模第一原则
- **为查询建模,而非为存储建模**
- **反范式优于范式**
- **写入成本 < 查询复杂度**
6.2 三种结构的取舍
| 模型 | 使用场景 | 代价 |
|---|---|---|
| 扁平文档 | 默认选择 | 写入冗余 |
| Nested | 局部强关联 | 查询慢 |
| Parent-Child | 高频更新 | 内存与算分成本高 |
七、资源与性能模型
7.1 三大瓶颈
- CPU:查询、聚合、脚本
- 内存:Segment Metadata / Fielddata
- IO:Merge / 冷数据访问
7.2 缓存哲学
- Filesystem Cache 是王者
- ES 内部缓存是辅助
不给 OS 内存,就是主动放弃性能。
八、容量规划与演进策略
8.1 容量规划不是算公式
而是回答:
- 数据增长曲线
- 查询模型稳定性
- 故障时是否可降级
8.2 索引演进策略
- 时间分区(日志)
- 业务分区(实体数据)
- ILM:Hot → Warm → Cold → Delete
九、治理、监控与系统稳定性
9.1 Cluster State 是核心共享资源
- Mapping
- Shard 元数据
- Index 配置
原则:
减少变更频率,控制规模。
9.2 健康度认知
- Green:理想态
- Yellow:可运行但有风险
- Red:服务不完整
十、反模式(Anti-Patterns)
- 把 ES 当数据库用
- 大量 Join / Nested 查询
- 无限制深度分页
- 动态字段失控
- 分片数拍脑袋
十一、ES 的能力边界
ES 适合
- 搜索
- 实时分析
- 日志与行为数据
ES 不适合
- 强事务
- 账务系统
- 复杂关系型查询
关联内容(自动生成)
- [/数据技术/检索技术.html](/数据技术/检索技术.html) 检索技术涵盖了倒排索引、搜索空间裁剪、候选生成等核心技术,与ElasticSearch的搜索原理和实现机制密切相关
- [/中间件/数据库/索引.html](/中间件/数据库/索引.html) 索引技术详细介绍了B+树、哈希索引、位图索引等数据结构,这些是ElasticSearch中段(Segment)和倒排索引的底层实现基础
- [/软件工程/架构/系统设计/分布式/分布式系统.html](/软件工程/架构/系统设计/分布式/分布式系统.html) 分布式系统理论涵盖了CAP定理、一致性模型、分片策略等概念,这些都是ElasticSearch分布式架构设计的核心原理
- [/中间件/数据库/分布式数据库.html](/中间件/数据库/分布式数据库.html) 分布式数据库的分片(Sharding)、副本复制、一致性模型等内容与ElasticSearch的分布式架构和数据管理方式有诸多相似之处,可作对比参考