TiKV 源码解析系列文章(一)序

做者:唐刘git

TiKV 是一个支持事务的分布式 Key-Value 数据库,有不少社区开发者基于 TiKV 来开发本身的应用,譬如 titantidis。尤为是在 TiKV 成为 CNCFSandbox 项目以后,吸引了愈来愈多开发者的目光,不少同窗都想参与到 TiKV 的研发中来。这时候,就会遇到两个比较大的拦路虎:github

  1. Rust 语言:众所周知,TiKV 是使用 Rust 语言来进行开发的,而 Rust 语言的学习难度相对较高,有些人认为其学习曲线大于 C++,因此不少同窗在这一步就直接放弃了。
  2. 文档:最开始 TiKV 是做为 HTAP 数据库 TiDB 的一个底层存储引擎设计并开发出来的,属于内部系统,缺少详细的文档,以致于同窗们不知道 TiKV 是怎么设计的,以及代码为何要这么写。

对于第一个问题,咱们内部正在制做一系列的 Rust 培训课程,由 Rust 做者以及 Rust 社区知名的开发者亲自操刀,预计会在今年第一季度对外发布。但愿经过该课程的学习,你们能快速入门 Rust,使用 Rust 开发本身的应用。算法

而对于第二个问题,咱们会启动 《TiKV 源码解析系列文章》以及 《Deep Dive TiKV 系列文章》计划,在《Deep Dive TiKV 系列文章》中,咱们会详细介绍与解释 TiKV 所使用技术的基本原理,譬如 Raft 协议的说明,以及咱们是如何对 Raft 作扩展和优化的。而 《TiKV 源码解析系列文章》则是会从源码层面给你们抽丝剥茧,让你们知道咱们内部究竟是如何实现的。咱们但愿,经过这两个系列,能让你们对 TiKV 有更深入的理解,再加上 Rust 培训,能让你们很好的参与到 TiKV 的开发中来。数据库

结构

本篇文章是《TiKV 源码解析系列文章》的序篇,会简单的给你们讲一下 TiKV 的基本模块,让你们对这个系统有一个总体的了解。api

要理解 TiKV,只是了解 https://github.com/tikv/tikv 这一个项目是远远不够的,一般,咱们也须要了解不少其余的项目,包括但不限于:框架

在这个系列里面,咱们首先会从 TiKV 使用的周边库开始介绍,而后介绍 TiKV,最后会介绍 PD。下面简单来讲下咱们的一些介绍计划。异步

Storage Engine

TiKV 如今使用 RocksDB 做为底层数据存储方案。在 pingcap/rust-rocksdb 这个库里面,咱们会简单说明 Rust 是如何经过 Foreign Function Interface (FFI) 来跟 C library 进行交互,以及咱们是如何将 RocksDB 的 C API 封装好给 Rust 使用的。分布式

另外,在 pingcap/rocksdb 这个库里面,咱们会详细的介绍咱们本身研发的 Key-Value 分离引擎 - Titan,同时也会让你们知道如何使用 RocksDB 对外提供的接口来构建本身的 engine。函数

Raft

TiKV 使用的是 Raft 一致性协议。为了保证算法的正确性,咱们直接将 etcd 的 Go 实现 port 成了 Rust。在 pingcap/raft-rs,咱们会详细介绍 Raft 的选举,Log 复制,snapshot 这些基本的功能是如何实现的。工具

另外,咱们还会介绍对 Raft 的一些优化,譬如 pre-vote,check quorum 机制,batch 以及 pipeline。

最后,咱们会说明如何去使用这个 Raft 库,这样你们就能在本身的应用里面集成 Raft 了。

gRPC

TiKV 使用的是 gRPC 做为通信框架,咱们直接把 Google C gRPC 库封装在 grpc-rs 这个库里面。咱们会详细告诉你们如何去封装和操做 C gRPC 库,启动一个 gRPC 服务。

另外,咱们还会介绍如何使用 Rust 的 futures-rs 来将异步逻辑变成相似同步的方式来处理,以及如何经过解析 protobuf 文件来生成对应的 API 代码。

最后,咱们会介绍如何基于该库构建一个简单的 gRPC 服务。

Prometheus

TiKV 使用 Prometheus 做为其监控系统, rust-prometheus 这个库是 Prometheus 的 Rust client。在这个库里面,咱们会介绍若是支持不一样的 Prometheus 的数据类型(Coutner,Gauge,Historgram)。

另外,咱们会重点介绍咱们是如何经过使用 Rust 的 Macro 来支持 Prometheus 的 Vector metrics 的。

最后,咱们会介绍如何在本身的项目里面集成 Prometheus client,将本身的 metrics 存到 Prometheus 里面,方便后续分析。

Fail

Fail 是一个错误注入的库。经过这个库,咱们能很方便的在代码的某些地方加上 hook,注入错误,而后在系统运行的时候触发相关的错误,看系统是否稳定。

咱们会详细的介绍 Fail 是如何经过 macro 来注入错误,会告诉你们如何添加本身的 hook,以及在外面进行触发

TiKV

TiKV 是一个很是复杂的系统,这块咱们会重点介绍,主要包括:

  1. Raftstore,该模块里面咱们会介绍 TiKV 如何使用 Raft,如何支持 Multi-Raft。
  2. Storage,该模块里面咱们会介绍 Multiversion concurrency control (MVCC),基于 Percolator 的分布式事务的实现,数据在 engine 里面的存储方式,engine 操做相关的 API 等。
  3. Server,该模块咱们会介绍 TiKV 的 gRPC API,以及不一样函数执行流程。
  4. Coprocessor,该模块咱们会详细介绍 TiKV 是如何处理 TiDB 的下推请求的,如何经过不一样的表达式进行数据读取以及计算的。
  5. PD,该模块咱们会介绍 TiKV 是如何跟 PD 进行交互的。
  6. Import,该模块咱们会介绍 TiKV 如何处理大量数据的导入,以及如何跟 TiDB 数据导入工具 lightning 交互的。
  7. Util,该模块咱们会介绍一些 TiKV 使用的基本功能库。

PD

PD 用来负责整个 TiKV 的调度,咱们会详细的介绍 PD 内部是如何使用 etcd 来进行元数据存取和高可用支持,也会介绍 PD 如何跟 TiKV 交互,如何生成全局的 ID 以及 timestamp。

最后,咱们会详细的介绍 PD 提供的 scheduler,以及不一样的 scheudler 所负责的事情,让你们能经过配置 scheduler 来让系统更加的稳定。

小结

上面简单的介绍了源码解析涉及的模块,还有一些模块譬如 https://github.com/tikv/client-rust 仍在开发中,等完成以后咱们也会进行源码解析。

咱们但愿经过该源码解析系列,能让你们对 TiKV 有一个更深入的理解。固然,TiKV 的源码也是一直在不停的演化,咱们也会尽可能保证文档的及时更新。

最后,欢迎你们参与 TiKV 的开发。

相关文章
相关标签/搜索