跳转至

04. 岗位要求面试问答版速记稿(分布式 / 高可用 / NoSQL / KV)

这份速记稿不是完整教材,而是给面试前快速过一遍用的。

每个点尽量按下面结构整理:

  • 一句话回答:适合先开口
  • 展开 1 分钟:适合正常技术面
  • 高频追问:面试官继续往下挖时能接住

配套正式章节:

  • 05_design_patterns_architecture/04_distributed_systems_load_balancing_high_availability.md
  • 04_database_cache/04_nosql_kv_storage_principles.md

先把这一章的知识骨架搭起来

这份速记稿的定位不是教材,而是把一整套知识压缩成 面试前可快速唤醒记忆的作答提纲。所以它最重要的不是面面俱到,而是让你在被问到某个点时,能立刻想起“先说什么、再补什么、最后怎么收”。

使用方式建议是:先看一句话回答建立开口模板,再看 1 分钟展开确保内容不空,最后看深挖点和易错点,防止被追问时崩掉。它是主笔记的压缩索引,不是替代品。

使用这份速记稿前,先把定位想清楚

这份文档是压缩提纲,不是完整正文。它假设你已经知道这些概念的大框架,现在要做的是在面试前快速恢复“先怎么开口、再怎么展开、最后怎么补边界”的答题顺序。

所以它的正确用法不是第一次学习,而是配合正式章节做最后一轮串联。


一、分布式系统 / 负载均衡 / 高可用 / 容灾

1. 什么是分布式系统?

一句话回答

分布式系统是多个通过网络协作的节点,共同对外提供统一服务能力的系统,核心难点是网络不可靠、节点会部分失败、数据需要跨节点协同。

展开 1 分钟

单机系统里很多问题靠本地函数调用和单机事务就能解决,但分布式系统里,调用变成网络调用,状态变成跨节点状态,故障也从整体挂掉变成部分失败。所以它的难点不是“机器多了”,而是必须处理远程调用成本、一致性、扩展和故障恢复问题。

高频追问

  • 单机和分布式最本质的区别是什么?
  • 为什么说分布式系统的复杂度主要来自网络?

2. 为什么需要服务发现?

一句话回答

服务发现解决的是实例地址动态变化时,调用方如何持续找到可用服务的问题。

展开 1 分钟

在现代服务系统里,实例会扩缩容、重启、漂移、下线,所以 IP 不能写死。服务启动后要注册自己,调用方再从注册中心或本地缓存里拿到实例列表,然后结合负载均衡策略选目标实例。这样调用方和实例生命周期就解耦了。

高频追问

  • 为什么不能写死 IP?
  • 服务发现和负载均衡是什么关系?

3. 什么是负载均衡?

一句话回答

负载均衡是把请求合理分发到多个后端实例上,提升吞吐、提高资源利用率并降低单点故障风险。

展开 1 分钟

如果所有请求只打到一个实例,它会先变成瓶颈,挂了也会直接影响服务。负载均衡的核心价值是把流量分散、把容量用起来,并支持扩容后平滑接流量。它不仅仅是“平均分配”,还要结合实例状态、权重和请求模型做调度。

高频追问

  • 负载均衡策略有哪些?
  • 为什么轮询不一定够用?

4. 常见负载均衡策略有哪些?

一句话回答

常见有轮询、加权轮询、最少连接、一致性哈希,以及基于延迟和健康状态的动态调度。

展开 1 分钟

轮询最简单,但不感知实际负载;加权轮询适合机器规格不同;最少连接适合长连接或请求耗时差异大的场景;一致性哈希适合会话粘性、缓存节点和分片路由;更复杂的线上系统会结合 RT、错误率和健康状态做动态调度。

高频追问

  • 最少连接为什么适合长耗时请求?
  • 一致性哈希为什么适合缓存?

5. 四层和七层负载均衡有什么区别?

一句话回答

四层基于 IP/端口/TCP 转发,性能更高更通用;七层能看懂 HTTP 等应用层内容,路由更灵活但更复杂。

展开 1 分钟

四层更像高效转发流量,适合对协议无感知的场景;七层可以按 Host、Path、Header、Cookie 做路由、灰度、鉴权和限流,更适合 HTTP 服务治理。选型核心是性能诉求和路由灵活性的平衡。

