版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

简介TiKV启动的主要流程,包括初始化配置-网络端口冲突检测-初始化文件系统-初始化Yet another thread pool-初始化加密-初始化raw engine v5.0-初始化engines-初始化GC-初始化Servers-初始化Services,最后启动TiKV。

时间隔的有点久,可以回顾一下上次的文章。上篇文章其实是整个server启动过程中非常小的一部分,文章最后有一个整体流程图可以点开看到左上角那一个黑点就是。

Jinn Jin:TiKV源码略读-Config​

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

主线流程:

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

初始步骤:

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

初始化配置:

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

网络端口冲突检测:

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

初始化文件系统:

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

初始化Yet another thread pool:

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

tikv/yatp: Yet another thread pool in rust for both callbacks or futures. (github.com)

初始化加密:

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

pub enum EncryptionMethod {Unknown = 0,Plaintext = 1,Aes128Ctr = 2,Aes192Ctr = 3,Aes256Ctr = 4,
}pub enum MasterKeyConfig {// Store encryption metadata as plaintext. Data still get encrypted. Not allowed to use if// encryption is enabled. (i.e. when encryption_config.method != Plaintext).Plaintext,// Pass master key from a file, with key encoded as a readable hex string. The file should end// with newline.#[serde(rename_all = "kebab-case")]File {#[serde(flatten)]config: FileConfig,},#[serde(rename_all = "kebab-case")]Kms {#[serde(flatten)]config: KmsConfig,},
}

初始化raw engine v5.0:

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

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

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

初始化engines:

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:

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

初始化servers:

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

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

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

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

注册services:

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

启动TiKV:

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

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

下一篇文章打算弄一个最小版本的key-value单机数据库,能够接受gRPC的请求,有点类似talent plan,不过会用rust直接上手。

Talent Plan

整体架构图:

对TiKV感兴趣的同学也可以来看看我们组其他小伙伴(就是封面上的帅哥靓妹们)写的学习笔记,喜欢的话可以点个赞:

数据库实战踩坑指南1:取前N项,需要WITH TIES

TiDB源码学习笔记:制定计划

TiDB源码学习笔记:执行计划

神州数码云基地

TiKV源码略读-Server Start相关推荐

  1. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  2. TiKV 源码解析系列 - Raft 的优化

    这篇文章转载TiDB大牛 唐刘 的博客:https://mp.weixin.qq.com/s?__biz=MzI3NDIxNTQyOQ==&mid=2247484544&idx=1&a ...

  3. C# Winform点餐系统(源码+SQL Server 2008 R2)

    点击查看:C# Winform点餐系统(源码+SQL Server 2008 R2) 文件大小:5M 操作系统:Windows10旗舰版 开发工具:VS2019.SQL2008R2 开发语言:.cs

  4. TiKV 源码解析系列 ——Placement Driver

    本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析.目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中. TiK ...

  5. muduo源码client/server通信流程

    今天来学习一下muduo源码中client和server间的大致通信流程,以echo服务为例,先看一下echo对面的main函数代码. #include "examples/simple/e ...

  6. Tomcat源码分析——server.xml文件的加载

    前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...

  7. Tomcat7.0源码分析——server.xml文件的加载与解析

    前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析进行分析. 加载过程分析 Bootst ...

  8. 【iOS开发-ARC实现-源码略读】

    文章目录 前言 简单了解Clang 和 llvm 关于查看Clang编译的源代码 __strong **`objc_opt_new`** **`objc_storeStrong`** isa指针 ** ...

  9. concurrentHashMap源码略读

    由于项目中常用的集合是hashMap和conCurrentHashMap,hashMap的源码之前已经写过  ,今天看下conCurrentHashMap的存取和两者之间的一些比较.     conC ...

最新文章

  1. VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)
  2. 转:【AI每日播报】从TensorFlow到Theano:横向对比七大深度学习框架
  3. pytorch 半精度,提升pytorch推理性能
  4. MAVEN项目线上发布出现的问题之一
  5. Simhash 网页重复
  6. (Java多线程)多线程原理和使用
  7. 【深度学习】这千层transformer让我目瞪口呆
  8. 【ESSD技术解读】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?
  9. GBDT和LR结合使用分析
  10. 弹簧触摸开关原理图_10年老电工经验之谈:常见的开关电源那些事儿
  11. telnet入侵linux,教你入侵RedHatLinux
  12. 如何使用WordPress搭建网站
  13. mysql用户和权限管理总结_【转】mysql 用户及权限管理 小结
  14. 生产企业ERP流程是什么
  15. Poi 、Jacob 统计word文档字数实现方式
  16. js基础-点击切换div背景颜色
  17. 遗传算法java(中国外运杯)
  18. 各大手机厂商快应用入口
  19. 仿京东收货地址三级联动
  20. 微信无法下载文件如何做提示跳转到浏览器

热门文章

  1. 创意高科技-----服装打印机
  2. 论文阅读 (68):Self-Contrastive Learning: An Efficient Supervised Contrastive Framework with Single...
  3. c++实现医院检验科排班程序
  4. AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)
  5. 中兴手机怎么与计算机连接网络,中兴v5怎么连接电脑?中兴v5怎么打开usb调试?...
  6. 诺基亚301支持java评测_功能机中的拍照王 诺基亚301单卡版评测
  7. ibm服务器的系统安装配置,IBM_BladeCenter服务器安装配置手册.pdf
  8. php ci框架开发手册下载,php敏捷开发codeigniter框架-CodeIgniter教程(中文手册)pdf格式免费完整版-东坡下载...
  9. 二极管A7与M7的区别
  10. 用Python实现自制桌面宠物,变出一个桌面小挂件