TiKV 源码略读 - Server Start

2023-10-08 09:10
文章标签 源码 server start 略读 tikv

本文主要是介绍TiKV 源码略读 - Server Start,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:alexshen

原文来源: https://tidb.net/blog/97577fd5

这篇文章是上篇文章的继续,上篇文章其实是整个server启动过程中非常小的一部分,文章最后有一个整体流程图,感兴趣的话可以点开进行查看。

TiKV源码略读-Config - 技术文章 / 原理解读 - AskTUG

这次我们的代码略读会基于v4.0.8这个分支开展阅读工作,当阅读完本次代码之后,TiKV就真正运行起来了。TiKV服务启动流程相关的代码肯定拥有更多的逻辑细节,我们会适当忽略一些细节,以便集中在重要的几个模块逻辑上,避免过多的细节迷失方向。

image

主线流程:

和上一篇一样,TiKV启动主要流程我们还是用镂空的图示代表,每一步都会展开讲解。

WXWorkCapture_16177757826863

初始步骤:

初始步骤主要配置日志系统和环境变量检查,没有太多技术细节,也不是我们重点关注的部分,所以我们先跳过。

WXWorkCapture_16177759091910

初始化配置:

这部分的流程其实包含了上一篇文章内容,都是配置信息的读取,检查和对应的设置,不是主要的逻辑代码,所以有几块内容留着空白,等后续再补充。

WXWorkCapture_16177759847086

网络端口冲突检测:

WXWorkCapture_16177760284194

网络地址和端口冲突检测其实非常简单,就是把配置中的地址和端口检查一下可不可用,代码量也不大,直接过。

初始化文件系统:

WXWorkCapture_16177760755766

这段代码主要在store_path下新建了一个LOCK的文件,应该是用来记录和管理锁相关的信息。然后会检查现有的rocksdb文件是否正常,可用磁盘空间是否充足。

初始化Yet another thread pool:

WXWorkCapture_1617776111678

这里调用了一个外部线程池管理库,代码就3行,看着只是配置了prometheus的监控,貌似没有更多实际的代码逻辑。从github项目文件看,也是一个在完善中的库。我们先对yatp有个初步的认识,等具体到项目中再看有没有其他地方用到yatp。

tikv / yatp

初始化加密:

WXWorkCapture_16177762544791

通过配置文件初始化DataKeyManager,代码就一行,很简单。配置的时候会有几个参数需要注意,一个是加密方法EncryptionMethod,包括了明文,AES128,AES192,AES256;还有一个是Master Key,可以通过明文,文件,access-key和secret-key三种方式配置。

WXWorkCapture_1617777816622

初始化raw engine v5.0:

WXWorkCapture_16177779835191

这部分代码是分支换成了master后梳理的内容,当时感觉有点怪,但很明显这部分代码不属于4.0版本,从最近的新分支可以看到这部分代码是5.0的功能。

从代码逻辑上看,这部分代码可以通过config配置,设置当前节点使用本地rocksdb还是raft版本的engine,似乎有大的功能计划,也可能是打算之后废弃init_engines部分的代码,这两部分代码有比较大的重叠部分。

而且raftengine也拉出去变成了一个新的项目库,核心代码会有比较大的变化,很期待。

初始化engines:

WXWorkCapture_16177780412087

TiKV启动流程里的核心代码,第一部分会初始化两个engine:

  • raft_engine存储在raftdb_path目录内,应该是给raft保存信息用的;
  • kv_engine存储在DEFAULT_ROCKSDB_SUB_DIR目录内,是rocksdb所在的地方。

这两个engine会组合在一起保存在engine::Engines里。之后会再初始化一个RaftKV的engine,这个engine的参数不是本地目录,而是一个raft router,可以猜测应该是node之间通信的engine。

初始化GC:

WXWorkCapture_1617778130425

官网只有TiDB的GC相关文档,并没有过多关于TiKV的GC相关的内容。从代码中大致可以看出TiKV的GC可能是用来处理锁的相关事务,这里的悬念我们暂时搁置一下,会在后续文章中详细探究。

初始化servers:

WXWorkCapture_16177796994255

那个红色的框其实和这部分代码关系不大,所以被我移到初始化config的代码块里了,5.0之后这个红框就没有了。

这里根据前面几步初始化的配置,生成了snap manager和raft storage两个管理对象,再生成了server这个对象。

server和SSTimporter,split_check_worker又一起参与到node.start方法中,这时候服务器开始作为tikv分布式系统中的一个节点开始启动,包括启动raft store,连通PD并注册,一些后端的worker开始schedule工作,rocksdb准备工作也开始执行了。

到这步结束,tikv单一节点内部的准备工作都已经完成,就等外部数据请求接入开始工作了。

注册services:

WXWorkCapture_16177799262928

这里主要注册了import,debug,diagnostic,deadlock,backup,cdc等一系列gRPC服务,这些服务会在下一步启动TiKV时候一一执行。

启动TiKV:

WXWorkCapture_16177802396367

这里是启动的最后一步,首先执行上一步注册的services,然后开始运行snap worker,并开始监听gRPC端口,最后输出“TiKV is ready to serve”的日志,标志TiKV正式启动成功!

之后还有一些监控指标的配置和等待结束信号的代码,这里就不细细描述了,有兴趣的小伙伴可以直接翻阅tikv的代码,相信剩下的部分应该不是难事。

整体架构图:

WXWorkCapture_16177802792601

这篇关于TiKV 源码略读 - Server Start的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164213

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试,然后在测试中遇到了一些问题,去寻找CTS源码(/cts/tests/tests/location/src/android/locat

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

Oracle Start With关键字

Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, 有一种比较常见得 设计模式, 层级结构 设计模式, 具体到 Oracle table中, 字段特点如下: ID, DSC, PID; 三个字段, 分别表示 当前标识的 ID(主键), DSC 当

red5-server源码

red5-server源码:https://github.com/Red5/red5-server