咱们是如何设计 Rust & 分布式存储教程的? | Talent Plan 背后的故事

做者:沈泰宁 唐刘git

许多人眼中的 PingCAP Talent Plan 可能就是 github.com/pingcap/talent-plan 这个项目,但从内容角度来讲并不完整,这个 Repo 只是线上课程的内容,咱们还有与其配套的线下课程。 本文将从课程设计的角度和你们聊一聊 PingCAP Talent Plan(TiKV 方向)课程,包括课程设计的逻辑、课程设计中遇到的困难,以及你们在学习过程当中常见的问题和解答等。github

PingCAP Talent Plan 是什么?

TiDB 是一个新型的开源分布式关系型数据库,目标是但愿在大数据和云时代的新的业务需求下,帮助你们更好地解决数据大规模存储和实时计算的问题。咱们据说不少同窗跟咱们反映他们很想参与到这些项目中去,但遇到了一些问题:算法

  • 编程语言是参与项目的敲门砖。Golang 和 Rust 都比较新,须要必定的学习,是最直接的高门槛。数据库

  • 理论知识是深度参与的基础。从理论到实践有一道鸿沟,并非这么容易跨越。编程

为了解决上述问题,咱们启动了 PingCAP Talent Plan。目前课程主要分为两个方向,面向 SQL 优化器、分布式计算的 TiDB 方向,和面向大规模、一致性的分布式存储的 TiKV 方向。课程大致分红线上学习阶段和线下学习阶段,线上课程的主要目标是帮助你们从编程语言开始,学习并掌握 Golang 和 Rust,逐步学习关键的理论知识。安全

TiKV 方向课程内容

TiKV 是 TiDB 的分布式存储层,它自己也是一个高性能、可水平扩展、支持分布式事务的 Key-Value 数据库,目前已经成为了 CNCF 的孵化项目。在课程内容的制定上,咱们主要参考了 TiKV 现有的技术栈:网络

  1. Rust 编程语言。TiKV 主要使用 Rust 开发,根据 GitHub 统计,99.5% 的代码是 Rust。咱们选择 Rust 主要看中了它的内存安全和高性能。架构

  2. Raft 一致性算法。Raft 一致性算法主打可理解性,业界也有成熟的实现,TiKV 使用 Raft 算法同步节点之间的状态。并发

  3. Percolator 分布式事务算法。分布式事务是 TiKV 很重要的功能,TiDB 的事务也是基于这个算法改进的。框架

语言真的是门槛吗?

坊间传闻 Rust 学习曲线很是陡峭,「rust steep learning curve」 关键词在 Google 上有超过 70 万条搜索结果。诚然,Rust 有些概念确实比较隐晦,好比 'static lifetime,Sync 和 Send,但它们也仅仅知识隐晦罢了,理解起来并不困难,结合咱们的我的经验来看,在实际编写 Rust 代码过程当中也不多遇到不明因此的编译问题,Rust 编译器对于大部分的错误都提供了详细的解释,咱们只要按照编译器的指导修改代码便可。因此“Rust 学习曲线陡峭”或许是咱们的刻板印象致使的。

纸上得来终觉浅,咱们一致认为学习一门语言的最佳方法就是「动手去写」。为了让你们改变对 Rust 的印象,也为了让新手能有一个平缓的开始,Brian(TiKV 成员,Rust 语言主要开发者)编写了一套手把手的 Rust 教程——Practical Networked Applications in Rust,这个教程的目标是带领你们按部就班地开发一个 KV 存储服务。

  • Tools:Rust 提供了完整周边开发工具,好比包管理工具 - Cargo,代码格式化工具 - rustfmt,代码 linter - clippy,它们将给咱们的开发带来极大帮助。

  • I/O:在这个章节咱们将学习 Rust 中的 I/O 操做,错误处理,比较并使用不一样的 collection 类型。除此以外,还将使用 failure 和 serde 这两个库来构建强健的持久化 KV 存储。

  • Networking:Rust 标准库提供了完整的网络接口,咱们将使用标准库实现 client-server 的持久化 KV 服务,期间将学习 Rust 强大的 trait 系统,logging 和 benchmarking。

  • Concurrency:相信写过并发编程的同窗必定也写过数据竞争 ,在 Rust 中这将不复存在。这个章节咱们将深刻介绍 Sync 和 Send,体验 Rust 的「Fearless Concurrency」。

教程的内容足够深刻,相信你们在完成后能无障碍地使用 Rust 进行平常开发。语言将再也不是门槛问题。

