How to design a distributed database

最近看到了一个问答,觉得特别好,和大家分享下。

从事分布式存储类开发需要哪些知识?

作为一个从事游戏开发5+年,互联网后端做了快4年的人,不想再做业务,想转分布式存储开发的同学,我想问下,需要哪些知识储备,或者说需要看哪些书,有哪些技能才能胜任。看过《redis开发与运维》,《设计数据密集型运用》,视频网课 MIT-6.824 Distributed system class.但是看完这些,自己感觉比较虚,对这些东西的理解也只是停留在表面,不是特别的深入。

基础的计算机知识就不说了,谈谈相关的领域知识。

现在的分布式 KV,分布式数据库基本上都是有通用解的,架构都类似。

存储层目前 LSM Tree 用的比较多,可以看看 Leveldb[1] 的源码学习。

存储层之上是共识层,共识层存在的意义在于通过多副本间数据共识的方式保证存储的可用性。共识层常见的算法是 Raft[2] 和 Paxos[3],可以看看 Raft 和 Paxos 的论文,按照论文的描述实现一下。

再往上数据量大之后,需要对数据进行分片,分布在不同的机器上存储。为了维护数据到其所属的分片的位置,需要路由层。路由层大类有两类,一类是亚马逊的 dynamo[4] 为代表的去中心化路由策略,常用的策略有一致性 hash[5],chord[6]等。另一类是 google 那套 GFS,Bigtable 为代表的,维护一个中心的 meta 信息管理节点,通过查询 meta 节点来获取数据的分布位置。

到这里为止,把存储层+共识层+路由层 拼装起来,就是一个基础的分布式kv。

基于分布式kv,往上再构建事务层。这里可以学习 percolator[7] 的论文,比如 TiDB 用的就是这个。或者 cockrockdb[8] 也有一套基于分布式kv构建事务的策略。

最后在事务层之上,再构建 SQL 层,SQL 层也是一个很大的领域,首先就是语法前段包括把 SQL 语言解析为 AST,可以用 yacc 之类的。后面的还有执行器,优化器。执行器实现可以看看比较传统的比如火山模型[9]等等。

到这里,一个拥有基础功能的分布式数据库就写好了~