Elasticsearch写入流程源码解析

本文详细解析了Elasticsearch的写入流程,包括协调节点、主分片和副分片的处理步骤。首先,协调节点进行数据预处理、自动创建索引、路由请求。接着,主分片节点检查写一致性,写入Lucene和Translog,并转发请求给副分片。副分片节点执行类似的操作。整个流程确保了文档在主分片和所有副分片的成功写入。
摘要由CSDN通过智能技术生成

前言

新建、索引和删除请求都是写操作,写单个文档的流程如下:

  1. 客户端向协调节点发送写请求,ES的任意节点都可以作为协调节点(coordinating node)接受请求。
  2. 协调节点使用_routing(默认是文档ID)字段来确定文档属于的分片,通过集群状态中的内容路由表信息获知数据对应分片的主分片的节点,因此请求被转发到主分片节点上。
  3. 主分片执行写操作。如果写入成功,则它将请求并行转发到副分片上,等待返回结果。当所有的副分片都报告成功,主分片将向协调节点报告成功,协调节点再向客户端报告成功。
  4. 在客户端收到成功响应时,意味着写操作已经在主分片和所有副分片都执行完成。

es写详细流程图

下面以不同角色节点执行的任务整体流程进行分析。

协调节点流程

ES中接收并转发请求的节点称为coordinating节点,协调节点负责创建索引、转发请求到主分片节点、等待响应、回复客户端。实现位于TransportBulkAction,其入口是doExecute方法。

数据预处理pipeline请求

数据预处理(ingest)工作通过定义pipeline和processors实现。如果当前节点没有ingest角色,则需要将请求转发给有ingest角色的节点执行。

如果请求中指定了pipeline参数,则先使用相应的pipeline进行处理。否则查看该请求是否符合某个ingest pipeline的pattern,如果符合则执行pipeline中的逻辑。

// TransportBulkAction#doExecute
protected void doExecute(Task task, BulkRequest bulkRequest, ActionListener<BulkResponse> listener) {
	...

	for (DocWriteRequest<?> actionRequest : bulkRequest.requests) {
		// 将IndexRequest和UpdateRequest都封装为IndexRequest,忽略DeleteRequest
        IndexRequest indexRequest = getIndexWriteRequest(actionRequest);
        if (indexRequest != null) {
            // 如果请求中指定了pipeline,则返回pipeline,否则返回null
            String pipeline = indexRequest.getPipeline();
			// 如果请求中没有指定pipeline
            if (pipeline == null) {
                IndexMetaData indexMetaData = indicesMetaData.get(actionRequest.index());
                if (indexMetaData != null) {
                    // 如果index已存在则查询默认定义的pipeline(如果有的话)
                    String defaultPipeline = IndexSettings.DEFAULT_PIPELINE.get(indexMetaData.getSettings());
                    indexRequest.setPipeline(defaultPipeline);
                    if (IngestService.NOOP_PIPELINE_NAME.equals(defaultPipeline) == false) {
                        hasIndexRequestsWithPipelines = true;
                    }
                } else if (indexRequest.index() != null) {
                    // 如果index不存在(并且这是一个合法的请求),则匹配index模板以寻找默认的pipeline
                    List<IndexTemplateMetaData> templates = MetaDataIndexTemplateService.findTemplates(metaData, indexRequest.index());
                    assert (templates != null);
                    String defaultPipeline = IngestService.NOOP_PIPELINE_NAME;
                    // 模板的顺序是按模板IndexTemplateMetaData#order序号倒排,如果找到了defalut_pipeline则终止
                    for (IndexTemplateMetaData template : templates) {
                        final Settings settings = template.settings();
                        if (IndexSettings.DEFAULT_PIPELINE.exists(settings)) {
                            defaultPipeline = IndexSettings.DEFAULT_PIPELINE.get(settings);
                            break;
                        }
                    }
                    indexRequest.setPipeline(defaultPipeline);
                    if (IngestService.NOOP_PIPELINE_NAME.equals(defaultPipeline) == false) {
                        hasIndexRequestsWithPipelines = true;
                    }
                }
            } else if (IngestService.NOOP_PIPELINE_NAME.equals(pipeline) == false) {
                hasIndexRequestsWithPipelines = true;
            }
        }
    }
// 检查是否指定了 Pipeline 操作
if (hasIndexRequestsWithPipelines) {
    // 该方法(doExecute)将会被再次调用,除了来自协调节点更新过的bulk请求,
	// 以及除了每个带有IngestService.NOOP_PIPELINE_NAME的请求。
    // 这确保了当第二次通过此方法时,该代码路径将不会生效。
    try {
        if (clusterService.localNode().isIngestNode()) {
			// 如果本节点就是协调节点,则使用相应的pipeline进行处理
            processBulkIndexIngestRequest(task, bulkRequest, listener);
        } else {
			// 如果本节点不是协调节点,则随机地转发给任一协调节点进行处理
            ingestForwarder.forwardIngestRequest(BulkAction.INSTANCE, bulkRequest, listener);
        }
    } catch (Exception e) {
        listener.on
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值