高频追问

  • 七层为什么更适合灰度发布?
  • 四层为什么通常更轻?

6. 什么是高可用?

一句话回答

高可用是指系统在部分节点、部分组件故障时,仍然能够持续提供服务的能力。

展开 1 分钟

高可用并不是保证系统永远不出故障,而是保证出故障后系统不会整体失效。常见手段包括多实例冗余、多副本、健康检查、故障转移、限流、降级、熔断和隔离。核心问题不是“会不会挂”,而是“挂了以后还能不能继续服务”。

高频追问

  • 高可用和高一致性有什么区别?
  • 多副本为什么不能天然保证强一致?

7. 高可用为什么不等于高一致性?

一句话回答

高可用关注的是系统还能否服务,高一致性关注的是多个副本在任意时刻是否看到同一份最新数据,这两个目标在分布式场景下并不天然兼容。

展开 1 分钟

为了提高可用性,系统会做多副本、异步复制和自动切换,但这些机制都会带来一致性窗口。比如主库刚写完,从库还没同步,此时从库继续对外读服务虽然提高了可用性,但可能读到旧数据。所以“系统还能服务”不代表“所有副本此刻完全一致”。

高频追问

  • 主从复制为什么会有不一致窗口?
  • 什么业务可以接受最终一致?

8. 主从复制解决了什么问题?

一句话回答

主从复制主要解决读扩展、故障恢复基础和数据冗余问题,但代价是复制延迟和切换复杂度。

展开 1 分钟

主节点通常负责写,从节点承接读或者作为备用节点。一方面它可以把读流量分散出去,另一方面主节点出问题时可以切换到从节点,提升可用性。但复制不是免费的,会有延迟,从而带来读写不一致窗口,切主时也会有脑裂和追数据问题。

高频追问

  • 主从复制为什么不能直接等于强一致?
  • 切主最难的是什么?

9. 什么是脑裂?

一句话回答

脑裂是由于网络分区或错误判断,多个节点都认为自己是主节点,导致系统出现多个“主”。

展开 1 分钟

脑裂最危险的不是角色混乱本身,而是多个主节点可能同时接收写入,导致数据分叉。后续合并这些写入通常非常困难,所以高可用系统必须非常谨慎地处理主节点判定、仲裁和切换策略。

高频追问

  • 脑裂为什么比普通故障更危险?
  • 常见怎么避免脑裂?

10. CAP 应该怎么理解?

一句话回答

CAP 讨论的是在发生网络分区时,系统无法同时完全保证强一致和高可用,因此必须做取舍。

展开 1 分钟

CAP 不是机械的三选二口诀,它重点讨论网络分区出现时怎么办。这个时候如果你坚持每次读都拿到最新值,可能就要拒绝部分请求;如果你坚持每个请求都快速成功,就可能接受读到旧值。所以 CAP 的核心是理解网络分区下的一致性和可用性权衡。

高频追问

  • 为什么 CAP 不是平时三选二?
  • 最终一致和强一致在业务上怎么选?

11. 什么是最终一致性?

一句话回答

最终一致性允许短时间不一致,但经过同步、重试和收敛后,系统会达到一致状态。

展开 1 分钟

很多业务不要求每个瞬间都完全一致,比如评论数、点赞数、推荐结果、搜索索引。这些场景更关心吞吐和可用性,所以可以接受短暂不一致,只要系统最终能收敛就行。但面试里要补一句:最终一致不是“随便错”,而是要控制不一致窗口,并设计补偿机制。

高频追问

  • 哪些业务适合最终一致?
  • 最终一致通常靠什么手段实现?

12. 为什么重试可能放大故障?

一句话回答

因为下游本来就过载或异常时,重试会把更多请求继续压过去,导致排队更长、超时更多,形成恶性循环。

展开 1 分钟

重试本来是为了提升成功率,但如果下游已经在慢或者半挂,上游超时后继续重试,只会让下游收到更多重复流量,进一步加重资源压力。所以重试必须配合超时控制、最大次数、指数退避、幂等保证和熔断限流一起使用。

高频追问

  • 为什么重试不该无限做?
  • 幂等为什么是重试前提?

13. 限流、熔断、降级、隔离分别解决什么问题?

一句话回答