PS:目前课程还在开发中,以后将添加异步章节,教你们使用 Future 进行异步编程。

带你突破两个重要的分布式算法

你们在阅读 TiKV 源码时,若是不了解 Raft 和 Percolator 算法,就很容易迷失方向,不知如何下手。就算了解这两个算法,实操过程当中也有可能出现“知道大致作什么,却不明白为何要这么作”的状况。所以在 Rust 语言课程完成以后,咱们将继续带你们学习这两个重要的分布式算法。

关于 Raft,咱们直接采用 MIT 6.824 课程,并将 Golang 的教材移植到了 Rust。6.824 提供丰富的测试,从 leader 选举一路测到线性一致性。在移植教程的时候,咱们想尽量地使用最简单的代码来实现,方便你们理解课程内容。可是移植过程并不是一路顺风,其中最大困难是 goroutine 的代码。在 Golang 能够随时开启 goroutine 执行异步的代码,可是 Rust 没有相似的功能,考虑再三,咱们最后决定使用 Future 来写这类代码。

在移植完代码后,咱们还验证了代码的正确性,验证 Raft 的测试框架教程的思路也很简单,用一个正确实现了 Raft 的库来跑一遍教程中的考核测试。咱们选择了 github.com/pingcap/raft-rs 这个项目,测试一遍后修复了几个 BUG。不过事实证实只测试一遍是不够的,课程发布后社区小伙伴在学习过程当中,又陆陆续续发现并解决了几个 BUG,在这里特别感谢 @wjhuang 和 @NingLin-P 两位同窗的贡献。

至于 Percolator,因为没有现成的教学课程,咱们决定从零开始设计。好在有一部分能够直接复用 6.824 代码,好比网络框架,它是比较通用的网络测试框架,能够模拟多种常见的网络错误,好比丢包、乱序等。Percolator 的测试也比较丰富,从 TSO 到 lost update 再到 read/write skew 最后到网络错误,都有覆盖。

学完这两个算法后,相信你们能达到“知其然,又知其因此然”的程度,再看 TiKV 代码的时候不会一头雾水。以后咱们还将补充更多内容,好比 multi-raft、集群调度等,终极目标是让你们能够实现一个简易版 TiKV。

**另外值得一提的是,在线下课程中,咱们将着重介绍 TiDB/TiKV 架构,带领你们了解实现原理与细节,还有专门的 Mentor 指导你们深度参与 TiDB/TiKV 开发。**更多的细节已在 这篇文章 中披露,在这就不赘述了。

FAQ

PingCAP Talent Plan 已经成功举办了两期,期间咱们收集了学员的一些问题,在这里挑几个比较有意思的和你们分享一下。

Q1:github.com/pingcap/talent-plan 是如何组织内容的?

A1:talent-plan repo 里面有 3 个文件夹,/tidb 存放着 TiDB 相关实验,/rust 存放 Rust 课程,/dss 存放 Raft 和 Percolator。

Q2:dss 是什么意思?

A2:好问题,可能咱们内部人员都不必定知道。dss 实际上是 Distributed Storage System 的缩写。

Q3:Raft 测试为何会卡住?

A3:大部分状况是在 RPC 的 handler 里面写了会阻塞的代码,受限于 Rust 的 Future 机制,咱们不能 100% 地模拟 goroutine,后台执行 Future 的线程数量是有限的,若是 RPC 会阻塞,并发上来后就会卡住。

Q4:dss 为何会 #[allow(dead_code,unused)]?

A4:这是由于咱们留了一些公开 API 交由学员实现时使用,测试自己不会直接用到,这就致使了 dead code 的误报。这些 allow 咱们是要求学员在提交的做业的时候去掉的。有很多学员没有注意这点而被扣分了。

Q5:dss 需不须要写注释?

A5:须要!不写会扣分。咱们坚信注释是代码的一部分。

关于 PingCAP Talent Plan 的 TiKV 方向的课程暂时就介绍到这里,最后向 MIT 6.824 的工做人员致谢,感谢他们开源了优秀的 Raft 教材。

PingCAP Talent Plan 第三期线下课程 已于昨日开启,咱们来到了华中科技大学开始为期一周的集中授课,以后学员们将前往 PingCAP 北京总部在 Mentor 的带领下继续学习 TiDB/TiKV 相关知识并上手实操,在这里预祝你们顺利结业!

相关文章
相关标签/搜索