👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
文章大纲
- 1.2 核心概念精讲-1.2.1索引(Index)、文档(Document)、分片(Shard)、副本(Replica)
- 1. 索引(`Index`):数据的逻辑容器
- 1.1 定义与核心特性
- 典型索引示例(电商商品索引):
- 1.2 与传统数据库的对比
- 1.3 索引生命周期管理(`ILM`)
- 2. 文档(`Document`):数据存储的基本单元
- 2.1 `JSON`文档结构
- 2.2 动态映射 vs 显式映射
- 2.3 文档操作的原子性
- 3. 分片(`Shard`):分布式架构的核心设计
- 3.1 主分片与数据分布
- 分片数量设定策略
- 3.2 `分片大小与性能优化`
- 4. 副本(`Replica`):高可用与性能的基石
- 4.1 副本的核心作用
- 4.2 副本配置策略
- 副本与写入性能的关系
- 5. 总结与最佳实践
- 核心概念关联
- 最佳实践指南
- 未来演进方向
1.2 核心概念精讲-1.2.1索引(Index)、文档(Document)、分片(Shard)、副本(Replica)
1. 索引(Index
):数据的逻辑容器
1.1 定义与核心特性
- 逻辑容器:索引是
Elasticsearch
中最高层的数据组织单元,类似于传统数据库中的“表”。 动态映射
:自动推断字段类型
(如字符串识别为text
或keyword
)。- 多租户支持:一个集群可承载数千个独立索引(如
logs-2023
、products
)。
典型索引示例(电商商品索引):
PUT /products
{"mappings": {"properties": {"title": { "type": "text", "analyzer": "ik_max_word" }, // 中文分词"price": { "type": "double" },"category": { "type": "keyword" }, // 精确匹配"tags": { "type": "text", "fielddata": true }, // 支持聚合"created_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }}}
}
1.2 与传统数据库的对比
特性 | Elasticsearch Index | 关系型数据库 Table |
---|---|---|
Schema灵活性 | 动态映射(可扩展) | 严格预定义 |
数据类型支持 | 支持地理位置/向量 | 基础类型为主 |
写入性能(单节点) | 5万文档/秒 | 1万行/秒 |
典型应用场景 | 日志/搜索/分析 | 事务处理 |
1.3 索引生命周期管理(ILM
)
- ES 索引生命周期管理将索引的生命周期划分为四个主要阶段:
- 热(
Hot
):索引处于活跃使用状态,频繁进行读写操作
。新创建的索引默认处于此阶段,需要高性能的硬件资源来保证快速的读写响应。 - 温(
Warm
):当索引不再频繁写入,但仍需要被查询时
,可将其转移到温阶段。这个阶段可以使用性能较低、成本较便宜的硬件。 - 冷(
Cold
):索引很少被访问,数据基本处于只读状态
。可以将其存储在成本更低的存储介质上,以节省成本。 - 删除(
Delete
):当索引中的数据不再需要时
,将其从系统中删除,释放磁盘空间。
针对日志类索引的自动化管理策略:
- 热(
阶段 | 存储介质 | 分片策略 | 保留周期 | 典型操作 |
---|---|---|---|---|
Hot | SSD | 3主分片+1副本 | 3天 | 频繁写入与实时查询 |
Warm | HDD | 合并为1主分片 | 30天 | 只读查询,forcemerge操作 |
Cold | 归档存储 | 1主分片+0副本 | 180天 | 冻结索引(freeze) |
Delete | - | - | - | 自动删除 |
2. 文档(Document
):数据存储的基本单元
2.1 JSON
文档结构
- 最小数据单元:以
JSON
格式存储,支持嵌套对象和数组
。 - 元数据字段:
{"_index": "products", // 所属索引"_id": "p1001", // 文档唯一标识"_version": 3, // 版本号(乐观锁控制)"_source": { // 原始数据"title": "iPhone 15","price": 6999.00,"category": ["手机", "数码"]} }
2.2 动态映射 vs 显式映射
对比维度 | 动态映射 | 显式映射 |
---|---|---|
适用场景 | 快速原型开发 | 生产环境(字段类型严格管控) |
字段类型推断 | 自动(如"2023-10-01"→date 类型) | 需手动定义 |
性能影响 | 可能因字段爆炸导致内存问题??? | 稳定可控 |
典型配置 | "dynamic": true | "dynamic": strict (禁止未知字段) |
- 可能因字段爆炸导致内存问题
- ES 的动态映射是一种非常方便的特性,当你向索引中写入文档时,如果文档中包含的字段在索引映射中不存在,ES 会自动为这些新字段创建映射。这使得用户在使用 ES 时无需预先定义所有可能的字段,提高了灵活性。
- 如果文档中存在大量不同的字段,或者字段名的组合非常多,动态映射会不断创建新的字段映射,这就可能导致字段爆炸问题。
- 字段爆炸导致内存问题的具体影响
- 内存占用增加:每个字段映射都需要在内存中占用一定的空间,大量的字段映射会显著增加 ES 节点的内存使用量。当内存使用达到系统限制时,可能会导致节点性能下降,甚至引发内存溢出错误,使节点崩溃。
- 查询性能下降:
字段数量的增加
会使 ES 在执行查询时需要处理更多的信息,增加了查询的复杂度和时间开销。同时,内存压力
也可能导致缓存命中率下降,进一步影响查询性能。 - 磁盘空间占用增加:除了内存占用,大量的字段映射也会增加磁盘空间的使用,因为 ES 需要将这些映射信息持久化到磁盘上。
- 示例场景
- 假设你正在使用 ES 来存储用户行为日志,每个日志文档包含用户的操作信息。由于用户的操作可能非常多样化,不同用户的日志文档中可能包含大量不同的字段。
随着时间的推移,可能会有越来越多不同的字段被动态映射到索引中,最终导致字段爆炸。
例如: -
// 文档 1 {"user_id": "123","action": "click","button_name": "submit" }// 文档 2 {"user_id": "456","action": "scroll","scroll_distance": "500px" }// 文档 3 {"user_id": "789","action": "hover","element_id": "element_123" }
- 假设你正在使用 ES 来存储用户行为日志,每个日志文档包含用户的操作信息。由于用户的操作可能非常多样化,不同用户的日志文档中可能包含大量不同的字段。
- 解决办法
- 关闭动态映射。
dynamic: false
- 使用动态模板。
- 定期清理无用字段。定期检查索引中的字段使用情况,删除那些不再使用的字段,以减少内存和磁盘空间的占用。
- 关闭动态映射。
2.3 文档操作的原子性
-
写入流程:
-
版本控制:通过
_version
字段实现乐观锁,避免并发冲突。
示例:更新文档时指定版本号:PUT /products/_doc/p1001?version=3 {"title": "iPhone 15 Pro" }
3. 分片(Shard
):分布式架构的核心设计
3.1 主分片与数据分布
- 分布式存储:
每个索引划分为多个分片,均匀分布在集群节点中
。 - 路由算法:
shard = hash(_routing) % number_of_shards
(默认_routing=_id
)。
分片数量设定策略
数据规模 | 建议主分片数 | 示例场景 |
---|---|---|
< 50GB | 1-2 | 小型日志索引 |
50GB - 1TB | 3-5 | 中型电商商品库 |
> 1TB | 10+ | 大型社交媒体数据 |
注意:分片数一旦创建不可修改,需提前规划!
3.2 分片大小与性能优化
- 黄金法则:单个分片大小控制在10GB-50GB之间。
- 性能对比:
分片大小 | 查询延迟(平均) | 写入吞吐量(文档/秒) |
---|---|---|
10GB | 120ms | 12,000 |
50GB | 350ms | 8,000 |
100GB | 950ms | 3,500 |
过大分片问题 !!!
:
- 恢复时间过长(1TB分片恢复需数小时)
垃圾回收(GC)
压力增大
4. 副本(Replica
):高可用与性能的基石
4.1 副本的核心作用
作用维度 | 说明 |
---|---|
数据高可用 | 主分片故障时,副本分片自动晋升为主分片 |
读性能扩展 | 查询请求可路由到副本分片(负载均衡) |
数据冗余 | 防止硬件故障导致数据丢失(副本数=1时,可容忍1个节点宕机) |
4.2 副本配置策略
场景 | 推荐副本数 | 示例 |
---|---|---|
开发环境 | 0-1 | 本地测试集群 |
生产环境(常规) | 1-2 | 电商搜索服务 |
关键业务(金融) | 2-3 | 交易日志 |
副本与写入性能的关系
- 写入流程:主分片写入后需同步到所有副本,增加副本数会降低写入速度。
- 性能测试数据:
副本数 | 写入吞吐量(文档/秒) | 查询QPS(万级) |
---|---|---|
0 | 15,000 | 3.2 |
1 | 10,000 | 6.5 |
2 | 6,500 | 9.8 |
5. 总结与最佳实践
核心概念关联
最佳实践指南
-
索引设计
预定义映射避免字段爆炸
- 按时间滚动创建索引(如
logs-2023-10
)
-
分片策略
- 单个分片大小控制在10GB-50GB
分片数 = 节点数 × 1.5(预留扩容空间)
-
副本配置
- 生产环境至少1个副本
写入密集型场景可暂时降低副本数
未来演进方向
- 自动分片调整:基于负载动态调整分片分布
- 存储分层:
SSD+HDD+对象存储
混合架构 Serverless
分片:按需自动扩缩容