往 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. 写入流程的详细步骤
以下是写入流程的详细步骤图示:
复制
客户端 -> 协调节点 -> 主分片 -> 副本分片 -> 主分片 -> 协调节点 -> 客户端
客户端发送请求:
客户端向 Elasticsearch 集群发送写入请求。
协调节点接收请求:
协调节点接收请求并确定目标主分片。
主分片写入数据:
主分片所在的节点写入数据。
副本分片同步数据:
主分片将数据同步到副本分片。
主分片返回响应:
主分片收到所有副本分片的确认后,返回响应。
协调节点返回客户端:
协调节点将响应返回给客户端。
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 写入数据的请求流程!
开启新对话