11.4.2 人员成长

1.师兄带师弟

分布式存储系统新人培养周期较长,新人的成长一方面需要靠自己的努力,另一方面更需要有经验的师兄悉心的指导。

OceanBase团队新人加入时,会给每人分配一个具有三年以上大规模分布式存储实践经验的师兄。师兄的主要职责包括:

1)对于新加入的师弟(无论应届生与否),提供各种技术文档,并解惑文档中的问题;

2)与技术负责人协商安排师弟的工作;

3)与师弟沟通代码编写(包括功能实现、bug修复等)的思路;

4)审核师弟的代码并对代码质量负责,确保代码符合部门编码规范;

5)保持代码修改与文档更新的同步并审核师弟文档的正确性及质量。

OceanBase的各种技术文档包括:

1)技术框架文档:介绍OceanBase整体技术架构和各个模块的详细设计;

2)模块接口文档:各个模块之间的接口和一些约定;

3)数据结构文档:OceanBase系统中的核心数据结构,例如ChunkServer模块的SSTable、UpdateServer模块的MemTable、RootServer模块的RootTable;

4)编码规范。

可以看出,师兄主要的职责就是帮助师弟把关设计和编码的质量,帮助师弟打好基础。同时,师兄需要根据师弟的情况安排具有一定挑战性但又在师弟能力范围之内的工作,并解答师弟提出的各种问题。当然,成长靠自己,师弟需要主动利用业余时间学习分布式存储相关理论。

2.架构理论学习

基于互联网的开放性,我们能够很容易获取分布式存储架构相关资料,例如Google File System、Bigtable、Spanner论文、Hadoop系统源代码等。然而,这些论文或者系统仅仅给出一种整体方案,并不会明确给出方案的实现细节以及背后经历的权衡。这就要求我们在架构学习的过程中主动挖掘整体架构背后的设计思想和关键实现细节。

阅读GFS论文时,可以尝试思考如下问题:

1)为什么存储三个副本?而不是两个或者四个?

2)Chunk的大小为何选择64MB?这个选择主要基于哪些考虑?

3)GFS主要支持追加(append)、改写(overwrite)操作比较少。为什么这样设计?如何基于一个仅支持追加操作的文件系统构建分布式表格系统Bigtable?

4)为什么要将数据流和控制流分开?如果不分开,如何实现追加流程?

5)GFS有时会出现重复记录或者补零记录(padding),为什么?

6)租约(Lease)是什么?在GFS起什么作用?它与心跳(heartbeat)有何区别?

7)GFS追加操作过程中如果备副本(Secondary)出现故障,如何处理?如果主副本(Primary)出现故障,如何处理?

8)GFS Master需要存储哪些信息?Master数据结构如何设计?

9)假设服务一千万个文件,每个文件1GB,Master中存储的元数据大概占用多少内存?

10)Master如何实现高可用性?

11)负载的影响因素有哪些?如何计算一台机器的负载值?

12)Master新建chunk时如何选择ChunkServer?如果新机器上线,负载值特别低,如何避免其他ChunkServer同时往这台机器迁移chunk?

13)如果某台ChunkServer报废,GFS如何处理?

14)如果ChunkServer下线后过一会重新上线,GFS如何处理?

15)如何实现分布式文件系统的快照操作?

16)ChunkServer数据结构如何设计?

17)磁盘可能出现“位翻转”错误,ChunkServer如何应对?

18)ChunkServer重启后可能有一些过期的chunk,Master如何能够发现?

阅读Bigtable论文时,可以尝试思考如下问题:

1)GFS可能出现重复记录或者补零记录(padding),Bigtable如何处理这种情况使得对外提供强一致性模型?

2)为什么Bigtable设计成根表(RootTable)、元数据表(MetaTable)、用户表(UserTable)三级结构,而不是两级或者四级结构?

3)读取某一行用户数据,最多需要几次请求?分别是什么?

4)如何保证同一个子表不会被多台机器同时服务?

5)子表在内存中的数据结构如何设计?

6)如何设计SSTable的存储格式?

7)minor、merging、major这三种compaction有什么区别?

8)TabletServer的缓存如何实现?

9)如果TabletServer出现故障,需要将服务迁移到其他机器,这个过程需要排序操作日志。如何实现?

10)如何使得子表迁移过程停服务时间尽量短?

11)子表分裂的流程是怎样的?

12)子表合并的流程是怎样的?

总而言之,学习论文或者开源系统时,将自己想象为系统设计者,对每个设计要点提出质疑,直到找到合理的解释。

当然,更加有效的学习方式是加入类似OceanBase这样的开发团队,通过参与周围同事对每个细节问题的讨论,并应用到实际项目中,能够较快地理解分布式存储理论。