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)进行处理,该过程通常包括:

    1. ​字符过滤​:去除HTML标签等。

    2. ​分词​:将文本切分为词项(Token)。

    3. ​词项过滤​:如转为小写、移除停用词等

  • ​查询流程​:
    • ​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_afterScroll API

  • 对不参与评分的过滤条件使用 filter子句,可利用缓存加速

 

 

posted on 2025-10-17 15:53  Karlkiller  阅读(14)  评论(0)    收藏  举报

导航