网络层
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 线程
- 线程 线程池 执行ContextPreservingRunnable::run
- AsyncRetentionLeaseSyncTask::run
- indexService.syncRetentionLeases()
- IndexShard::runUnderPrimaryPermit
- IndexShard::syncRetentionLeases
- replicationTracker.getRetentionLeases 获得 索引列表
- 如果索引没有过期RetentionLeaseSyncer::Sync, RetentionLeaseSyncAction::execute,如果索引过期 RetentionLeaseSyncer::BackgroundSync,RetentionLeaseBackgroundSyncAction::execute
- 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 更新集群状态信息。
更新集群状态信息-触发线程任务
- ClusterApplierService::submitStateUpdateTask
- UpdateTask 任务加入 PrioritizedEsThreadPoolExecutor线程池
- Function<ClusterState, ClusterState> updateFunction 生成新集群状态信息
触发条件: - IndicesStore::ShardActiveResponseHandler::allNodesResponded 集群状态版本不是最新的,删除 索引 shardId 数据
- ClusterApplierService::onNewClusterState **
AsyncTrimTranslogTask
- 1 indexService.maybeTrimTranslog()
- 2 IndexShard.trimTranslog()
- 3 Engine.trimUnreferencedTranslogFiles()
- 4 Translog.trimUnreferencedReaders()
集群状态初始化
- elasticsearch.init
- bootstrap.init
- bootstrap.start
- node.start
- coordinator.startInitialJoin
- coordinator.becomeCandidate
集群选举
- Coordinator.electionSchedulerFactory::startElectionScheduler
- ElectionScheduler.scheduleNextElection
- 选举任务加入延迟调度线程池
- 选举任务执行选举,并递归调用ElectionScheduler.scheduleNextElection,选举重复周期不间断
- 选举过程:
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 返回信息的处理
- ChannelHandler::channelRead 信道读取消息
- transport.inboundMessage
- transport 从消息中获得请求requestId
- transport 中 responseHandlers中获得对应的响应处理器
- transport 开启线程 ,使用获得的 响应处理器 处理返回的应答信息
注:** 表示待补充