从零实现 KV 和分布式 KV 有什么区别?

在众望所归之下,前两天终于出了一个全新的课程《从零实现分布式 KV》,大家的学习热情都非常高涨,其中有很多同学都问到了一个共同的问题,那就是这个课程和我之前的《从零实现 KV 存储》有什么区别呢?

这一次就专门给大家解释一下。

其实说起来也比较简单,《从零实现 KV 存储》实现的是一个单机 KV 存储引擎,何为单机?一般指的是在一个 server 上的单个进程里运行的数据库,其主要解决的问题是数据如何存储到持久化存储介质中,比如最常见的磁盘。

所以我们会设计存储到磁盘上的数据会怎么进行组织,磁盘上的文件格式是什么样的,然后会考虑怎么才能够更加高效的从磁盘读取数据,减少磁盘 IO 次数。所以单机存储引擎更加专注于数据存储到磁盘的具体实现方法,并且要尽量保证数据不丢失。

img

常见的单机 KV 存储模型有 B+ 树、LSM 树、Bitcask,使用这些模型实现的单机 KV 引擎有 LevelDB、RocksDB、BoltDB、Badger、Pebble、RoseDB 等等。

那么《从零实现分布式 KV》 课程又实现的什么呢?

分布式 KV,其重点在于分布式。前面说到了,单机 KV 是在一个 server 上运行的,如果这个 server 出现了故障,或者磁盘损坏了导致了数据丢失等情况,那么这个数据库一是不能够响应用户的请求,二是存储在其中的数据有可能损坏,并且如果我们没有备份的话,数据就永远丢失了,会造成比较严重的后果。

所以分布式就能够比较好的解决这个问题,利用最朴素的思想,不要把鸡蛋放在同一个篮子里。既然数据存储在一个 server 上有非常大的问题,那么我们将数据拷贝出来,存储到不同的 server 上不就好了?

这样每个 server 上的一份数据一般叫做一个副本(Replica),如果一个 server 出现了故障,还有其他的数据副本可以继续使用。

但是数据有了多个副本之后,随之而来又带来了新的问题,那就是写数据的时候,应该写到哪个副本里面?还是全部的副本都写一遍?读数据的时候,应该从哪个副本去读?如果副本之间的数据不一致了怎么办?

等等,这些问题抽象出了一个新的概念,那就是共识,即让多个副本之间协调一致,统一对外提供服务,并且保证数据的完整一致性,我们需要一些手段来让多个副本之间达成共识,这一般称之为共识算法,常见的有 Paxos 和 Raft,而我们课程中实现的是 Raft 算法。

img

有了共识算法之后,我们可以在这个基础之上构建分布式、高可用的系统,而课程中实现的是最常见的分布式 KV 系统,每个 server 之上,都会使用 Raft 共识算法来保证多个副本之间的一致性,然后每个 server 本地都会维护一个存储数据的单机 KV,这个单机 KV 一般叫做状态机。

img

常见的分布式 KV 系统有 TiKV、ETCD、FoundationDB 等等。

所以现在大家应该就清楚了,分布式 KV 重点在于分布式算法,以及分布式系统的设计与实现,并且只是用到了单机 KV 来存储本地数据,而存储数据、磁盘数据组织的具体逻辑,是交给了单机 KV 去负责。

这两个课程的学习有先后顺序吗?

这也是问的比较多的问题,实际上并没有先后顺序,所以先学哪个都是可以的,也都能够学懂,彼此都是独立的内容。

最后,感谢大家的支持,希望这个课程能够对大家有所帮助,附上课程链接,想要购买者可查看:

《从零实现 KV 存储》

https://w02agegxg3.feishu.cn/docx/Ktp3dBGl9oHdbOxbjUWcGdSnn3g

《从零实现分布式 KV》

https://av6huf2e1k.feishu.cn/docx/JCssdlgF4oRADcxxLqncPpRCn5b