它们本质上都是在控制故障传播和资源失控:限流控入口、熔断断坏链路、降级保核心功能、隔离防止相互拖垮。

展开 1 分钟

限流防止入口流量直接打穿系统;熔断是在下游明显异常时停止继续压它;降级是在资源不足时优先保核心服务;隔离是把不同依赖、不同优先级业务分开,避免一个坏依赖把整个系统拖死。面试里最好把它们作为一套稳定性体系来回答,而不是四个散点词汇。

高频追问

  • 为什么高并发系统这几个机制要一起出现?
  • 线程池隔离解决的是什么问题?

14. 什么是容灾?和高可用有什么区别?

一句话回答

高可用更偏局部故障下继续服务,容灾更偏重大事故下系统恢复能力,比如机房、可用区或地域级故障。

展开 1 分钟

高可用主要考虑实例、节点、单服务级别的持续服务能力;容灾则考虑更大范围事故,比如整机房断电、地域网络故障。容灾设计通常会谈主备、双活、异地灾备,以及业务能接受的数据丢失和中断时间。

高频追问

  • RPO 和 RTO 是什么?
  • 双活为什么难?

15. RPO 和 RTO 是什么?

一句话回答

RPO 是最多允许丢多少数据,RTO 是最多允许中断多久。

展开 1 分钟

容灾设计不能只说“做得越强越好”,必须由业务目标来反推。比如金融交易系统可能要求极低 RPO 和 RTO,而离线统计系统可以接受更大的恢复窗口。RPO 决定你的数据复制和备份策略,RTO 决定你的切换和恢复方案。

高频追问

  • 哪些技术手段会影响 RPO?
  • 哪些设计会影响 RTO?

16. 双活为什么难?

一句话回答

双活难在两个地方同时承接业务流量时,要持续解决流量路由、多地写入、一致性、冲突处理和故障切换问题。

展开 1 分钟

双活不是简单“部署两套服务”,而是两个地方平时都在工作,这意味着数据不是只在灾难发生时才同步,而是持续协同。最难的点通常是多地写入冲突、同步延迟和故障场景下的状态收敛,所以双活是高可用里很高级的题,不是随便堆机器就能做到。

高频追问

  • 双活和主备最大的区别是什么?
  • 为什么双活很容易引出一致性问题?

二、NoSQL / Key-Value 存储原理

17. 什么是 NoSQL?

一句话回答

NoSQL 是一类不以传统关系模型和复杂 SQL 为核心的数据库系统,更强调灵活模型、扩展性和特定访问模式下的性能。

展开 1 分钟

NoSQL 不是说关系数据库不行,而是很多场景并不需要复杂 join 和强事务,反而更在意高写入吞吐、单 key 查询、水平扩展、灵活 schema。这就催生了 KV、文档、列族、图数据库等不同类型系统。

高频追问

  • NoSQL 和关系数据库最大的区别是什么?
  • NoSQL 一定更适合大数据量吗?

18. 什么是 Key-Value 存储?

一句话回答

Key-Value 存储通过 key 直接访问 value,强调 Put/Get/Delete 这种简单高效的访问模型。

展开 1 分钟

KV 系统不强调复杂关系查询,而是强调按 key 快速读写,因此非常适合缓存、元数据、配置中心、会话存储和很多基础设施场景。它的优势来自访问路径更清晰、数据组织更聚焦,而不是“语法更少”。

高频追问

  • KV 和关系数据库在访问模型上差在哪里?
  • 为什么很多基础设施系统都偏爱 KV?

19. 哈希表型 KV 有什么特点?

一句话回答

哈希表型 KV 单 key 读写很快,但不擅长范围查询和有序扫描。

展开 1 分钟

哈希表通过哈希函数把 key 映射到桶,平均情况下单 key 查询接近 O(1),非常适合内存热点访问。但它的缺点也很明显:不天然有序,范围扫描不友好,扩容和冲突处理也需要额外成本。所以它更适合缓存和精确 key 访问场景。

高频追问

  • 为什么哈希表不适合范围查询?
  • 哈希表型 KV 的热点问题常体现在哪里?

20. B+ 树型 KV 有什么特点?

一句话回答

B+ 树型 KV 按 key 有序组织数据,适合范围查询和稳定读路径,但在高写入场景下随机更新成本更明显。

展开 1 分钟

