字節(jié) - 基礎(chǔ)架構(gòu)團(tuán)隊(duì) - KV組 - 一面
1. 自我介紹(實(shí)習(xí),開源,項(xiàng)目)
2. 流程通過后什么時(shí)候可以到崗?能實(shí)習(xí)多久?可以接受base調(diào)整嗎
3. 介紹一下arana-db/kiwi這個(gè)開源項(xiàng)目
4. 你參與這個(gè)項(xiàng)目都做了些什么
5. 你個(gè)人的這個(gè)分布式kv存儲項(xiàng)目是出于興趣做的對吧
6. 行,那我們聊聊你這個(gè)項(xiàng)目,你簡單介紹下項(xiàng)目大概是個(gè)什么架構(gòu),支持了什么能力?(詳細(xì)的講了從存儲層,db層,網(wǎng)絡(luò)層,分布式四個(gè)方面分別說了設(shè)計(jì)實(shí)現(xiàn)和優(yōu)化,大概單方面輸出了十多分鐘)
7. ok,實(shí)現(xiàn)的東西還挺多的,我們一點(diǎn)一點(diǎn)聊聊,你剛才有提到異步寫入對吧,如果某個(gè)時(shí)候流量非常大,內(nèi)存寫到channel非??欤莄hannel到磁盤I/O很慢,這時(shí)候兩端的寫速度不匹配你會怎么處理?(在channel前添加一個(gè)容量大于channel的buffer緩沖區(qū)域,把寫請求速度不一致的時(shí)機(jī)從channel兩端延遲到buffer進(jìn)channel時(shí),在buffer部分實(shí)現(xiàn)速率調(diào)控,保證兩端速度一致,但其實(shí)這里還是會有一個(gè)問題,突然宕掉的話buffer會丟失;大概就是在buffer出口加個(gè)pipeline之類的,面的時(shí)候沒想起來,就沒詳細(xì)說這里的處理)
8. 那你有想到解決數(shù)據(jù)丟失的辦法嗎?(剛開始想WAL,但是如果WAL其實(shí)和直接寫盤沒什么區(qū)別了)
9. 行,你這里還用了布隆過濾器對吧,Bitcask不是一個(gè)全內(nèi)存索引嗎,為什么還要布隆過濾器?(剛開始聽錯(cuò)問題了,說了一遍Bitcask的整體結(jié)構(gòu),然后面試官引導(dǎo)才發(fā)現(xiàn)聽錯(cuò)問題了,然后討論發(fā)現(xiàn)是我想錯(cuò)了,不需要布隆過濾器的效果是一樣的)
10. 行,沒事,那我們接著聊,bitcask剛才提到他是一個(gè)純內(nèi)存索引結(jié)構(gòu)對吧,你想想這個(gè)場景,這里如果我機(jī)器的內(nèi)存很小,存不下所有的索引,你應(yīng)該怎么處理,有想過嗎?(參照操作系統(tǒng)中虛擬存儲器的概念,只加載一部分索引到內(nèi)存中,剩余的放在一個(gè)單獨(dú)的索引log中,如果當(dāng)前內(nèi)存中沒有的話就置換索引log中的下一塊內(nèi)容到內(nèi)存(這里鑄幣了,說如果log中也沒有索引會有額外的I/O開銷))
11. 這里不就可以用到剛才說的布隆過濾器嗎,查之前篩一下。(懂了)
12. 你看過pika對吧,那rocksdb了解嗎(說只了解一點(diǎn)lsm tree的內(nèi)容,沒仔細(xì)看過)
13. 行,那對于Bitcask你覺得他有什么優(yōu)劣勢?(從實(shí)例結(jié)構(gòu),日志結(jié)構(gòu),追加寫順序讀,內(nèi)存索引,merge分別講了一下)
14. 行,我看你db層實(shí)現(xiàn)了redis相關(guān)的數(shù)據(jù)結(jié)構(gòu),你這里用的時(shí)候需要把磁盤里的所有內(nèi)容都拉到內(nèi)存中嗎(以List為例講了一下,LPush之類的是需要加載全量數(shù)據(jù)的)
15. 行,你看過pika怎么做這個(gè)事情的嗎?(沒仔細(xì)看過,講了一下pika把不同數(shù)據(jù)結(jié)構(gòu)分別存在不同塊中(在存儲層將rocksdb存儲劃分為不同區(qū)域存放不同內(nèi)容))
16. 行,我看你分布式實(shí)現(xiàn)用了raft,讀過raft論文嗎?講一講(從Leader選舉,日志復(fù)制,安全性問題(隨機(jī)定時(shí)器破壞公平條件之類的)分別講了一下,然后日志復(fù)制講了點(diǎn)狀態(tài)機(jī)還有從日志到實(shí)際數(shù)據(jù)落實(shí)的過程)
17. (開始少量八股)ok,大致沒有問題,我們聊點(diǎn)別的,我看你主要是golang對吧,那問你個(gè)go的問題吧,GMP的G為什么一定要掛在P上,而不能直接掛在M上?
18. 操作系統(tǒng)中進(jìn)程比線程開銷大主要大在什么地方?
19. ok,那我們做個(gè)題吧。(ez,一個(gè)數(shù)組滿足先遞增后遞減的特性,找到最大值(二分))
20. 反問:
1. 有哪些您覺得需要提升的地方?
2. 后面還有幾輪面試?(1-2輪)
3. 組里主要做什么的?(kv)
---
一共1個(gè)小時(shí)左右,十分鐘后秒約二面
#面經(jīng)#