文章转载自分布式存储面试的一点经验,在此做一个记录,为后续自身的学习提供一点方向,便于对相关知识点进行掌握。

如下为原文相关内容,几乎不做任何改动。


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

1. 相关岗位

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

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 的超融合。

2. 考察内容

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

  • 项目经验

  • 基础知识

  • 算法代码

  • 领域知识

  • 系统设计

  • 编程语言

2.1 项目经验

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

  1. 沟通表达:这一条最虚,但一般最重要,因为面试官都会自觉或不自觉的有一个隐形标准:即我以后愿意不愿意跟该候选人共事。这时候问的项目经历可能甚至和面试岗位无关。面对这类考察时,特别注意不要一上来就直接介绍大量实现细节。一个符合认知的回答思路是,按你拿到一个新项目的工作历程来简述(注意一定是简述,因为没人喜欢又臭又长的无病呻吟,时间也不允许。这时候很考察抽象概括能力):项目背景和需求是什么、市面上有什么开源解决方案、我们是如何进行技术选型的、我负责哪一个模块等等。态度上,要不卑不亢,既不要表现出“这都不懂”的傲慢,也不要表现出“您是爸爸”的谄媚,会的就清楚表述,不会的大方说不会即可。

  2. 匹配经验:如果你的经验和面试岗位很匹配,面试官可能会让你迅速介绍一下项目概要后深入某个细节考察。这也是不要在项目介绍阶段用时太长的原因,不然面试官虽然想重点发问,但又不好打断你的介绍。这里的考察点一般会和某个模块的设计思路、性能优化相关。这种问题只需要跟着面试官思路做个简单复盘即可。

  3. 引出其他: 有的面试官问项目,只是为了引出项目可能会涉及到的某些计算机的基础知识,以考察你的求知欲、知识深度等能力。毕竟项目涉及到的知识,一般会了解的比较深入。如果说我只是用过,其他一概不知,多少会有些减分。

2.2 基础知识

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

2.3 算法代码

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

2.4 领域知识

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

2.5 系统设计

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

2.6 编程语言

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

3. 面试流程

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

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

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

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

  1. 期望薪资:现在薪资构成,有无其他 offer,期望薪资总包。期望薪资是个老大难,我也不知道怎么说合适。

  2. 离开原因:公司现在情况如何,为什么要离开,对新公司有什么期望。不要贬损前司,捡一些客观事实陈述即可。

  3. 性格测试:说一件工作中印象最深刻的问题,解决方法,需要提高的地方。也有就是直接问你内向外向、爱好缺点啥的。不卑不亢,别给自己挖坑就行。

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

4. 题目汇总

算是一个附录吧,按分类汇总下详细问题。

4.1 领域知识

  1. GFS 如何保证数据的高可用?遇到错误如何进行重试?

  2. raft 如何实现从 follower 读取?

  3. raft 中大多数节点提交某条日志后,未包含该日志的某个节点能成为 leader 吗?

  4. leveldb 中如果经过多次 compact,底层文件系统产生了很多碎片,WAL 还能保持高效的顺序写性能吗?

  5. raft 论文中 peer 启动的时候是 follower,可以是 candidate 吗?

  6. raft 如何避免惊群效应?

4.2 基础知识

  1. tcp 的三次握手简述

  2. tcp 序号的含义和初始值?是否随机?

  3. socket 编程的几个源语?

  4. tcp listen 对应状态机中什么状态?

  5. 磁盘负载百分之百代表什么?

  6. cpu 负载过高代表什么?

  7. 文件系统 open 函数执行时,背后从上层到底层发生了什么?

  8. 虚拟内存的设计有什么好处?

  9. mmap 共享内存是否破坏了进程间的隔离性?

4.3 系统设计

  1. 设计一个支持用户元信息和用户 Follow 关系的分布式 KV 存储。

  2. 设计一个线程安全的 LRU。

4.4 代码算法

  1. randomset,设计一个支持 random 接口的 set,random 要求以 O(1) 的复杂度等概率的返回一个值

  2. LRU

  3. 链表快排

  4. 链表 k 个一组翻转

  5. 链表 shuffle:Node0->Node1->…->Noden-1,shuffle 成以下:Node0->Noden-1->Node1…

  6. Python 中判断两个 dict 相同?动态语言,类型相同,值相同,可能有环

  7. 使用互斥锁实现一个读写锁

  8. 五只弹钢琴。给定一个无序自然数序列,作为钢琴键的位置,单只手最多可以接触五个连续位置,求弹出该序列所有位置,手的最小移动次数

  9. 将长度为 m 的木棒切为 n 段,有多少种切法?(mn 都是正整数)

4.5 项目相关

  1. 如何定位系统延迟的瓶颈?

  2. 如何降低 GC 对主干流量的影响?

  3. 多副本如何选主?

  4. 多个副本写入如何保证一致性和可靠性?

4.6 编程语言

  1. golang:defer 的开销,如何进行优化?

  2. golang:runtime 是以什么形式存在?库还是二进制?

  3. golang:为什么 goroutine 更为轻量?

  4. golang:channel 如何实现?



[参看]

  1. 分布式存储面试的一点经验