es 笔记

本文详细探讨了Elasticsearch的网络层处理,包括HTTP和TCP通信,超时处理,数据节点的健康检查,集群状态的更新与选举机制。还涉及了后台同步、备机checkpoint线程、Retention Lease同步以及Translog修剪等核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络层

plugins/transport-nio

  • Node 初始化 ActionModule,NetworkModule, ActionModule 初始化 RestController + ActionHandler , NetworkModule 初始化 NioHttpServerTransport NioTcpTransport 网络层lifecycle ,
  • NioHttpServerTransport 注册es nio网络通道 处理器 HttpReadWriteHandler
  • RestController 注册的patch 上的 RestHandler 处理rest请求
  • NodeClient Map<Action, TransportAction> 处理返回response

action

1.请求超时处理 线程 线程池 执行ContextPreservingRunnable::run

  • TimeoutHandler::run
    public void run() {
    if (responseHandlers.contains(requestId)) {
    long timeoutTime = threadPool.relativeTimeInMillis();
    timeoutInfoHandlers.put(requestId, new TimeoutInfoHolder(node, action, sentTime, timeoutTime));
    // now that we have the information visible via timeoutInfoHandlers, we try to remove the request id
    final Transport.ResponseContext holder = responseHandlers.remove(requestId);
    if (holder != null) {
    assert holder.action().equals(action);
    assert holder.connection().getNode().equals(node);
    holder.handler().handleException(
    new ReceiveTimeoutTransportException(holder.connection().getNode(), holder.action(),
    “request_id [” + requestId + “] timed out after [” + (timeoutTime - sentTime) + “ms]”));
    } else {
    // response was processed, remove timeout info.
    timeoutInfoHandlers.remove(requestId);
    }
    }
    }
    responseHandles 处理器件如果包含请求id,超时处理信息中加入 请求id和 响应环境,如果不包含,超时处理信息中移除这个请求id

- 后台同步 备机checkpoint 线程

  • 1 线程 线程池 执行ContextPreservingRunnable::run
  • 2 AsyncGlobalCheckpointTask::run
  • 3 IndexService::sync()

AsyncRetentionLeaseSyncTask 线程

  1. 线程 线程池 执行ContextPreservingRunnable::run
  2. AsyncRetentionLeaseSyncTask::run
  3. indexService.syncRetentionLeases()
  4. IndexShard::runUnderPrimaryPermit
  5. IndexShard::syncRetentionLeases
  6. replicationTracker.getRetentionLeases 获得 索引列表
  7. 如果索引没有过期RetentionLeaseSyncer::Sync, RetentionLeaseSyncAction::execute,如果索引过期 RetentionLeaseSyncer::BackgroundSync,RetentionLeaseBackgroundSyncAction::execute
  8. TransportReplicationAction::ReroutePhase::run

数据节点探活检测

1.线程池定时调度followerChecker::handleWakeUp

  • transportService::sendRequest
  • TransportService::sendRequestInternal ,responseHandlers存储请求id 和 请求环境参数,超时处理器responseHandler 设置请求id,并触发超时处理进程

更新集群状态信息-调度任务

  • threadPool.scheduleUnlessShuttingDown 周期将任务加入 线程池
    1.1 SubmitReschedulingClusterInfoUpdatedJob 更新集群信息job
    1.2 SubmitReschedulingClusterInfoUpdatedJob::run
    1.3 management 线程池,加入lambda InternalClusterInfoServcie::maybeRefresh任务
    1.4 CountDownLatch 开启 client.admin().cluster().nodesStats
    1.5 CountDownLatch client.admin().indices().stats
    1.6 线程等待两个阻塞任务完成,并将response 更新集群状态信息。

更新集群状态信息-触发线程任务

  1. ClusterApplierService::submitStateUpdateTask
  2. UpdateTask 任务加入 PrioritizedEsThreadPoolExecutor线程池
  3. Function<ClusterState, ClusterState> updateFunction 生成新集群状态信息
    触发条件:
  4. IndicesStore::ShardActiveResponseHandler::allNodesResponded 集群状态版本不是最新的,删除 索引 shardId 数据
  5. ClusterApplierService::onNewClusterState **

AsyncTrimTranslogTask

  • 1 indexService.maybeTrimTranslog()
  • 2 IndexShard.trimTranslog()
  • 3 Engine.trimUnreferencedTranslogFiles()
  • 4 Translog.trimUnreferencedReaders()

集群状态初始化

  1. elasticsearch.init
  2. bootstrap.init
  3. bootstrap.start
  4. node.start
  5. coordinator.startInitialJoin
  6. coordinator.becomeCandidate

集群选举

  1. Coordinator.electionSchedulerFactory::startElectionScheduler
  2. ElectionScheduler.scheduleNextElection
  3. 选举任务加入延迟调度线程池
  4. 选举任务执行选举,并递归调用ElectionScheduler.scheduleNextElection,选举重复周期不间断
  5. 选举过程:
    5.1 A 节点:只有当CANDIDATE 模式节点才参与选举
    5.2 发现peerFinder 发现前驱节点
    5.2 PreVoteCollector 对每个前驱节点发 internal:cluster/request_pre_vote PreVoteRequest 请求
    5.4 B 节点:channel.channelRead 读取消息TcpTransport::messageReceived,消息中获取action ,TcpTransport从注册的RequestHandlerRegistry 中获得请求处理,器,将处理器,请求,信道作为任务参数,提交线程池;
    5.5 从请求中获得请求节点已的前驱节点,并依次做侦测(PeerFinder::startProbe,出去本地节点),并返回连接成功的节点
    5.6 A节点在接收到B节点返回的响应后,PreVoteCollector::handlePreVoteResponse
    5.7 Coordinator::startElection 开始选举,向每个前驱节点发送action:internal:cluster/coordination/start_join StartJoinRequest请求
    5.8 coordinator::handleJoinRequest

tcp 返回信息的处理

  1. ChannelHandler::channelRead 信道读取消息
  2. transport.inboundMessage
  3. transport 从消息中获得请求requestId
  4. transport 中 responseHandlers中获得对应的响应处理器
  5. transport 开启线程 ,使用获得的 响应处理器 处理返回的应答信息
    注:** 表示待补充
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值