往es中写入一条数据的,请求流程

发布于:2025-02-16 ⋅ 阅读:(44) ⋅ 点赞:(0)

往 Elasticsearch(ES) 中写入一条数据的请求流程涉及多个步骤,包括客户端请求、节点处理、数据分片和副本同步等。以下是详细的流程解析。


1. 写入数据的请求流程

1.1 客户端发送请求
  • 客户端(如 Kibana、Logstash 或自定义应用)向 Elasticsearch 集群发送写入请求。

  • 请求格式通常为 HTTP PUT 或 POST 请求,例如:

    bash

    复制

    PUT /my_index/_doc/1
    {
      "field1": "value1",
      "field2": "value2"
    }
1.2 请求到达协调节点
  • Elasticsearch 集群中的任意节点都可以接收请求,接收请求的节点称为 协调节点(Coordinating Node)

  • 协调节点负责处理请求的路由和转发。

1.3 确定主分片
  • 协调节点根据文档的 _id 和索引的分片规则,计算出文档应该写入的 主分片(Primary Shard)

  • 计算公式:

    bash

    复制

    shard = hash(_id) % number_of_primary_shards
1.4 转发请求到主分片
  • 协调节点将写入请求转发到目标主分片所在的 数据节点(Data Node)

1.5 主分片写入数据
  • 主分片所在的节点接收到请求后,将数据写入本地存储(如 Lucene 索引)。

  • 写入成功后,主分片会将数据同步到所有的 副本分片(Replica Shard)

1.6 副本分片同步数据
  • 主分片将数据同步到副本分片所在的节点。

  • 副本分片写入成功后,向主分片发送确认。

1.7 主分片返回响应
  • 主分片收到所有副本分片的确认后,向协调节点返回写入成功的响应。

1.8 协调节点返回客户端
  • 协调节点将写入成功的响应返回给客户端。


2. 写入流程的详细步骤

以下是写入流程的详细步骤图示:

复制

客户端 -> 协调节点 -> 主分片 -> 副本分片 -> 主分片 -> 协调节点 -> 客户端
  1. 客户端发送请求

    • 客户端向 Elasticsearch 集群发送写入请求。

  2. 协调节点接收请求

    • 协调节点接收请求并确定目标主分片。

  3. 主分片写入数据

    • 主分片所在的节点写入数据。

  4. 副本分片同步数据

    • 主分片将数据同步到副本分片。

  5. 主分片返回响应

    • 主分片收到所有副本分片的确认后,返回响应。

  6. 协调节点返回客户端

    • 协调节点将响应返回给客户端。


3. 写入流程的关键点

3.1 分片路由
  • Elasticsearch 使用分片路由算法确定文档应该写入哪个主分片。

  • 默认情况下,使用文档的 _id 进行哈希计算。

3.2 数据一致性
  • Elasticsearch 提供了多种数据一致性级别:

    • quorum:大多数副本分片写入成功(默认)。

    • all:所有副本分片写入成功。

    • one:主分片写入成功。

3.3 写入确认
  • 客户端可以通过 refresh 参数控制写入后的刷新行为:

    • refresh=true:立即刷新索引,使写入的数据可搜索。

    • refresh=wait_for:等待刷新完成后再返回响应。

    • refresh=false:不刷新索引,数据稍后可搜索。


4. 写入流程的示例

以下是一个写入数据的示例:

4.1 客户端请求

bash

复制

PUT /my_index/_doc/1
{
  "field1": "value1",
  "field2": "value2"
}
4.2 协调节点处理
  • 协调节点计算目标主分片,假设为 shard 0

4.3 主分片写入
  • 主分片 shard 0 所在的节点写入数据。

4.4 副本分片同步
  • 主分片将数据同步到副本分片 shard 0 所在的节点。

4.5 返回响应
  • 主分片收到所有副本分片的确认后,返回响应:

    json

    复制

    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }

5. 总结

  • 往 Elasticsearch 中写入数据的流程涉及客户端请求、协调节点路由、主分片写入和副本分片同步。

  • 通过合理配置分片、副本和数据一致性级别,可以优化写入性能和数据可靠性。

  • 理解写入流程的关键点,有助于排查和解决写入问题。

通过以上内容,可以轻松掌握 Elasticsearch 写入数据的请求流程!

开启新对话


网站公告

今日签到

点亮在社区的每一天
去签到