字节跳动运营着全球最大的分布式存储基础设施之一。后端工程师需要理解如何设计能处理极端吞吐量且保证一致性的系统。这道题考察你将日常使用的分布式系统基础知识。
明确需求:读多写少(10:1),低延迟(p99 < 10ms),高可用(99.99%),单Key数据量约1KB。
描述架构:一致性哈希做分区,每分区Leader-based复制,内存优先存储加WAL保证持久性。
解释读路径:最终一致性读可从任意副本的内存缓存响应,强一致性读路由到Leader。
解释写路径:写入分区Leader,Leader追加WAL后复制到Follower,多数确认后响应。
我会设计一个分区复制的内存KV存储。数据通过带虚拟节点的一致性哈希分布到4096个分区,确保均匀分布。每个分区一个Leader两个Follower,使用Raft共识保证强一致性。读路径方面,1000万RPS的读从任意副本的内存哈希表响应——会话数据可容忍略微过期的读,这样负载分散到所有副本。需要强一致性时,客户端路由到Leader并校验读索引与已提交的Raft日志。写路径方面,100万WPS的写先哈希Key找到分区Leader,Leader追加WAL后每1ms批量复制到Follower,多数确认后响应并更新内存。WAL每100ms刷盘到SSD保证持久性。热Key处理(如爆火用户会话)通过独立的热Key缓存层吸收突发流量。集群管理使用etcd支撑的控制器,通过心跳检测节点故障,2秒内触发Leader重选。
清晰分离读路径和写路径——面试官希望看到你独立思考每条路径。
讨论一致性权衡:大多数读用最终一致性来获得大吞吐,按需提供强一致性。
提到热Key处理——TikTok规模下,单个爆火用户可能对某个分区产生不成比例的负载。
一致性哈希对会话查询这样的随机访问负载能更均匀地分布Key。范围分区适合扫描密集型负载,但当某些Key范围更热门时会产生热点。
三节点Raft复制可容忍一个节点故障。WAL确保已确认的写不丢失。节点故障时,Raft组从剩余Follower中选举新Leader,替换节点被拉起后从Leader日志追赶数据。