B+ 树的叶子节点有序,所以做区间扫描、前缀范围、顺序遍历都很自然。它更像读优化结构,适合需要稳定读性能和范围查询的系统。但如果写特别多,页分裂、随机更新和页维护成本会越来越明显。

高频追问

  • B+ 树为什么适合范围查询?
  • 为什么说它更偏读优化结构?

21. 什么是 LSM Tree?

一句话回答

LSM Tree 是一种面向写优化的存储结构,核心思想是把随机写转成顺序写和后台合并。

展开 1 分钟

LSM Tree 的典型路径是:先写 WAL,再写 MemTable,MemTable 满后刷成 SSTable,后台再做 Compaction。它的优势在于尽量避免原地随机更新,特别适合高写入场景。代价则是读路径更复杂,需要处理读放大和后台合并资源竞争。

高频追问

  • 为什么 LSM Tree 适合高写入?
  • 它和 B+ 树本质上在权衡什么?

22. WAL、MemTable、SSTable 分别是什么?

一句话回答

WAL 负责崩溃恢复,MemTable 负责承接内存中的最新写入,SSTable 是刷盘后的有序不可变文件。

展开 1 分钟

写入先落 WAL,是为了保证崩溃恢复;同时写入 MemTable,是为了把新数据先放进内存有序结构;MemTable 满后刷成 SSTable,形成磁盘上的有序不可变文件。这个组合让 LSM Tree 可以走顺序写路径,并把原地更新问题转移到后台合并阶段。

高频追问

  • 为什么 SSTable 常设计成不可变?
  • WAL 为什么能帮助恢复?

23. 什么是 Compaction?

一句话回答

Compaction 是把多个 SSTable 合并、清理旧版本和删除标记、重组数据布局的后台过程。

展开 1 分钟

如果没有 Compaction,同一个 key 会散落在很多文件里,读路径会越来越长,删除标记也不会真正清理。所以 Compaction 是 LSM Tree 必不可少的补偿机制。但它本身又会带来写放大、磁盘 IO 压力和资源竞争,这也是 LSM 系统最典型的代价之一。

高频追问

  • 为什么没有 Compaction 系统会越来越慢?
  • 为什么说 Compaction 又重要又贵?

24. 什么是读放大、写放大、空间放大?

一句话回答

读放大是一次读要查更多层,写放大是一次写被内部重复重写,空间放大是系统实际占用空间大于用户可见数据量。

展开 1 分钟

这三个“放大”几乎是存储系统的核心成本维度。LSM Tree 通常用更强的写入能力换取更高的读放大和写放大;如果 compaction 不够激进,空间放大也会更明显。面试里如果能主动从这三类成本看问题,通常会显得比较懂存储系统。

高频追问

  • Bloom Filter 能帮哪种放大?
  • Compaction 会加重哪种放大?

25. Bloom Filter 在 KV 系统里做什么?

一句话回答

Bloom Filter 用来快速判断某个 key 大概率不在某个 SSTable 中,从而减少无效查找。

展开 1 分钟

在 LSM Tree 里,查询一个 key 可能要检查多个层、多个文件。如果每个文件都去读,会很贵。Bloom Filter 可以先快速判断“这个文件里大概率没有这个 key”,这样很多文件就能直接跳过。它的特点是不会漏报存在,但可能误报存在。

高频追问

  • Bloom Filter 为什么适合做“排除”而不是“定位”?
  • 它解决的是读放大还是写放大?

26. B+ 树和 LSM Tree 怎么选?

一句话回答

B+ 树更偏读优化和范围查询,LSM Tree 更偏写优化和顺序写,核心是读写成本平衡不同。

展开 1 分钟

如果业务更强调范围查询、稳定读性能、原地更新可接受,B+ 树更合适;如果业务写特别多、磁盘随机写代价高、能接受 compaction 和更复杂的读路径,LSM Tree 往往更合适。所以它们不是谁先进谁落后,而是不同工作负载下的不同选择。

高频追问

  • 哪类业务更适合 LSM?
  • 哪类业务更适合 B+ 树?

27. 什么是一致性哈希?

一句话回答

一致性哈希是一种分布式路由方法,能在节点增减时尽量减少数据重映射范围。

展开 1 分钟

