Elasticsearch 原理与关键流程

一、Elasticsearch 基本原理

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,主要特点包括:

  1. 分布式架构:自动分片数据并在集群中分布
  2. 近实时搜索:数据变更后短时间内即可搜索到
  3. 高可用性:通过副本机制保证数据安全
  4. RESTful API:通过 HTTP 接口进行操作

核心概念:

  • 索引(Index):类似数据库中的表
  • 类型(Type)(7.x后已弃用):原为索引中的逻辑分类
  • 文档(Document):基本数据单元,JSON格式
  • 分片(Shard):索引的水平分割单元
  • 副本(Replica):分片的拷贝,提供高可用

二、文档读写流程

文档写入流程

  1. 客户端请求

    • 客户端发送写入请求到任意节点(协调节点)
  2. 路由确定

    • 协调节点根据文档ID的哈希值确定目标分片
    • 公式:shard = hash(document_id) % number_of_primary_shards
  3. 主分片写入

    • 请求被转发到主分片所在节点
    • 先写入内存缓冲区(Index Buffer)
    • 同时写入事务日志(Translog)以保证持久性
  4. 刷新(Refresh)

    • 默认每1秒或Index Buffer满时触发
    • 将内存中的数据生成新的段(Segment)并打开供搜索
    • 此时数据可被搜索到(近实时)
  5. 刷盘(Flush)

    • 默认每30分钟或Translog太大时触发
    • 将内存中的数据提交到磁盘
    • 清空Translog(生成新的Translog)
  6. 副本同步

    • 主分片将操作并行发送到所有副本分片
    • 所有副本确认后才向客户端返回成功

文档读取流程

  1. 客户端请求

    • 客户端发送查询请求到任意节点(协调节点)
  2. 查询阶段(Query Phase)

    • 协调节点将查询广播到所有相关分片(主或副本)
    • 每个分片本地执行查询并返回匹配文档的ID和排序值
    • 协调节点合并、排序结果集
  3. 取回阶段(Fetch Phase)

    • 协调节点根据结果集中的ID向对应分片获取完整文档
    • 合并后返回给客户端

三、底层删除数据的逻辑

Elasticsearch 的删除操作是特殊的标记删除机制:

  1. 删除标记

    • 删除文档时,不会立即从磁盘移除
    • 而是在.del文件中标记该文档为已删除
  2. 搜索过滤

    • 查询时会检查.del文件,过滤掉已删除文档
  3. 段合并时真正删除

    • 在后台段合并(Segment Merge)过程中
    • 新生成的段不会包含被删除的文档
    • 此时才真正释放磁盘空间
  4. 更新操作的特殊性

    • 更新=删除旧文档+新增新文档
    • 同样遵循上述删除逻辑
  5. 强制删除

    • 通过_forcemerge API可以强制合并段并清理删除
    • POST /index/_forcemerge?only_expunge_deletes=true

四、集群API

集群管理API

  1. 健康检查

    GET /_cluster/health
    GET /_cluster/health/index_name
    
  2. 状态信息

    GET /_cluster/state
    GET /_cluster/stats
    
  3. 节点信息

    GET /_nodes
    GET /_nodes/stats
    
  4. 重新路由

    POST /_cluster/reroute
    {
      "commands": [
        {"move": {"index": "test", "shard": 0, "from_node": "node1", "to_node": "node2"}},
        {"cancel": {"index": "test", "shard": 0, "node": "node1"}}
      ]
    }
    
  5. 设置更新

    PUT /_cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.enable": "all"
      },
      "transient": {
        "indices.recovery.max_bytes_per_sec": "50mb"
      }
    }
    

索引管理API

  1. 创建索引

    PUT /index_name
    {
      "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "field1": { "type": "text" },
          "field2": { "type": "keyword" }
        }
      }
    }
    
  2. 删除索引

    DELETE /index_name
    
  3. 索引设置

    PUT /index_name/_settings
    {
      "index.number_of_replicas": 2
    }
    
  4. 索引别名

    POST /_aliases
    {
      "actions": [
        { "add": { "index": "index1", "alias": "alias1" }},
        { "remove": { "index": "old_index", "alias": "old_alias" }}
      ]
    }
    

监控与维护API

  1. 任务管理

    GET /_tasks
    GET /_tasks?nodes=nodeId1,nodeId2
    
  2. 缓存清理

    POST /index_name/_cache/clear
    
  3. 段信息

    GET /index_name/_segments
    
  4. 强制合并

    POST /index_name/_forcemerge?max_num_segments=1
    
  5. 索引统计

    GET /index_name/_stats
    GET /_stats
    

这些API提供了对Elasticsearch集群的全面控制,从基本的索引管理到高级的集群运维操作。

posted on 2025-03-30 09:08  Leo-Yide  阅读(50)  评论(0)    收藏  举报