Elasticsearch
📌 一、Elasticsearch 的核心概念
在深入原理前,需要理解以下几个关键术语:
|
概念 |
类比传统数据库 |
说明 |
|---|---|---|
|
索引 (Index) |
数据库 (Database) |
存储结构相似文档的集合,是数据管理的顶层单位。新版中已移除“类型”(Type)概念 |
|
文档 (Document) |
行 (Row) |
数据的基本单元,采用 JSON 格式存储 |
|
字段 (Field) |
列 (Column) |
文档中的最小数据单元,支持文本、数值、日期等多种数据类型 |
|
分片 (Shard) |
分区 (Partition) |
索引被划分为多个分片,实现数据分布式存储与并行处理,分片数在索引创建后不可更改 |
|
副本 (Replica) |
备份副本 |
分片的拷贝,提供数据高可用和负载均衡。每个分片可以有零个或多个副本 |
|
节点 (Node) |
服务器实例 |
一个运行的 ES 实例,多个节点组成集群 (Cluster) |
⚙️ 二、Elasticsearch 的工作原理
1. 分布式架构与数据存储
-
自协调集群:节点启动后通过 Zen Discovery 机制自动发现并组成集群。主节点负责管理集群元信息,数据节点存储分片
-
数据路由:文档通过
hash(document_id) % number_of_primary_shards路由到特定主分片。写入操作首先在主分片完成,然后同步到所有副本分片 -
近实时搜索 (NRT):文档写入后先存入内存缓冲区,默认间隔 1 秒刷新(refresh)一次,生成新的可搜索段(segment),此时文档才可被检索
2. 倒排索引与全文检索
-
倒排索引:ES 底层使用 Lucene 的倒排索引实现高效全文搜索。其核心是维护一个“词项(Term) → 文档ID列表”的映射
-
文本分析过程:文本数据通过分析器(Analyzer)进行处理,该过程通常包括:
-
字符过滤:去除HTML标签等。
-
分词:将文本切分为词项(Token)。
-
词项过滤:如转为小写、移除停用词等
-
- 查询流程:
-
Query Phase:协调节点将查询请求广播到所有相关分片,各分片独立执行搜索,返回匹配文档的ID和评分。
-
Fetch Phase:协调节点合并排序结果后,向对应分片获取完整文档数据
-
3. 段合并与持久化
-
每个分片由多个不可变的段(Segment)组成。写入操作会生成新段,删除操作仅标记
.del文件。 -
后台定期进行段合并,提升查询效率并清理已删除数据。通过事务日志(Translog)保证操作可靠性
🚀 三、核心配置步骤
1. 环境准备与安装
-
安装Java:ES 依赖 Java 环境,需预先安装 JDK 8 或以上版本
-
下载安装包:从 Elastic 官网下载对应系统的安装包
-
安装:例如在 Linux 系统上,可使用
yum localinstall -y elasticsearch-6.8.1.rpm命令进行安装
2. 关键配置文件 (elasticsearch.yml)
以下为关键配置项示例:
# 集群与节点标识 cluster.name: my-prod-cluster # 集群名称,同一集群内节点需一致 node.name: data-node-1 # 节点唯一名称 # 网络设置 network.host: 0.0.0.0 # 监听所有网络接口 http.port: 9200 # REST API 端口 # 节点角色定义 (ES 7.x+) node.roles: [data, ingest] # 指定节点角色,如数据节点、采集节点等 # 集群发现与组建 discovery.seed_hosts: ["node1:9300", "node2:9300"] # 种子节点列表,用于节点发现 cluster.initial_master_nodes: ["node1", "node2"] # 初始主合格节点,用于集群启动时的主节点选举 # 数据与日志路径 path.data: /opt/es-data # 数据存储目录(建议使用SSD) path.logs: /var/log/es-logs # 日志存储目录
3. 系统与 JVM 优化
-
JVM 设置 (
jvm.options):-
设置堆内存:
-Xms16g -Xmx16g(建议不超过物理内存的50%,且一般不超过32GB以避免GC停顿过长) -
垃圾回收器:使用 G1 GC:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
-
-
操作系统调优:
-
增加最大文件描述符限制。
-
调整虚拟内存映射数量:
vm.max_map_count=262144
-
💡 四、最佳实践与常见配置策略
|
场景 |
分片策略 |
优化建议 |
|---|---|---|
|
日志分析 |
按时间滚动创建索引(如日索引),分片数固定(如3-5个) |
利用 ILM (索引生命周期管理) 将冷数据迁移到成本更低的存储 |
|
电商搜索 |
主分片数 ≈ 数据节点数 × 1.5,单分片大小建议在30-50GB |
避免查询倾斜;读多时可增加副本数 |
|
高可用性 |
至少配置1个副本,跨机架或可用区部署 |
防止单点故障,保证数据可靠性 |
写入优化技巧:
-
使用批量写入(Bulk API),单批次建议5–15MB
-
调整刷新间隔:
index.refresh_interval: 30s可减少段生成频率,提升写入吞吐
查询优化技巧:
-
避免深分页查询,改用
search_after或Scroll API -
对不参与评分的过滤条件使用
filter子句,可利用缓存加速
posted on 2025-10-17 15:53 Karlkiller 阅读(14) 评论(0) 收藏 举报
浙公网安备 33010602011771号