自制分布式存储系统入门篇:序章

新的开始

近几年,随着互联网规模的扩大,我们需要处理的数据也变得越来越多;随着机器学习的发展,我们的数据也变得越来越有价值。在这一时代背景下,大规模分布式系统变得越来越重要。遗憾的是,这一领域由于出现的比较晚,相关的学习资料比较少,大家对这一领域的认识和了解都比较有限。我认识的一些名校毕业名企工作的非常优秀的工程师,虽然日常工作中会使用 Hadoop 生态的一些产品,但是对于大规模分布式系统的底层原理的理解也十分有限。

于是我认为,将我有限的知识分享出来,让大家能够对分布式存储系统有一个初步的感性认识,仍然是一件非常有意义的事情,于是便准备开始这样一个系列。

入门篇的目标是实现一个类 Redis 的分布式存储系统,具有以下功能:

  1. 大规模:可以支持数千台机器组成存储集群,读写数据将比较均匀的分布在这些机器上(以下称机器为节点)

  2. 高可用:系统中的每一个节点都有可能发生故障,任意节点发生故障后可以自动进行故障恢复

  3. 磁盘存储:对每一个节点而言,数据会持久化的存储于磁盘上,但是可以使用内存作为热数据的缓存

  4. 采用和 Redis 类似的接口(仅限字符串接口),支持一些除了 Get/Put 以外的高级功能

系统架构

目标系统的架构如系统架构图所示:

系统架构图
Figure 1. 系统架构图

所有的用户请求首先进入 API Server,然后由 API Server 处理系统内部的逻辑。API Server 周期性的与 MetadataServer 同步数据的拓扑信息,例如哪些 DataServer 持有哪些数据,然后将用户的请求转发给对应的 DataServer。DataServer 是数据的真正持有者,服务的真正提供者。DataServer 与 MetadataServer 周期性的进行同步,向 MetadataServer 汇报自己的状态信息,接受 MetadataServer 的控制指令。

内容安排

作为入门篇,这一系列的主线内容是通过边学边练的方式,逐步实现上面提到的系统,但是这个系统的方方面面都会比较简陋,功能并不完善,性能也有待优化。在实现这个系统的每一个小方面时,会先介绍该方面相关的一些基本理论,然后选择其中比较容易实现的一种方式介绍实现细节。具体的内容和顺序大致如下:

  1. 介绍相关背景

  2. 实现一个单机 Key-Value 存储系统,并支持 RPC 调用

  3. 给单机存储系统增加主从备份的功能

  4. 通过数据分片的方式,将单机存储系统扩展到多机存储系统

  5. 增加 API Service 对外隐藏内部实现细节

  6. 增加事务协调以支持 MGET/MSET 指令

  7. 其他功能讨论,如 TTL,Snapshot,备份等等

  8. 如何向全功能的 Redis 演进

  9. K8S 和运维自动化

  10. 如何向 NewSQL 的方向演进

文章中的示例实现采用 C++ 语言最新标准进行描述,这是因为在工业界实现存储系统时 C++ 语言占主导地位。