字节 - 基础架构团队 - KV组 - 一面
1. 自我介绍(实习,开源,项目)
2. 流程通过后什么时候可以到岗?能实习多久?可以接受base调整吗
3. 介绍一下arana-db/kiwi这个开源项目
4. 你参与这个项目都做了些什么
5. 你个人的这个分布式kv存储项目是出于兴趣做的对吧
6. 行,那我们聊聊你这个项目,你简单介绍下项目大概是个什么架构,支持了什么能力?(详细的讲了从存储层,db层,网络层,分布式四个方面分别说了设计实现和优化,大概单方面输出了十多分钟)
7. ok,实现的东西还挺多的,我们一点一点聊聊,你刚才有提到异步写入对吧,如果某个时候流量非常大,内存写到channel非常快,但是channel到磁盘I/O很慢,这时候两端的写速度不匹配你会怎么处理?(在channel前添加一个容量大于channel的buffer缓冲区域,把写请求速度不一致的时机从channel两端延迟到buffer进channel时,在buffer部分实现速率调控,保证两端速度一致,但其实这里还是会有一个问题,突然宕掉的话buffer会丢失;大概就是在buffer出口加个pipeline之类的,面的时候没想起来,就没详细说这里的处理)
8. 那你有想到解决数据丢失的办法吗?(刚开始想WAL,但是如果WAL其实和直接写盘没什么区别了)
9. 行,你这里还用了布隆过滤器对吧,Bitcask不是一个全内存索引吗,为什么还要布隆过滤器?(刚开始听错问题了,说了一遍Bitcask的整体结构,然后面试官引导才发现听错问题了,然后讨论发现是我想错了,不需要布隆过滤器的效果是一样的)
10. 行,没事,那我们接着聊,bitcask刚才提到他是一个纯内存索引结构对吧,你想想这个场景,这里如果我机器的内存很小,存不下所有的索引,你应该怎么处理,有想过吗?(参照操作系统中虚拟存储器的概念,只加载一部分索引到内存中,剩余的放在一个单独的索引log中,如果当前内存中没有的话就置换索引log中的下一块内容到内存(这里铸币了,说如果log中也没有索引会有额外的I/O开销))
11. 这里不就可以用到刚才说的布隆过滤器吗,查之前筛一下。(懂了)
12. 你看过pika对吧,那rocksdb了解吗(说只了解一点lsm tree的内容,没仔细看过)
13. 行,那对于Bitcask你觉得他有什么优劣势?(从实例结构,日志结构,追加写顺序读,内存索引,merge分别讲了一下)
14. 行,我看你db层实现了redis相关的数据结构,你这里用的时候需要把磁盘里的所有内容都拉到内存中吗(以List为例讲了一下,LPush之类的是需要加载全量数据的)
15. 行,你看过pika怎么做这个事情的吗?(没仔细看过,讲了一下pika把不同数据结构分别存在不同块中(在存储层将rocksdb存储划分为不同区域存放不同内容))
16. 行,我看你分布式实现用了raft,读过raft论文吗?讲一讲(从Leader选举,日志复制,安全性问题(随机定时器破坏公平条件之类的)分别讲了一下,然后日志复制讲了点状态机还有从日志到实际数据落实的过程)
17. (开始少量八股)ok,大致没有问题,我们聊点别的,我看你主要是golang对吧,那问你个go的问题吧,GMP的G为什么一定要挂在P上,而不能直接挂在M上?
18. 操作系统中进程比线程开销大主要大在什么地方?
19. ok,那我们做个题吧。(ez,一个数组满足先递增后递减的特性,找到最大值(二分))
20. 反问:
1. 有哪些您觉得需要提升的地方?
2. 后面还有几轮面试?(1-2轮)
3. 组里主要做什么的?(kv)
---
一共1个小时左右,十分钟后秒约二面
#面经#