分布式存储相关知识点
文章转载自分布式存储面试的一点经验,在此做一个记录,为后续自身的学习提供一点方向,便于对相关知识点进行掌握。
如下为原文相关内容,几乎不做任何改动。
前一段时间由于一些原因工作变动,面了一些分布式存储的相关岗位,感觉市面上相关经验分享较少,因此拿出来和大家分享一下。由于公司隐私政策问题,不会按公司对题目进行罗列,仅仅就一些面试的方向和内容进行简单梳理。水平经验所限,谬误之处,可以留言交流指正。
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 项目经验
如果项目经验匹配的话,对其他方面要求就会相对降低一些,但项目本身会考察的很细致。每个面试官聊项目的切入点可能不太一样,但一定是带有某种考察目的,按目的可以粗分为以下几种类型:
-
沟通表达:这一条最虚,但一般最重要,因为面试官都会自觉或不自觉的有一个隐形标准:即我以后愿意不愿意跟该候选人共事。这时候问的项目经历可能甚至和面试岗位无关。面对这类考察时,特别注意不要一上来就直接介绍大量实现细节。一个符合认知的回答思路是,按你拿到一个新项目的工作历程来简述(注意一定是简述,因为没人喜欢又臭又长的无病呻吟,时间也不允许。这时候很考察抽象概括能力):项目背景和需求是什么、市面上有什么开源解决方案、我们是如何进行技术选型的、我负责哪一个模块等等。态度上,要不卑不亢,既不要表现出“这都不懂”的傲慢,也不要表现出“您是爸爸”的谄媚,会的就清楚表述,不会的大方说不会即可。
-
匹配经验:如果你的经验和面试岗位很匹配,面试官可能会让你迅速介绍一下项目概要后深入某个细节考察。这也是不要在项目介绍阶段用时太长的原因,不然面试官虽然想重点发问,但又不好打断你的介绍。这里的考察点一般会和某个模块的设计思路、性能优化相关。这种问题只需要跟着面试官思路做个简单复盘即可。
-
引出其他: 有的面试官问项目,只是为了引出项目可能会涉及到的某些计算机的基础知识,以考察你的求知欲、知识深度等能力。毕竟项目涉及到的知识,一般会了解的比较深入。如果说我只是用过,其他一概不知,多少会有些减分。
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 面同样很套路化,一般就是三板斧:
-
期望薪资:现在薪资构成,有无其他 offer,期望薪资总包。期望薪资是个老大难,我也不知道怎么说合适。
-
离开原因:公司现在情况如何,为什么要离开,对新公司有什么期望。不要贬损前司,捡一些客观事实陈述即可。
-
性格测试:说一件工作中印象最深刻的问题,解决方法,需要提高的地方。也有就是直接问你内向外向、爱好缺点啥的。不卑不亢,别给自己挖坑就行。
注意 HR 面的时候可以打听下工作岗位的工作节奏,看是否符合你预期,如果有第三方信息来源那就更好了。此外,还可以通过 HR 加一下之前技术面试官微信,详细了解下以后的工作内容。
4. 题目汇总
算是一个附录吧,按分类汇总下详细问题。
4.1 领域知识
-
GFS 如何保证数据的高可用?遇到错误如何进行重试?
-
raft 如何实现从 follower 读取?
-
raft 中大多数节点提交某条日志后,未包含该日志的某个节点能成为 leader 吗?
-
leveldb 中如果经过多次 compact,底层文件系统产生了很多碎片,WAL 还能保持高效的顺序写性能吗?
-
raft 论文中 peer 启动的时候是 follower,可以是 candidate 吗?
-
raft 如何避免惊群效应?
4.2 基础知识
-
tcp 的三次握手简述
-
tcp 序号的含义和初始值?是否随机?
-
socket 编程的几个源语?
-
tcp listen 对应状态机中什么状态?
-
磁盘负载百分之百代表什么?
-
cpu 负载过高代表什么?
-
文件系统 open 函数执行时,背后从上层到底层发生了什么?
-
虚拟内存的设计有什么好处?
-
mmap 共享内存是否破坏了进程间的隔离性?
4.3 系统设计
-
设计一个支持用户元信息和用户 Follow 关系的分布式 KV 存储。
-
设计一个线程安全的 LRU。
4.4 代码算法
-
randomset,设计一个支持 random 接口的 set,random 要求以 O(1) 的复杂度等概率的返回一个值
-
LRU
-
链表快排
-
链表 k 个一组翻转
-
链表 shuffle:Node0->Node1->…->Noden-1,shuffle 成以下:Node0->Noden-1->Node1…
-
Python 中判断两个 dict 相同?动态语言,类型相同,值相同,可能有环
-
使用互斥锁实现一个读写锁
-
五只弹钢琴。给定一个无序自然数序列,作为钢琴键的位置,单只手最多可以接触五个连续位置,求弹出该序列所有位置,手的最小移动次数
-
将长度为 m 的木棒切为 n 段,有多少种切法?(mn 都是正整数)
4.5 项目相关
-
如何定位系统延迟的瓶颈?
-
如何降低 GC 对主干流量的影响?
-
多副本如何选主?
-
多个副本写入如何保证一致性和可靠性?
4.6 编程语言
-
golang:defer 的开销,如何进行优化?
-
golang:runtime 是以什么形式存在?库还是二进制?
-
golang:为什么 goroutine 更为轻量?
-
golang:channel 如何实现?
[参看]