如果直接 hash(key) % N,当节点数变化时,大量 key 都会重新映射,迁移成本很大。一致性哈希把节点和 key 映射到同一个哈希环上,节点增减时通常只影响局部数据,更适合缓存集群和分布式 KV 分片场景。

高频追问

  • 一致性哈希为什么适合扩缩容?
  • 为什么还要引入虚拟节点?

28. 什么是分片?

一句话回答

分片是把数据拆到多个节点上存储和处理,以突破单机容量和吞吐瓶颈。

展开 1 分钟

常见分片策略包括范围分片、哈希分片和一致性哈希。范围分片有利于范围查询,但容易出现热点;哈希分片更均匀,但不利于范围访问。一致性哈希更适合节点动态变化的集群。分片本质上不是“把数据拆开”这么简单,还要考虑迁移、负载均衡和热点控制。

高频追问

  • 范围分片和哈希分片各自优缺点是什么?
  • 为什么分片后系统更容易遇到热点?

29. 什么是热点问题?

一句话回答

热点问题是指少数 key、少数分片或少数前缀访问量异常集中,导致局部节点先被打满。

展开 1 分钟

在 KV 系统里,一个 key 通常会稳定落到某个节点,所以如果某个 key 特别热,就会把局部节点 CPU、网络或磁盘先打满,系统整体容量看上去还有余量,但局部已经成为瓶颈。常见做法是热 key 拆分、多级缓存、读写分离、热点迁移或限流。

高频追问

  • 为什么 KV 系统特别容易遇到热点?
  • 怎么缓解热 key?

30. KV 系统为什么也要谈一致性?

一句话回答

只要 KV 系统进入多副本和分布式场景,就同样要面对复制延迟、故障切换和写入顺序问题,所以一致性仍然是核心议题。

展开 1 分钟

很多人误以为 KV 系统只追求性能,不谈一致性。其实不是。缓存型 KV、协调型 KV、元数据型 KV 的一致性目标可能完全不同。比如 etcd 更强调强一致和线性化,缓存系统则往往更强调性能和最终一致。所以 KV 是访问模型,不是一致性结论。

高频追问

  • etcd 和 Redis 的一致性目标有什么区别?
  • 为什么同样是 KV,定位可以完全不同?

三、面前 10 分钟极简复盘版

分布式 / 高可用极简版

  • 分布式系统最本质的难点:网络不可靠、节点会部分失败、状态跨节点协同
  • 服务发现:解决实例地址动态变化问题
  • 负载均衡:解决流量分配、容量利用和单点风险
  • 四层 vs 七层:四层更轻,七层更灵活
  • 高可用:故障时还能服务
  • 高一致性:副本视图尽量一致
  • 主从复制:读扩展 + 故障恢复基础,但有复制延迟
  • 脑裂:多个主同时写,最危险的是数据分叉
  • CAP:网络分区时一致性和可用性要取舍
  • 重试会放大故障,必须配合超时、幂等、限流、熔断
  • 容灾看 RPO / RTO
  • 双活难在多地同时写和状态协调

NoSQL / KV 极简版

  • NoSQL 是访问模型和扩展目标不同,不是简单“不要 SQL”
  • KV 强调按 key 高效访问
  • 哈希表型 KV:单 key 快,不擅长范围查询
  • B+ 树型 KV:范围查询强,偏读优化
  • LSM Tree:顺序写强,偏写优化
  • WAL:崩溃恢复
  • MemTable:内存承接新写入
  • SSTable:刷盘后的有序不可变文件
  • Compaction:合并文件、清理旧版本,但会带来写放大
  • Bloom Filter:快速排除“不在这个文件里”的 key
  • 一致性哈希:节点变化时减少数据迁移
  • 分片:扩容手段,但会带来热点和迁移问题

四、最后一份更像面试现场的总括回答

这份岗位要求里,语言之外最重要的两条线,一条是分布式系统和高可用,一条是 NoSQL / Key-Value 存储原理。前者在考我是否理解服务在多节点、网络不可靠、局部故障条件下怎么继续稳定运行;后者在考我是否理解数据在高吞吐、高扩展场景下如何组织读写路径。一个偏系统治理,一个偏底层存储,但本质上都在考工程取舍:为了性能、可用性和扩展性,我们分别付出了哪些一致性、复杂度和资源成本。