前一段时间由于一些原因工作变动,面了一些分布式存储的相关岗位,感觉市面上相关经验分享较少,因此拿出来和大家分享一下。由于公司隐私政策问题,不会按公司对题目进行罗列,仅仅就一些面试的方向和内容进行简单梳理。水平经验所限,谬误之处,可以留言交流指正。

相关岗位

分布式存储方向的岗位涵盖甚广,一般可以按照方向分为:

  1. 分布式文件存储
  2. 对象存储
  3. 分布式 KV or 缓存
  4. 分布式数据库(new sql)
  5. 表格存储
  6. 块存储

其定位方向也稍有不同:

分布式文件存储。支持 POSIX 语义或者裁剪 POSIX。可以作为存储和计算分离的存储基座,也可以直接为应用所用,比如说深度学习的一些训练,大数据处理的一些中间存储。常见产品有盘古文件系统、Polarfs、JuiceFS 等。

对象存储。一般是存储图片和视频之类的非结构化数据,通常兼容亚马逊的 S3 接口。常见产品如 Amazon S3、阿里云 OSS、腾讯云 COS。

分布式 KV or 缓存。通常兼容 redis 接口,或者更简化 KV 接口。一般求快,基于内存或者SSD,甚至可持久化内存等新硬件。用于低延迟需求的业务缓存或者存储计算分离系统的底座。产品如字节的 ABase、阿里云的 Tair、PingCAP 的 TiKV。

分布式数据库(or new sql)。通常提供 SQL 接口以及无限水平扩展能力。常见产品有 PingCAP 的 TiDB、阿里云的 PolarDB、腾讯云的 TDSQL。

表格存储。经典的接口可以参考按列存储的 HBase,大数据领域应用比较多。产品如 HBase,字节的 ByteTable。

块存储。提供块设备接口,一般用于云主机的系统盘。产品如 smartX 的超融合。

考察内容

分布式存储的面试考察一般分为几块:

  1. 项目经验
  2. 基础知识
  3. 算法代码
  4. 领域知识
  5. 系统设计
  6. 编程语言

项目经验。如果项目经验匹配的话,对其他方面要求就会相对降低一些,但项目本身会考察的很细致。每个面试官聊项目的切入点可能不太一样,但一定是带有某种考察目的,按目的可以粗分为以下几种类型:

  1. 沟通表达。这一条最虚,但一般最重要,因为面试官都会自觉或不自觉的有一个隐形标准:即我以后愿意不愿意跟该候选人共事。这时候问的项目经历可能甚至和面试岗位无关。面对这类考察时,特别注意不要一上来就直接介绍大量实现细节。一个符合认知的回答思路是,按你拿到一个新项目的工作历程来简述(注意一定是简述,因为没人喜欢又臭又长的无病呻吟,时间也不允许。这时候很考察抽象概括能力):项目背景和需求是什么、市面上有什么开源解决方案、我们是如何进行技术选型的、我负责哪一个模块等等。态度上,要不卑不亢,既不要表现出“这都不懂”的傲慢,也不要表现出“您是爸爸”的谄媚,会的就清楚表述,不会的大方说不会即可。
  2. 匹配经验。如果你的经验和面试岗位很匹配,面试官可能会让你迅速介绍一下项目概要后深入某个细节考察。这也是不要在项目介绍阶段用时太长的原因,不然面试官虽然想重点发问,但又不好打断你的介绍。这里的考察点一般会和某个模块的设计思路、性能优化相关。这种问题只需要跟着面试官思路做个简单复盘即可。
  3. 引出其他。有的面试官问项目,只是为了引出项目可能会涉及到的某些计算机的基础知识,以考察你的求知欲、知识深度等能力。毕竟项目涉及到的知识,一般会了解的比较深入。如果说我只是用过,其他一概不知,多少会有些减分。

基础知识。由于分布式系统和底层打交道还挺多,为了极致优化性能,会需要很多操作系统、计算机网络的知识。考察的比较多的是 Linux IO 栈、文件系统、进程调度、TCP 协议细节等方面。

算法代码。虽然形式上都表现为做题,但算法和代码考察侧重点还不太一样,算法方向侧重常用算法思路,题目可能会比较新,通常以二分、贪心、分治、搜索甚至动态规划为主;代码方向侧重编程的熟练程度、代码风格等,题目可能会比较老,但是写起来会比较繁琐,通常以链表、二叉树、图为主。LRU 和链表 k 个一组翻转是高频题目。

领域知识。主要是分布式系统和存储方向的经典概念。考的最多的就是共识协议,比如 raft,初阶考察形式就是介绍一下大体概念和基本流程;高阶一点会问如何线性读、如何处理惊群、选举日志要求、选举细节等等。其他的就是一些经典项目和论文,比如 GFS 一些设计细节,比如 LSMtree 的一些 compact 细节。

系统设计。因为也工作几年了,所以会考一些系统的基本设计问题。最常考察的点就是负载均衡、宕机容错、消息队列。比如设计一个高可用、低延迟的分布式 KV 系统;比如设计一个延迟触发的事件(Event )管理系统;比如设计一个线程安全的 LRU 等等。

编程语言。存储方向还是用 C++ 比较多,因此可能会考一些 C++ 的知识点。为什么说可能呢,因为我之前主要用 Go,因此大多面试官不怎么考这一项。但如果考察的话,Go 中最常见的考察点就是其 runtime了,包括 Goroutine MN 调度模型和三色垃圾回收的细节。C++ 我只写过小东西,没有做过大项目,特性懂的也不是很多,这里就不妄言了。

面试流程

面试一般是2~4 面技术面,一面 HR 面。技术面一般分为基础技术面和大佬 behavior 面。

技术面基本是前两三面,其面试官一般是你以后的同事和小 leader ,主要考察内容如上节所述。面试是一个双向选择的过程,而这几个面试官直接决定了你以后的工作幸福度,因此一定也要注意考察他们,看齐性格上否和你合拍、技术上是否能助你进步。

大佬面一般是技术面的最后一面,可能是你所面岗位的部门经理把把关,也可能是其他组的 leader 来交叉面。这一面通常不会问技术细节,考察方式也相对套路化。基本就是问你印象最深刻的一个问题是啥、怎么解决的、你的优点是什么、缺点是什么。主要考察候选者的表达能力、聪明程度、behavior等等,不过一般来说这步不会卡人。

HR 面同样很套路化,一般就是三板斧:

  1. 期望薪资:现在薪资构成,有无其他 offer,期望薪资总包。期望薪资是个老大难,我也不知道怎么说合适。
  2. 离开原因:公司现在情况如何,为什么要离开,对新公司有什么期望。不要贬损前司,捡一些客观事实陈述即可。
  3. 性格测试:说一件工作中印象最深刻的问题,解决方法,需要提高的地方。也有就是直接问你内向外向、爱好缺点啥的。不卑不亢,别给自己挖坑就行。

注意 HR 面的时候可以打听下工作岗位的工作节奏,看是否符合你预期,如果有第三方信息来源那就更好了。此外,还可以通过 HR 加一下之前技术面试官微信,详细了解下以后的工作内容。

题目汇总

算是一个附录吧,按分类汇总下详细问题。设置为付费就是为了好玩,下面链接能完整阅读:https://www.qtmuniao.com/2021/04/17/storage-interview/。

领域知识