我作为实习生的第一个 Ceph 印象
大家好!我叫 Eleanor,今年夏天在 Inktank 为 Ceph 实习。我这个夏天的任务是使用 Ceph API 创建一个无锁的、分布式键值存储,适合存储大量的小型键值对。我刚完成 Pomona College 的一年级学习,主修计算机科学。我之前曾与犹他大学的一位计算机科学教授一起探索过并发性,但这是我第一次接触文件系统,第一次在初创公司工作,也是我第一次参与开源软件项目。在夏天开始的时候,我有些害怕。在第一天,当 Sam 引导我学习如何使用 Github 时,我担心自己力不从心。周围的每个人都自然而然地掌握了许多技能和词汇,而我对此却知之甚少。但 Ceph 团队在我适应的过程中表现得非常热情和支持。
为了熟悉 API,我开始夏天的工作,创建了一个对象映射基准测试工具。Librados 对象是 Ceph 中存储的基本单元。对象具有许多属性
- 名称,
- 数据,
- 扩展属性,其大小受到文件系统限制的约束,以及
- 键和值的对象映射,与扩展属性一样,易于访问,但不受文件系统相关限制的约束。
可以使用对象的名称作为键,使用数据作为值来存储键值对,但对于小值来说,效率低下。由于处理小值效率低下,我正在使用对象映射来实现键值存储。我的工具将可配置数量的键值对写入到可配置数量的 librados 对象的对象映射中,并配置在任何给定时间进行的最大并发操作数。在这个过程中,我学到了很多关于 API、C++ 和 C、Git rebase 以及 Teuthology(我们的测试框架)的知识。
在将我的对象映射基准测试工具上传到主线之后,我开始着手键值存储本身。我首先阅读了几篇以字母 B 开头的论文:B 树、B-link 树、B*-树、BigTables 和 Boxwood。在阅读这些和其他论文之后,我开始编写一个简化的数据结构。对于第一个版本,我只考虑了一个客户端,并使用基于两层 B 树的结构。我使用一个 librados 对象作为树的根,并使用其他 librados 对象来存储特定的键值范围,使用最高的键作为对象的名称。根的对象映射存储一组与其它 librados 对象名称对应的键。在实现和调试这个单客户端版本之后,我开始考虑如何使其安全地供多个客户端并发执行操作。在继续设计和实现这些更改时,Ceph 团队的其他成员仍然会指导我,并在我提出问题时提供建议和反馈,但我对我的设计拥有相当大的自主权。虽然这最初让人感到害怕,但我开始享受这种自由与指导之间的平衡。
随着我对 Ceph 的参与度越来越高,我变得更愿意提出问题。我开始意识到,在 Ceph 开发者中,缺乏经验的尴尬或对回答新手问题感到沮丧等琐碎的问题不能阻碍更重要的目标:开发一个优雅、高效和开放的分布式文件系统。如果说 Ceph 开发者有一个共同的特征,那就是他们对项目的热情。即使在午餐时间,大多数对话也与代码的某些复杂性有关。我与 Ceph 的经验到目前为止一直非常积极,我鼓励其他感兴趣的开发者考虑为 Ceph 做出贡献。这里的人们友好,项目引人入胜,编程非常有价值。
