从零构建向量数据库:更适合 C++ 基架选手体质的校招项目
首先前排声明,本文非广告,仅仅是看到本书(从零构建向量数据库 (豆瓣)),觉得非常适合改编为 C++ 基架选手的校招项目,在此分享给可能需要的同学。
另外还要做个免责声明:本文不构成职业选择建议。
如何丰富简历上的项目经历是校招生老大难的一个问题了,对 C++ 选手尤甚。从上古年度的 Web Server 走天下,到现在的人均 15445、6.824、6.S081,日益激烈的竞争也让一些曾经不错的项目,在当下难以展现出个人亮点。最近本人在看一本书:《从零构建向量数据库》(从零构建向量数据库),觉得非常适合加以改造,作为简历上的一个项目经历,因此分享一下。
这本书介绍了如何使用一些开源的组件,搭建一个分布式向量数据库系统。跟着书上的步骤,完成后的数据库架构图如下所示:
可以看到,完成品是一个包括:VectorDB Server(向量数据库节点)、Master Server(元数据节点)、Proxy Server(代理节点)的符合工业界一般实践的复杂分布式系统。同时,它支持快照与缺陷恢复机制、分片策略、基于 Raft 协议的主从集群、etcd 保证元数据高可用、代理节点实现流量转发、负载均衡和屏蔽后端主从节点变化的细节。可以说,其中涉及到的很多技术都适合进一步深挖,比如:
- RocksDB
- 持久化为什么选用 RocksDB 作为存储引擎?有读过 RocksDB 源码吗?相比 LevelDB 它做了哪些改进?
- 有对 RocksDB 的可配置参数针对向量场景进行调优吗?
- RocksDB 只支持字符串类型,VectorDB 如何支持不同的数据类型并存储在 RocksDB 的?
- Raft
- 介绍下 Raft 协议
- 项目中使用的 NuRaft 有看过源码吗?
- 在项目中如何基于 NuRaft 做主从数据复制的?保证了什么样的一致性(CAP 如何取舍)?
- 分布式系统设计
- 为什么设计了三种不同类型节点?它们分别负责什么工作?
- 后台的 VectorDB 节点有崩溃时,代理节点如何感知到并进行流量转发?
- 如何进行数据分片的?支持哪些分片策略?
- 节点间通信采用了什么协议?为什么选用它,有什么优缺点?
- etcd
- 介绍下 etcd,为什么选用它,它在项目中扮演什么角色?
- 有了解过 etcd 的 Raft 实现吗?相比 NuRaft 存在哪些共性和不同?
- Faiss
- 介绍下 Faiss,为什么项目中使用了它?
- Faiss 的索引是如何进行持久化存储呢?
- Faiss 中有哪些为了提升性能而采用的算法或编码方面的技巧?
- ……
上面就是罗列一些(作为一名混子选手已经汗流浃背了),当然还可以围绕项目进一步展开和深挖,本文就不赘述了,相信不同背景的面试官都会有感兴趣的问题(拷打)。
在书籍提供代码的基础上,我们也可以做进一步的改进与完善,比如说:
- 引入类型系统,支持多种不同的数据类型;
- 提供 SQL 接口,借此了解数据库 SQL Parser + Binder 层如何实现;
- SQL 接口都引入了,不如再加个执行引擎:基于 pull 还是 push 呢?是否能做向量化加速?业界做法是什么呢?可参考 CMU 15721 课程和相关 paper 和开源数据库;
- RocksDB 在项目中仅作 K/V 存储使用,能否替换为自己的实现呢?其他组件是否也可以替换呢?
- 跑个 benchmark,分析下性能瓶颈,如何做优化呢?
- ……
大概列这么多,当然可以做的肯定远不止这些,工作量可能也远超一个校招项目的体量了。
OK,本文到此为止。主要目的还是分享下这本书,对其感兴趣的同学还是推荐阅读下的。理解已有代码后可做进一步的改进和优化,将其改造为一个校招项目,相信在校招生的简历中还是很加分的。