附录二:核心组件
核心服务组件深度解析
1. 负载均衡与反向代理:Nginx
Nginx (发音为 "engine-x") 是一个高性能的开源 HTTP 服务器、反向代理服务器、以及通用的 TCP/UDP 代理服务器。
1.1 Nginx 深度解析
- Q1:这是做什么的?
- 高性能的 HTTP 和反向代理服务器,也是邮件代理服务器。
- Q2:应用场景?
- Web 服务器(提供静态内容)、反向代理、负载均衡(HTTP/TCP/UDP)、缓存、SSL/TLS 终端、API 网关(配合 Lua/OpenResty)。
- Q3:解决传统问题?
- 以其高并发、低资源消耗的特点,解决 Apache 等传统服务器在 C10K 问题上的瓶颈。
-
Q4:优缺点
- 优:性能极高、稳定可靠、配置简单灵活、事件驱动架构。
- 缺:动态内容处理能力弱(需配合 FastCGI/uWSGI),高级功能需第三方模块或 OpenResty。
-
核心原理与特点
- 事件驱动架构 (Event-Driven): Nginx 采用异步非阻塞的事件驱动模型(基于 epoll, kqueue 等 I/O 多路复用技术),能够用较少的 Worker 进程处理大量的并发连接,资源消耗低,性能高。
- Master-Worker 进程模型: 一个 Master 进程负责管理配置文件加载、Worker 进程的启动和管理;多个 Worker 进程负责实际处理客户端请求。
- 模块化设计: 功能通过模块实现,核心非常轻量,可以通过加载不同的模块扩展功能(如 SSL 模块、Rewrite 模块、Proxy 模块、Gzip 模块等)。
- 配置简单灵活: 使用简洁明了的配置文件语法。
- 高性能: 以高并发、低内存消耗著称。
-
主要功能与应用场景 (结合课程案例)
- HTTP 服务器: 直接托管静态文件(HTML, CSS, JS, 图片等),实现动静分离。(课程一、三:加速静态资源访问)
- 反向代理 (Reverse Proxy): 作为后端应用服务器(如 Node.js, Python Flask/Django, Java Tomcat/Spring Boot)的入口,将客户端请求转发给后端应用处理,并返回响应。隐藏后端服务器细节,提供统一入口。
- 负载均衡 (Load Balancing): 将请求分发到后端的多个应用服务器实例,实现水平扩展和高可用。(课程一、三、九:Web 服务器、数据库代理、TiDB SQL 层的负载均衡)
- 常用负载均衡算法:
- 轮询 (Round Robin): 默认算法,按顺序逐一分配。
- 最少连接 (Least Connections): 将请求分配给当前活动连接数最少的服务器。
- IP 哈希 (IP Hash): 根据客户端 IP 地址的哈希值分配,可以保证同一客户端的请求始终定向到同一台服务器(用于 Session 保持)。
- 加权轮询/加权最少连接: 可以为不同性能的服务器设置不同的权重。
- 常用负载均衡算法:
- SSL/TLS 终止 (SSL Termination): Nginx 负责处理 HTTPS 加解密,后端应用只需处理 HTTP 请求,减轻后端服务器负担,简化证书管理。
- HTTP 缓存: 缓存后端服务器的响应内容,加速访问静态或不常变化的内容。
- 压缩 (Gzip/Brotli): 对响应内容进行压缩,减少网络传输量。
- 限流 (Rate Limiting): 限制来自单个 IP 或特定 URL 的请求速率,防止恶意攻击或滥用。(课程二、三:API 入口限流)
- 访问控制: 基于 IP 地址、HTTP Basic Auth 等进行访问控制。
- URL 重写 (Rewrite): 根据规则修改请求 URL。
- API 网关 (配合 Lua/JavaScript/OpenResty): 通过扩展 Nginx,可以实现更复杂的 API 网关功能,如认证、鉴权、请求/响应转换等。(课程一)
-
Nginx vs 其他负载均衡方案
- HAProxy: 另一个高性能的开源负载均衡器,在 TCP 和 HTTP 负载均衡方面非常强大,配置比 Nginx 稍复杂。
- LVS (Linux Virtual Server): 工作在 Linux 内核的四层(传输层)负载均衡器,性能极高,但配置和管理相对复杂。
- 云厂商负载均衡器 (ELB/ALB/NLB, CLB 等): 提供托管服务,弹性伸缩,与云生态集成好,但可能成本更高,灵活性受限。
- 硬件负载均衡器 (F5 BIG-IP, A10): 功能强大,性能高,但成本非常昂贵。
-
关键配置指令与考量
- 核心模块指令:
worker_processes
: Worker 进程数量,通常设置为 CPU 核心数或auto
。worker_connections
: 每个 Worker 进程能处理的最大并发连接数。events { use epoll; }
: 指定事件模型。
- HTTP 模块指令 (
http { ... }
):server { ... }
: 定义一个虚拟主机。listen
: 监听端口。server_name
: 虚拟主机名。location /path { ... }
: 配置特定 URL 路径的处理规则。root
/alias
: 指定静态文件根目录。index
: 默认索引文件。proxy_pass http://backend_servers;
: 配置反向代理。upstream backend_servers { ... }
: 定义后端服务器组,用于负载均衡。server backend1.example.com weight=3;
: 在 upstream 中定义服务器及权重。ssl_certificate
,ssl_certificate_key
: 配置 SSL 证书。gzip on;
: 开启 Gzip 压缩。limit_req_zone
,limit_req
: 配置限流。
- 健康检查: 配置
upstream
块中的server
指令参数(如max_fails
,fail_timeout
)或使用health_check
指令 (Nginx Plus 或第三方模块) 来自动剔除故障后端服务器。 - 高可用: 通常结合 Keepalived 使用虚拟 IP (VIP) 实现 Nginx 自身的高可用。
- 核心模块指令:
Nginx 凭借其高性能、稳定性和丰富的功能,成为现代 Web 架构中不可或缺的前端代理和负载均衡解决方案。
2. 服务网关:API Gateway
API 网关是位于客户端和后端服务(尤其是在微服务架构中)之间的一个服务器或服务集群,作为所有 API 请求的统一入口点。
2.1 API Gateway 概念解析
- Q1:这是做什么的?
- 作为后端服务的统一入口,处理 API 请求路由、协议转换、聚合以及通用横切关注点。
- Q2:应用场景?
- 微服务架构的入口、移动端/Web 端 API 统一接入、第三方开放平台 API。
- Q3:解决传统问题?
- 简化客户端与后端微服务的交互复杂性,统一处理认证、限流、监控等通用逻辑。
-
Q4:优缺点
- 优:解耦客户端与后端、集中处理通用逻辑、简化后端服务。
- 缺:可能成为性能瓶颈和单点故障,需要额外的开发和运维成本。
-
核心原理与特点
- 统一入口 (Single Entry Point): 客户端只需要与 API 网关交互,无需知道后端服务的具体地址和协议细节。
- 请求路由 (Request Routing): 根据请求的 URL、HTTP 方法、Header 等信息,将请求转发到正确的后端微服务实例。
- 协议转换 (Protocol Translation): 可以将外部客户端使用的协议(如 HTTP/REST)转换为内部服务使用的协议(如 RPC/gRPC),反之亦然。
- 聚合与编排 (Aggregation & Orchestration): (可选) 网关可以聚合来自多个微服务的响应数据,或者编排对多个微服务的调用,以简化客户端逻辑(类似 BFF 模式)。
- 横切关注点处理 (Cross-Cutting Concerns): 将一些通用的功能(如认证、授权、限流、熔断、日志、监控、缓存、安全防护等)集中在网关层处理,避免每个微服务重复实现。
- API 生命周期管理: 提供 API 版本控制、发布、文档生成等功能。
-
常见应用场景 (结合课程案例)
- 微服务架构入口: 作为所有外部请求(来自 Web 端、移动 App、第三方应用)访问后端微服务的统一入口。(课程一:拆分微服务后的必要组件;课程二、三、五、七 等涉及微服务架构的场景)
- 认证与鉴权: 在网关层统一进行用户身份认证(如校验 JWT Token)和权限校验,只有合法的请求才能到达后端服务。(课程一、二)
- 流量控制与安全防护:
- 限流 (Rate Limiting): 防止恶意攻击或个别用户滥用资源。(课程二、三)
- 熔断 (Circuit Breaking): 避免对故障服务的持续调用。(课程四、十一)
- IP 黑白名单/WAF 集成: 基础的安全防护。
- 日志与监控: 集中记录所有 API 请求的日志,收集请求耗时、状态码等指标,方便监控和问题排查。(课程四)
- 协议转换: 例如,外部使用 REST API,内部微服务使用 gRPC 进行通信。
- 灰度发布/金丝雀发布: 网关可以根据规则(如用户 ID、Header)将部分流量导入到新版本的服务实例。
- 静态内容响应/Mock: 对于某些请求(如 OPTIONS 探测、Mock 接口),网关可以直接响应,无需转发到后端。
-
实现技术选型
- 基于 Nginx:
- Nginx + Lua (OpenResty): 非常灵活,性能高,可以通过 Lua 脚本实现复杂的逻辑。
- Nginx 本身的反向代理和负载均衡功能。
- 专用开源网关:
- Kong: 基于 OpenResty,功能丰富,插件化,提供管理 UI 和 API。
- Tyk: Go 语言开发,功能全面。
- APISIX: 基于 OpenResty,高性能,动态、实时、高可用。
- 框架自带网关 (常用于 Java 生态):
- Spring Cloud Gateway: Spring Cloud 生态的第二代网关,基于 Netty 和 Reactor,异步非阻塞,性能好。
- Zuul (1.x/2.x): Netflix 开发的网关,Zuul 1.x 是阻塞式 IO,Zuul 2.x 基于 Netty 改进为异步非阻塞。
- 云厂商 API 网关服务:
- AWS API Gateway, Azure API Management, Google Cloud API Gateway: 提供托管服务,弹性伸缩,与云生态集成紧密,按量付费。
- 服务网格 Ingress Gateway (如 Istio Gateway): 服务网格通常包含一个 Ingress Gateway 组件,作为外部流量进入网格内部的入口,可以实现网关的部分功能,并与网格内部的流量管理策略协同。(课程十一)
- 基于 Nginx:
-
关键配置与考量
- 高可用: API 网关是关键入口,必须保证高可用。通常需要部署多个实例,并通过负载均衡器 (如 LVS/Keepalived, 云厂商 LB) 实现负载均衡和故障转移。
- 性能与扩展性: 网关自身的性能非常重要。选择基于异步非阻塞 I/O 的网关(如 Nginx, Spring Cloud Gateway, Kong)通常性能更好。需要能够水平扩展。
- 路由规则配置: 如何定义和管理路由规则(静态配置文件 vs 动态配置中心)。
- 插件/过滤器管理: 如何开发、部署和管理用于实现横切关注点的插件或过滤器。
- 可观测性: 网关需要提供详细的日志、指标和追踪信息。
- 安全性: 网关自身的安全加固,防止被攻击。
- 延迟: 网关作为额外的一跳,会引入一定的延迟,需要关注其对整体性能的影响。
API 网关是微服务架构中的关键组件,它简化了客户端交互,统一处理了通用功能,但也可能成为新的性能瓶颈和单点故障风险点,需要仔细设计和运维。
3. 关系型数据库与中间件
3.1 MySQL 深度剖析
- Q1:这是做什么的?
- 最流行的开源关系型数据库管理系统(RDBMS),提供 ACID 事务支持。
- Q2:应用场景?
- Web 应用后端存储(用户、商品、订单等),在线事务处理(OLTP)核心。
- Q3:解决传统问题?
- 提供结构化数据存储、事务一致性、SQL 查询能力,替代简单的文件存储。
-
Q4:优缺点
- 优:成熟稳定、社区庞大、生态完善、ACID 支持。
- 缺:单机性能和容量有限、水平扩展复杂(需分库分表)、对海量数据分析支持较弱。
-
核心架构与机制 (源自附录二/五)
- 设计哲学: 关系型数据库的 ACID 实现典范。
- 关键机制:
- B+树索引: 平衡查询效率与写入成本。
- Undo/Redo Log: 实现事务回滚与崩溃恢复 (WAL)。
- Buffer Pool: 通过内存缓冲池降低磁盘 IO。
- MVCC: 实现可重复读等隔离级别,提高并发性能。
- 演进路线:
- 高可用与读写分离 (源自附录四/五)
- 问题: 单点故障、读性能瓶颈。
- 方案:
- 主从复制 (异步/半同步/MGR)。
- 读写分离中间件 (ProxySQL, ShardingSphere-JDBC)。
- 优缺点:
- 优:提升读性能和可用性,故障切换 (MGR) < 30秒。
- 缺:主从延迟导致数据不一致风险,异步复制可能丢数据,脑裂风险。
- 性能调优建议 (源自附录二/五)
3.2 ShardingSphere
- Q1:这是做什么的?
- Apache 顶级项目,定位为 Database Plus,旨在构建数据库之上的生态系统,提供数据分片、读写分离、分布式事务、数据库治理等能力。
- Q2:应用场景?
- 解决单体数据库性能和容量瓶颈,实现透明的分库分表和读写分离。
- 需要分布式事务支持的场景。
- Q3:解决传统问题?
- 避免在应用层硬编码复杂的分库分表逻辑,提供统一的 SQL 访问入口。
- 简化分布式事务的实现复杂度。
-
Q4:优缺点
- 优:功能丰富、社区活跃、支持多种数据库、对业务代码侵入性低 (JDBC/Proxy 模式)。
- 缺:Proxy 模式有一定性能损耗和额外的运维成本,部分复杂 SQL 支持可能不完善。
-
核心模式
- ShardingSphere-JDBC: 轻量级 Java 类库,在 JDBC 层增强,应用直连数据库。
- ShardingSphere-Proxy: 独立部署的数据库代理,支持异构语言。
- ShardingSphere-Sidecar (规划中): Kubernetes Sidecar 模式。
3.3 ProxySQL
- Q1:这是做什么的?
- 高性能的 MySQL 协议感知代理,提供连接池、读写分离、查询路由、防火墙等功能。
- Q2:应用场景?
- MySQL 读写分离和负载均衡。
- 限制不良 SQL,保护数据库。
- 故障切换(配合 MHA/Orchestrator)。
- Q3:解决传统问题?
- 替代应用层复杂的读写分离逻辑,提供透明的代理。
- 提供比 MySQL 自带连接池更强大的管理能力。
- Q4:优缺点
- 优:性能极高、配置灵活(基于 SQL 配置)、轻量级。
- 缺:本身不提供数据分片能力,高可用需额外组件配合。
3.4 MyCat
- Q1:这是做什么的?
- 国内广泛使用的开源分布式数据库中间件,专注于 MySQL 分库分表。
- Q2:应用场景?
- 大规模 MySQL 集群的分库分表管理。
- Q3:解决传统问题?
- 简化分库分表后的数据路由和管理。
- Q4:优缺点
- 优:社区相对成熟(国内)、支持丰富的路由规则。
- 缺:相比 ShardingSphere 功能迭代较慢,配置相对复杂,性能可能不如 ProxySQL。
3.5 Seata
- Q1:这是做什么的?
- 阿里巴巴开源的分布式事务解决方案,提供高性能且易于使用的分布式事务服务。
- Q2:应用场景?
- 微服务架构下,需要保证跨多个服务(或数据库分片)操作原子性的场景,如跨行转账、订单与库存联动。
- Q3:解决传统问题?
- 解决 2PC 性能差、Saga/TCC 编码复杂的问题,提供对业务低侵入的 AT 模式。
-
Q4:优缺点
- 优:支持多种事务模式 (AT, TCC, Saga, XA)、与 Spring Cloud 等框架集成良好、社区活跃。
- 缺:AT 模式对数据库有一定要求(需支持全局锁),引入了额外的 TC Server 运维成本。
-
核心模式
- AT (Automatic Transaction): 基于 2PC 思想,自动生成补偿 SQL,对业务无侵入。
- TCC (Try-Confirm-Cancel): 业务需实现 Try, Confirm, Cancel 三个接口。
- Saga: 长事务解决方案,将事务拆分为多个本地事务和补偿操作。
- XA: 基于数据库 XA 协议。
3.6 Vitess
- Q1:这是做什么的?
- CNCF 毕业项目,最初由 YouTube 开发,是一个用于部署、扩展和管理大型 MySQL 实例集群的数据库解决方案。它本质上是一个 MySQL 分片中间件,设计为在云环境中运行。
- Q2:应用场景?
- 需要极高扩展性、可用性和在线 DDL 能力的大规模 MySQL 集群(如百万 QPS 级别)。
- 云原生环境下的数据库部署。
- Q3:解决传统问题?
- 提供无缝的 MySQL 水平扩展能力,简化分片管理、连接池、故障切换。
- 支持在线、无锁的 DDL 操作。
-
Q4:优缺点
- 优:极强的扩展性和可用性、成熟的在线 DDL、云原生设计、性能优异。
- 缺:架构复杂,学习和运维成本较高,更适合超大规模场景。
-
核心组件
- VTGate: 轻量级无状态代理,路由查询到正确的 Vttablet。
- VTTablet: 每个 MySQL 实例前的代理,管理查询、连接池、DDL 等。
- VTctld: 集群管理守护进程。
- Topology Service: 存储拓扑元数据 (通常用 etcd/ZooKeeper)。
3.7 TiDB (含 TiKV, TiFlash)
- Q1:这是做什么的?
- 开源的分布式 HTAP(混合事务/分析处理)数据库,兼容 MySQL 协议。
- Q2:应用场景?
- 需要弹性扩展、强一致性、同时支持高并发 OLTP 和实时 OLAP 的场景。
- 替代传统分库分表方案,简化业务开发。
- Q3:解决传统问题?
- 解决 MySQL 水平扩展困难、分库分表带来应用复杂性的问题。
- 解决传统 TP 和 AP 系统分离导致的数据同步延迟问题。
-
Q4:优缺点
- 优:水平扩展、强一致性 (Raft)、HTAP 能力、兼容 MySQL 生态。
- 缺:相比单机 MySQL 部署运维更复杂、资源消耗更大、部分复杂 SQL 优化可能不如成熟 RDBMS。
-
核心架构
- TiDB Server: 无状态 SQL 计算层,负责解析 SQL、生成执行计划。
- TiKV Server: 分布式 Key-Value 存储层(行存),负责存储实际数据,使用 Raft 保证一致性。
- TiFlash: 分布式列存引擎,通过 Raft Learner 实时从 TiKV 同步数据,加速 OLAP 查询。
- PD (Placement Driver): 集群元数据管理和调度中心。
4. NoSQL 数据库与缓存
4.1 Redis 深度解析
- Q1:这是做什么的?
- 高性能的内存数据结构存储系统,支持多种数据类型(String, Hash, List, Set, Sorted Set, Bitmap, HyperLogLog, Stream),常用作缓存、消息队列、分布式锁等。
- Q2:应用场景?
- Web 应用缓存、会话存储、排行榜、计数器、发布/订阅、Feed 流、秒杀库存。
- Q3:解决传统问题?
- 极大提升数据访问速度(相比磁盘数据库快几个数量级),缓解数据库压力。
- 提供丰富的数据结构,简化开发。
-
Q4:优缺点
- 优:极高的读写性能 (单机 10W+ QPS)、丰富的数据结构、原子操作支持。
- 缺:数据存储在内存中,成本较高,容量受限;持久化(RDB/AOF)会影响性能;集群模式下部分命令受限(如跨 slot 事务)。
-
内存管理 (源自附录二/五)
- 渐进式 Rehash: 扩容时不阻塞服务。
- 淘汰策略: LRU, LFU, Random, TTL 等。
- 内存分配器: jemalloc (默认) / tcmalloc。
-
持久化方案 (源自附录五)
方案 RPO(恢复点目标) RTO(恢复时间目标) 性能影响 适用场景 RDB 分钟级 秒级 低 灾备恢复 AOF 秒级 分钟级 中 金融交易 混合 秒级 秒级 中高 关键业务 -
集群模式对比 (源自附录二)
- 哨兵模式 (Sentinel): CP 系统,自动主从切换,适合中小规模。
- Cluster 模式: AP 系统(最终一致),去中心化分片 (16384 个 slot),支持水平扩展。
- 典型问题 (源自附录二/五)
- 缓存穿透/击穿/雪崩: 见术语表。
- 大 Key (Big Key): Value 过大 (如 >10MB) 导致网络阻塞、分配不均。解决方案:拆分。
- 热 Key (Hot Key): 单个 Key 访问频率过高,导致单分片/单 CPU 瓶颈。解决方案:本地缓存、多级缓存、复制多份加随机后缀。
- 历史版本演进 (源自附录二)
- 3.0: Cluster 模式。
- 4.0: 混合持久化,
PSYNC 2.0
。 - 5.0: Stream 数据类型。
- 6.0: 多线程 IO (提升网络处理能力), ACL。
- 7.0: Function API (服务端脚本)。
4.2 Elasticsearch (ES)
- Q1:这是做什么的?
- 基于 Lucene 库的分布式、RESTful 风格的搜索和分析引擎。
- Q2:应用场景?
- 全文搜索(网站搜索、商品搜索)、日志分析(ELK栈核心)、业务监控、安全智能分析。
- Q3:解决传统问题?
- 替代关系型数据库 LIKE 查询的低效,提供强大的全文检索和聚合分析能力。
- 相比 Solr 更易于水平扩展和管理。
-
Q4:优缺点
- 优:强大的搜索和聚合能力、近实时 (NRT)、水平扩展性好、RESTful API 易用。
- 缺:写入相比数据库较慢、资源消耗(内存/CPU)较高、存在脑裂风险(需合理配置)、不擅长频繁更新的场景。
-
核心概念
- Index: 类似数据库。
- Type (已废弃): 类似表 (7.x 后一个 Index 只有一个 Type
_doc
)。 - Document: 类似行。
- Field: 类似列。
- Mapping: 定义字段类型、分词器等。
- Shard: 索引分片,实现水平扩展。
- Replica: 分片副本,保证高可用。
- 性能优化 (源自附录五)
- 索引设计: 合理设置分片数 (
节点数 * CPU核数 * 1.5
经验值),优化 Mapping (避免动态映射dynamic: strict
, 合理选择keyword
vstext
)。 - 查询优化: 使用
filter
context (利用缓存), 避免深度分页 (from
+size
vssearch_after
), 善用_source
过滤返回字段, 使用路由 (routing
)。 - 写入优化: 批量写入 (
bulk
API), 调整refresh_interval
。 - 集群优化: 冷热数据分离 (SSD存热, HDD存温), JVM 调优, 操作系统调优。
- 索引设计: 合理设置分片数 (
4.3 Neo4j
- Q1:这是做什么的?
- 领先的开源图数据库,使用属性图模型(节点、关系、属性)。
- Q2:应用场景?
- 社交网络关系分析(好友推荐、共同关注)、欺诈检测(关联分析)、知识图谱、推荐系统(基于关系的推荐)。
- Q3:解决传统问题?
- 相比关系型数据库,处理复杂、多层级的关联查询(如"查询某个用户好友的好友")性能极高,避免了大量的 JOIN 操作。
- Q4:优缺点
- 优:高效处理图结构数据和关联查询、直观的数据模型、Cypher 查询语言表达力强。
- 缺:不适合存储大量的非结构化数据或进行聚合统计分析(相比文档/时序数据库),单点写入性能可能有瓶颈。
4.4 JanusGraph
- Q1:这是做什么的?
- 一个开源的、分布式的图数据库,设计用于存储和查询包含数十亿顶点和边的图数据。特点是其可插拔的存储后端和索引后端。
- Q2:应用场景?
- 需要处理超大规模图数据(百亿、千亿级别)的场景,如大型社交网络、知识图谱。
- Q3:解决传统问题?
- 提供比单机图数据库(如 Neo4j 社区版)更好的水平扩展能力和灵活性。
-
Q4:优缺点
- 优:极强的扩展性(依赖底层存储如 Cassandra/HBase)、支持多种存储和索引后端(灵活性高)、兼容 TinkerPop Gremlin 查询语言。
- 缺:部署和运维复杂度较高,查询性能可能不如特定优化的图数据库。
-
可插拔后端
- 存储后端: Cassandra, HBase, Google Cloud Bigtable, BerkeleyDB。
- 索引后端: Elasticsearch, Solr, Lucene。
4.5 InfluxDB
- Q1:这是做什么的?
- 一个开源的时序数据库(TSDB),专门用于处理带时间戳的数据,如监控指标、物联网传感器数据、实时分析数据。
- Q2:应用场景?
- 系统监控(存储 Prometheus 等采集的指标)、应用性能监控 (APM)、物联网数据存储与分析、实时数据看板。
- Q3:解决传统问题?
- 相比通用数据库,针对时序数据进行了优化,写入性能高、存储压缩率高、时间范围查询快。
-
Q4:优缺点
- 优:高性能时序数据读写、高压缩率、内置数据保留策略 (Retention Policies) 和连续查询 (Continuous Queries)、类 SQL 查询语言 (InfluxQL/Flux)。
- 缺:不适合存储非时序数据、JOIN 能力弱、高基数 (High Cardinality) 问题可能导致性能下降。
-
核心概念 (v1.x)
- Database: 数据库。
- Measurement: 类似表。
- Tags: 索引字段 (key-value),用于分组和过滤。
- Fields: 数据字段 (key-value),非索引。
- Point: 一条数据记录,包含时间戳、measurement、tags、fields。
- Series: measurement 和 tags 组合决定的唯一时间序列。
4.6 ClickHouse
- Q1:这是做什么的?
- Yandex 开源的高性能列式数据库管理系统(DBMS),主要用于在线分析处理(OLAP)。
- Q2:应用场景?
- 海量数据的实时分析查询、BI 报表、用户行为分析、日志分析。
- Q3:解决传统问题?
- 相比传统行式数据库或 Hadooop 生态(如 Hive/Impala),提供极快的 OLAP 查询速度(通常快几个数量级)。
-
Q4:优缺点
- 优:查询速度极快(利用向量化执行、列存压缩)、高数据压缩率、支持 SQL、水平扩展性好。
- 缺:不适合高并发的点查或事务性更新 (OLTP)、JOIN 操作相对较弱、对硬件资源要求较高。
-
核心特性
- 列式存储: 数据按列存储,利于压缩和查询(只需读取相关列)。
- 向量化执行: 一次处理一批数据(向量),而非单行,减少函数调用开销。
- 数据压缩: 支持 LZ4, ZSTD 等多种高效压缩算法。
- MergeTree 引擎: 主要的表引擎家族,支持数据排序、分区、主键索引、TTL 等。
4.7 RocksDB
- Q1:这是做什么的?
- Facebook 开源的高性能嵌入式 Key-Value 存储库,基于 LSM-Tree 架构。
- Q2:应用场景?
- 作为许多分布式系统(如 TiKV, Flink 状态后端, Kafka Streams, CockroachDB)的底层存储引擎。
- 需要高性能本地持久化存储的应用。
- Q3:解决传统问题?
- 提供比传统 B-Tree 数据库(针对 HDD 优化)在 SSD 上更高的写入性能和更好的空间利用率。
-
Q4:优缺点
- 优:写入性能极高、压缩率高、针对闪存优化、配置灵活。
- 缺:读性能(特别是范围查询)可能不如 B+Tree、后台 Compaction 可能影响性能稳定性、调优复杂。
-
核心架构: LSM-Tree (Log-Structured Merge Tree)
- 写操作写入内存中的 MemTable。
- MemTable 写满后刷到磁盘成为不可变的 SSTable (Sorted String Table) 文件 (Level 0)。
- 后台 Compaction 任务将不同 Level 的 SSTable 合并,消除冗余数据,优化读取。
5. 分布式存储系统
5.1 HDFS (Hadoop Distributed File System)
- Q1:这是做什么的?
- Hadoop 项目的核心组件之一,一个设计运行在商用硬件上的分布式文件系统,具有高容错性,适合存储超大数据集。
- Q2:应用场景?
- 大规模数据存储(TB/PB级别),特别是作为 MapReduce、Spark、Hive 等批处理计算框架的底层存储。
- 数据仓库、数据湖的存储底座。
- Q3:解决传统问题?
- 解决了单机存储容量和性能的瓶颈,提供了可靠、可扩展的大规模数据存储能力。
-
Q4:优缺点
- 优:高吞吐量(适合批处理)、高容错性(多副本)、可扩展性好、成本相对较低(使用商用硬件)。
- 缺:高延迟(不适合低延迟随机读写)、不适合大量小文件存储(元数据压力大)、一次写入多次读取模型(不支持文件修改)。
-
核心架构
- NameNode: 主节点,管理文件系统的命名空间(元数据),维护文件到数据块的映射,管理 DataNode。是 HDFS 的单点(需 HA 方案)。
- DataNode: 工作节点,负责存储实际的数据块 (Block,默认 128MB/256MB),执行 NameNode 的读写指令,并定期向 NameNode 发送心跳和块报告。
- Secondary NameNode: 辅助 NameNode 进行元数据检查点操作,减少 NameNode 启动时间,但不是热备份。
- 读写流程 (简化)
- 写: Client 请求 NameNode 创建文件 -> NameNode 返回可写入的 DataNode 列表 -> Client 将文件分块写入第一个 DataNode -> 第一个 DataNode 将块复制给第二个,第二个复制给第三个(Pipeline 复制)-> DataNode 返回确认 -> Client 通知 NameNode 文件写入完成。
- 读: Client 请求 NameNode 获取文件块位置 -> NameNode 返回 DataNode 列表 -> Client 选择最近的 DataNode 读取数据块。
6. 消息队列
6.1 Kafka 深度解析
- Q1:这是做什么的?
- 分布式、高吞吐、持久化的发布-订阅消息系统(或事件流平台)。
- Q2:应用场景?
- 日志收集、用户行为跟踪、指标监控、流处理数据源、事件驱动架构、微服务解耦。
- Q3:解决传统问题?
- 替代传统消息队列(如 RabbitMQ)在日志等高吞吐场景的性能瓶颈。
- 提供可靠的、可水平扩展的消息存储和传输。
-
Q4:优缺点
- 优:极高的吞吐量(单机可达百万 QPS)、持久化存储(可回溯消费)、高可用性(副本机制)、水平扩展性好、生态丰富(Connect/Streams)。
- 缺:不支持复杂的消息路由(相比 RabbitMQ 的 Exchange)、延迟相对较高(ms 级)、依赖 ZooKeeper(3.x 后可移除)。
-
核心概念
- Broker: Kafka 服务器节点。
- Topic: 消息类别,逻辑概念。
- Partition: Topic 的物理分区,实现并发和扩展性,每个 Partition 内消息有序。
- Producer: 消息生产者。
- Consumer: 消息消费者。
- Consumer Group: 多个 Consumer 组成一个组,共同消费一个 Topic,每个 Partition 只会被组内一个 Consumer 消费。
- Offset: 记录 Consumer 在每个 Partition 上的消费位置。
- 存储设计 (源自附录二/五)
- Partition 内数据以 Segment 文件形式存储,每个 Segment 包含
.log
(数据) 和.index
(索引) 文件。 - 顺序写磁盘,利用 Page Cache。
- 零拷贝 (Zero-copy): 使用
sendfile
系统调用,数据直接从 Page Cache 发送到网卡,避免内核态和用户态之间的数据拷贝。
- Partition 内数据以 Segment 文件形式存储,每个 Segment 包含
- 可靠性机制
- Replication: 每个 Partition 可以有多个副本(Replica),分布在不同 Broker 上。
- Leader/Follower: 每个 Partition 只有一个 Leader 负责读写,Follower 从 Leader 同步数据。
- ISR (In-Sync Replicas): 与 Leader 保持同步的副本集合。Producer 可配置
acks
参数决定写入的可靠性级别(acks=0, 1, all
)。
- 生产者调优 (源自附录五)
Properties props = new Properties(); props.put("bootstrap.servers", "kafka1:9092,..."); props.put("acks", "1"); // 或 "all" 获取最高可靠性 props.put("retries", 3); // 失败重试次数 props.put("batch.size", 16384); // 批次大小 (bytes) props.put("linger.ms", 5); // 延迟发送时间 (ms),攒批 props.put("compression.type", "lz4"); // 压缩类型 (none, gzip, snappy, lz4, zstd)
- 消费者组管理 (源自附录五)
- Rebalance: 当 Group 内 Consumer 数量变化或 Topic Partition 数量变化时触发,重新分配 Partition 给 Consumer。
- Rebalance 策略: Range, RoundRobin, Sticky。Sticky 策略尽量保持原有分配,减少状态迁移。
6.2 RabbitMQ
- Q1:这是做什么的?
- 实现了 AMQP(高级消息队列协议)的开源消息代理软件。
- Q2:应用场景?
- 业务通知、任务队列(异步处理)、需要复杂路由和消息确认机制的场景。
- Q3:解决传统问题?
- 提供可靠的消息传递、灵活的路由机制、解耦应用。
-
Q4:优缺点
- 优:功能完善(多种 Exchange 类型、TTL、死信队列、优先级队列)、管理界面友好、支持多种协议 (AMQP, MQTT, STOMP)。
- 缺:吞吐量相比 Kafka 较低、性能受限于内存(持久化时)、Erlang 技术栈维护成本可能较高。
-
核心概念
- Broker: RabbitMQ 服务器。
- Virtual Host: 虚拟主机,隔离环境。
- Connection: TCP 连接。
- Channel: 信道,多路复用连接。
- Exchange: 交换机,接收 Producer 消息并按规则路由到 Queue。类型:Direct, Fanout, Topic, Headers。
- Queue: 队列,存储消息。
- Binding: 连接 Exchange 和 Queue 的规则。
6.3 Pulsar
- Q1:这是做什么的?
- Apache 顶级项目,下一代云原生分布式消息流平台。
- Q2:应用场景?
- 需要高吞吐、低延迟、强一致性、多租户、跨地域复制的消息和流处理场景。
- 统一消息队列和流存储的场景。
- Q3:解决传统问题?
- 解决 Kafka 依赖 ZooKeeper、分区数限制、运维复杂等问题。
- 提供更灵活的架构和更丰富的功能。
-
Q4:优缺点
- 优:计算存储分离架构(Broker + BookKeeper)、Segmented Stream 存储(无限存储)、多租户支持、跨地域复制、支持多种消费模式(独占/共享/故障切换)、支持多种协议(Pulsar/Kafka/MQTT/AMQP)。
- 缺:社区和生态相比 Kafka 还不够成熟,架构相对更复杂。
-
核心架构 (源自附录二)
- Broker: 无状态计算层,负责消息路由、协议处理。
- BookKeeper: 有状态存储层,负责消息持久化(基于 Log 分段存储)。
- ZooKeeper: 存储元数据(未来可能移除)。
6.4 NATS
- Q1:这是做什么的?
- 一个开源、高性能、轻量级的云原生消息系统。设计目标是简单、快速和安全。
- Q2:应用场景?
- 微服务通信、物联网设备消息传递、命令与控制系统、需要极低延迟的场景。
- Q3:解决传统问题?
- 提供比传统 MQ 更简单、更快速的消息传递机制。
-
Q4:优缺点
- 优:性能极高(百万级 QPS,亚毫秒级延迟)、部署简单、资源消耗低、支持多种消息模式(请求/回复、发布/订阅、队列)。
- 缺:核心 NATS 不提供持久化(需 NATS Streaming/JetStream 支持)、功能相对 Kafka/Pulsar 较少。
-
NATS JetStream: NATS 内置的持久化流存储层,提供类 Kafka 的功能。
7. 计算框架
7.1 Spark 深度解析
- Q1:这是做什么的?
- 快速、通用、可扩展的大数据处理引擎,支持批处理、交互式查询(SQL)、流处理、机器学习和图计算。
- Q2:应用场景?
- 替代 Hadoop MapReduce 进行更高效的批处理、ETL、数据仓库查询 (Spark SQL)、机器学习 (MLlib)、图分析 (GraphX)、实时流处理 (Structured Streaming)。
- Q3:解决传统问题?
- 极大提升了 MapReduce 的计算性能(特别是迭代计算),通过内存计算减少了磁盘 IO。
- 提供了统一的 API 栈,简化了大数据处理。
-
Q4:优缺点
- 优:性能高(内存计算)、API 易用(支持 Scala/Java/Python/R)、生态系统完善、支持多种部署模式 (Standalone/YARN/Mesos/K8s)。
- 缺:流处理能力相比 Flink 较弱(微批处理模型 Structured Streaming)、内存消耗较大、调优相对复杂。
-
核心概念
- RDD (Resilient Distributed Dataset): 核心抽象,弹性分布式数据集。
- DataFrame/Dataset: 基于 RDD 的更高级抽象,带有 Schema 信息,提供类 SQL 操作。
- DAG (Directed Acyclic Graph): 任务执行的有向无环图。
- Driver: 运行
main
函数的进程,负责创建 SparkContext、构建 DAG、调度 Task。 - Executor: 工作节点上运行的进程,负责执行 Task,存储数据。
- 内存管理 (源自附录二/五)
- 统一内存管理模型(Spark 1.6+):堆内内存分为 Execution Memory(Shuffle/Join/Sort/Aggregation)和 Storage Memory(RDD 缓存/广播变量),两者可以相互借用。
- Off-Heap Memory: 堆外内存,用于减少 GC 开销。
- 优化案例 (源自附录二)
- 广播变量 (Broadcast Variables): 将小表或变量广播到所有 Executor,避免每个 Task 重复拉取。
- 累加器 (Accumulators): 分布式计数器或求和,只能由 Driver 读取。
- 数据倾斜处理: Salting(加盐)、Key 合并、使用 Skew Join 优化。
- 序列化: 使用 Kryo 序列化库(比 Java 序列化更快更紧凑)。
persist
/cache
: 合理缓存需要重复使用的 RDD/DataFrame。- Shuffle 优化: 调整
spark.sql.shuffle.partitions
, 使用合适的 Shuffle Manager。
7.2 Flink 深度解析
- Q1:这是做什么的?
- 开源的流处理框架和分布式计算引擎,以其低延迟、高吞吐、精确一次(Exactly-once)语义和对事件时间处理的强大支持而闻名。也支持批处理(流批一体)。
- Q2:应用场景?
- 实时数据分析、实时 ETL、实时风控、实时推荐、复杂事件处理 (CEP)、物联网 (IoT) 数据处理。
- Q3:解决传统问题?
- 提供真正的事件驱动流处理(相比 Spark 的微批处理),延迟更低。
- 强大的状态管理和 Checkpoint 机制,保证精确一次处理语义。
- 优秀的事件时间处理能力,能准确处理乱序数据。
-
Q4:优缺点
- 优:低延迟、高吞吐、精确一次语义、强大的状态管理、优秀的事件时间处理、流批一体 API (DataStream/Table API/SQL)。
- 缺:批处理性能相比 Spark 可能稍弱、社区和生态相比 Spark 略小、API 学习曲线可能稍陡。
-
核心概念
- DataStream API: 核心流处理 API。
- Table API / SQL: 更高层次的声明式 API,实现流批统一。
- 事件时间 (Event Time) / 处理时间 (Processing Time) / 摄入时间 (Ingestion Time): 时间语义。
- 状态 (State): 算子存储的中间结果,支持多种状态类型 (ValueState, ListState, MapState 等)。
- 状态后端 (State Backend): 存储状态的地方 (Memory, FsStateBackend (基于文件系统), RocksDBStateBackend)。
- Checkpoint: 状态持久化快照,用于故障恢复,实现精确一次/至少一次。
- Savepoint: 手动触发的 Checkpoint,用于任务升级、迁移。
- 水印 (Watermark): 事件时间进展的标记,用于触发窗口计算。
- 窗口 (Window): 将无界流切分为有界块 (Tumbling, Sliding, Session, Global)。
-
状态后端选择 (源自附录二/五)
类型 特点 适用场景 MemoryStateBackend 快但状态大小受限,易丢失 本地测试 FsStateBackend 基于 HDFS 等持久化存储 大状态,高可用 RocksDBStateBackend 基于本地 RocksDB,增量 Checkpoint 超大状态,推荐 -
时间语义与 Watermark (源自附录二/五)
- 事件时间是保证结果准确性的关键。
- Watermark 用于告诉 Flink 事件时间的进展,处理乱序和延迟数据。
- Watermark 生成策略: Periodic (周期性) vs Punctuated (基于特定事件)。
- 流批一体 (源自附录十)
- Flink 将批处理视为流处理的特例(有界流)。
- 使用 Table API / SQL 可以用同一套代码处理流和批数据源。
7.3 Hadoop MapReduce
- Q1:这是做什么的?
- 最早的、影响深远的分布式计算框架,用于处理和生成大数据集。
- Q2:应用场景?
- 大规模离线数据批处理(如日志分析、数据挖掘、索引构建)。
- Q3:解决传统问题?
- 首次实现了在商用硬件集群上进行可靠、容错的大规模并行计算。
-
Q4:优缺点
- 优:可靠性高、容错性好、能够处理 PB 级数据。
- 缺:编程模型相对复杂、性能较低(大量磁盘 IO)、延迟高、不适合迭代计算和实时处理。
-
核心流程 (源自附录十)
- Input: 从 HDFS 读取输入分片 (InputSplit)。
- Map: 用户编写
map
函数处理输入,输出<Key, Value>
。 - Combine (可选): Mapper 端的本地 Reduce,减少 Shuffle 数据量。
- Shuffle & Sort: 将 Map 输出按 Key 排序,并传输到 Reducer 节点。
- Reduce: 用户编写
reduce
函数处理相同 Key 的 Value 列表,输出最终结果。 - Output: 将结果写入 HDFS。
8. 云原生基础设施
8.1 Kubernetes (K8s) 深度解析
- Q1:这是做什么的?
- 开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。已成为云原生应用的事实标准。
- Q2:应用场景?
- 微服务部署与管理、CI/CD、弹性伸缩、服务发现、负载均衡、状态管理(StatefulSet)。
- Q3:解决传统问题?
- 解决手动管理大量容器的复杂性,提供声明式 API 和自动化运维能力。
- 屏蔽底层基础设施差异,实现应用跨云、跨环境部署。
-
Q4:优缺点
- 优:功能强大、生态完善、社区活跃、高度可扩展、声明式配置。
- 缺:架构复杂,学习曲线陡峭,运维门槛较高,网络和存储方案选择多样且复杂。
-
核心原理与特点
- 声明式 API (Declarative API): 用户通过 YAML 或 JSON 文件描述应用程序的期望状态(如需要多少个副本、使用哪个镜像、暴露什么端口),K8s 会持续工作以达到并维持这个状态。
- Master-Node 架构:
- Master 节点 (控制平面 Control Plane): 负责管理整个集群。核心组件包括:
kube-apiserver
: 提供 K8s API 的入口,处理 REST 请求。etcd
: 高可用的键值存储,保存集群的所有配置和状态数据。kube-scheduler
: 负责将新创建的 Pod 调度到合适的 Node 节点上运行。kube-controller-manager
: 运行各种控制器(如副本控制器、节点控制器),负责维持集群状态。cloud-controller-manager
(可选): 与云提供商 API 交互(如创建负载均衡器、存储卷)。
- Node 节点 (工作节点 Worker Node): 负责运行容器化应用。核心组件包括:
kubelet
: 负责与 Master 通信,管理本节点上的 Pod 和容器生命周期。kube-proxy
: 负责维护网络规则,实现 K8s Service 的网络代理和负载均衡。- 容器运行时 (Container Runtime): 负责实际运行容器,如 Docker, containerd, CRI-O。
- Master 节点 (控制平面 Control Plane): 负责管理整个集群。核心组件包括:
- 核心对象 (Core Objects):
- Pod: K8s 中最小的部署单元,包含一个或多个紧密关联的容器,共享网络和存储卷。
- Service: 为一组 Pod 提供一个稳定的 IP 地址和 DNS 名称,并提供负载均衡。解决了 Pod IP 不固定的问题。
- Deployment: 定义了 Pod 的期望状态(如副本数、镜像版本),并管理 Pod 的创建、更新和滚动升级。
- ReplicaSet: 确保指定数量的 Pod 副本在运行(通常由 Deployment 管理)。
- StatefulSet: 用于管理有状态应用(如数据库),保证 Pod 的有序、唯一部署和稳定网络标识。
- DaemonSet: 确保所有(或部分)Node 节点都运行一个指定的 Pod 副本(如日志收集 Agent, 监控 Exporter)。
- Namespace: 将集群资源划分为逻辑上的隔离组。
- ConfigMap / Secret: 用于存储配置信息和敏感信息,与 Pod 解耦。
- Volume: 为 Pod 提供持久化存储。
- Ingress: 管理集群外部访问(HTTP/HTTPS 路由)。
- 自动伸缩:
- HPA (Horizontal Pod Autoscaler): 根据 CPU/内存使用率或自定义指标自动调整 Deployment 等控制器管理的 Pod 数量。(课程三、十)
- VPA (Vertical Pod Autoscaler): 自动调整 Pod 的资源请求 (Request) 和限制 (Limit)。
- CA (Cluster Autoscaler): 根据 Pod 调度需求自动调整集群中 Node 节点的数量(依赖云厂商支持)。
- 服务发现与负载均衡: Service 对象提供了基本的内部服务发现和负载均衡。Ingress 对象用于暴露 HTTP/HTTPS 服务到集群外部。
- 自愈能力: K8s 会持续监控节点和 Pod 的状态,自动重启失败的容器,替换或重新调度失败的 Pod。
-
常见应用场景 (结合课程案例)
- 微服务部署与管理: K8s 是部署、扩展和管理微服务的理想平台。(课程一、二、三、五、六、七、九、十一 等大量案例的后期阶段)
- 无状态应用部署: 部署 Web 服务器、API 网关等无状态应用,利用 Deployment 和 HPA 实现弹性伸缩。(课程三)
- 有状态应用部署 (谨慎使用): 通过 StatefulSet 和持久卷 (Persistent Volume) 部署数据库、消息队列等有状态应用,但需要更复杂的运维管理。
- 批处理任务: 通过 Job 和 CronJob 对象运行一次性或定时的批处理任务。
- 大数据与 AI 平台: 运行 Spark, Flink, TensorFlow 等计算框架和机器学习任务,利用 K8s 的资源调度和弹性能力。(课程十、十二)
- CI/CD: 作为持续集成和持续部署流水线的目标平台。
- Serverless 平台: 作为 Knative, OpenFaaS 等 Serverless 框架的基础设施。(课程十一)
- 服务网格 (Service Mesh): Istio, Linkerd 等服务网格通常部署在 K8s 集群之上。(课程十一)
-
Kubernetes vs 其他编排工具
- Docker Swarm: Docker 官方提供的容器编排工具,相对简单,但功能和生态不如 K8s 丰富。
- Apache Mesos: 更底层的集群资源管理器,可以运行 K8s、Hadoop、Spark 等多种框架,但本身配置和使用较复杂。
- Nomad (HashiCorp): 另一个灵活的集群调度器,可以编排容器和非容器应用。
-
关键概念与最佳实践
- 资源请求与限制 (Requests & Limits): 为 Pod 中的容器设置 CPU 和内存的请求值 (用于调度) 和限制值 (强制约束),保证资源分配的合理性和稳定性。
- 健康检查 (Probes):
- Liveness Probe: 检测容器是否存活,如果不健康则重启容器。
- Readiness Probe: 检测容器是否准备好接收流量,如果不健康则从 Service 的 Endpoints 中移除。
- Startup Probe: 检测容器是否启动完成(适用于启动较慢的应用)。
- 标签与选择器 (Labels & Selectors): 通过标签对 K8s 对象进行分组,通过选择器筛选对象,是 K8s 中资源组织和关联的核心机制。
- 注解 (Annotations): 用于附加任意的非标识性元数据到对象上。
- 网络策略 (Network Policies): 控制 Pod 之间的网络访问权限,实现网络隔离。
- RBAC (Role-Based Access Control): 基于角色的访问控制,管理用户和服务账号对 K8s API 的访问权限。
- Helm: K8s 的包管理工具,用于简化应用的定义、安装和升级。
- Operator 模式: 将特定应用的运维知识(如部署、备份、升级)封装成 K8s 控制器,实现自动化运维。
Kubernetes 极大地简化了分布式应用的部署和管理,是构建云原生应用和现代基础设施的关键技术。
8.2 Istio 服务网格
- Q1:这是做什么的?
- 开源的服务网格平台,透明地分层到现有分布式应用程序上。它提供了一种统一的方式来连接、保护、控制和观察服务。
- Q2:应用场景?
- 微服务架构的流量管理(灰度发布、A/B测试、超时重试)、服务间安全(mTLS加密、授权策略)、策略执行(限流、访问控制)、可观测性(指标、追踪、日志)。
- Q3:解决传统问题?
- 将服务治理能力从应用代码中解耦出来,下沉到基础设施层(Sidecar),使得开发者可以专注于业务逻辑。
- 提供跨语言、统一的服务治理方案。
-
Q4:优缺点
- 优:功能强大全面、非侵入式接入、支持多协议、与 K8s 集成良好。
- 缺:架构复杂、引入 Sidecar 带来额外性能开销(延迟、资源消耗)、运维门槛高。
-
核心架构 (v1.5+ 简化后)
- 数据平面 (Data Plane): 由一组部署为 Sidecar 的智能代理 (Envoy) 组成,负责协调和控制微服务之间的所有网络通信。
- 控制平面 (Control Plane):
istiod
,负责管理和配置代理以路由流量,并强制执行策略。包含 Pilot (配置下发), Citadel (安全证书), Galley (配置验证)。
- 核心功能实现 (源自附录十一)
- 流量管理: VirtualService (路由规则), DestinationRule (目标策略,如负载均衡、熔断)。
- 安全: PeerAuthentication (mTLS), RequestAuthentication (JWT), AuthorizationPolicy (访问控制)。
- 可观测性: 自动生成 Metrics (Prometheus), Traces (Jaeger/Zipkin), Access Logs。
- Envoy 代理: Istio 数据平面的核心,高性能的 C++ 开发的网络代理。支持动态配置 (xDS API)、热重启、丰富的 L4/L7 协议支持、高级负载均衡、强大的可观测性。
8.3 etcd
- Q1:这是做什么的?
- 一个强一致性、高可用的分布式 Key-Value 存储系统。
- Q2:应用场景?
- 用作 Kubernetes 的核心数据存储(存储集群状态和配置)。
- 分布式系统的元数据存储、服务发现、分布式锁。
- Q3:解决传统问题?
- 提供可靠的、一致性的方式来存储和访问分布式系统的关键配置信息。
- Q4:优缺点
- 优:强一致性 (基于 Raft)、高可用、API 简单 (gRPC/HTTP)。
- 缺:性能相对 Redis 等内存 KV 较低、存储容量有限、对磁盘 IO 敏感。
8.4 ZooKeeper
- Q1:这是做什么的?
- 一个开源的分布式协调服务,为分布式应用程序提供一致性服务。
- Q2:应用场景?
- 分布式锁、配置管理、集群成员管理、Master 选举、服务发现 (Dubbo, Kafka 早期版本)。
- Q3:解决传统问题?
- 解决分布式系统中常见的协调问题,简化分布式应用开发。
-
Q4:优缺点
- 优:成熟稳定、功能丰富(Watch 机制)、顺序一致性。
- 缺:架构相对复杂、性能可能成为瓶颈、运维管理有一定挑战、Java 技术栈。
-
核心概念: Znode (数据节点,类似文件系统路径), Watch (一次性触发的事件通知)。
- 一致性协议: ZAB (ZooKeeper Atomic Broadcast)。
9. 分布式一致性协议:Paxos & Raft
分布式一致性协议是构建可靠分布式系统的基石,用于确保在一组可能发生故障的节点之间就某个值或状态达成共识 (Consensus)。Paxos 和 Raft 是其中最著名和应用最广泛的两种算法。
9.1 一致性协议概览
- 核心问题:共识 (Consensus)
在分布式系统中,多个节点需要协同工作。当需要就某个决定(例如,哪个节点是 Leader,某个值应该是什么)达成一致时,就需要共识算法。挑战在于节点可能宕机、消息可能丢失或延迟、网络可能分区。
共识算法需要保证以下性质:
- 一致性 (Agreement/Consistency): 所有正常节点最终就同一个值达成一致。
- 可终止性 (Termination/Liveness): 所有正常节点最终都能做出决定(在有限时间内)。
- 有效性 (Validity/Integrity): 如果所有节点都提议了同一个值 v,那么最终达成共识的值必须是 v。
9.2 Paxos 协议
- 提出者: Leslie Lamport (图灵奖得主)。
- 核心思想: 通过一个"两阶段提交"式的协议,让提议者 (Proposer) 提出一个值,并让接受者 (Acceptor) 接受这个值。协议设计精巧,能容忍少数节点故障。
- 角色:
- Proposer: 提出提案 (Proposal),包含一个提案编号 (通常是递增的) 和一个提议的值。
- Acceptor: 接受提案。会记录已接受的最高提案编号和对应的值。
- Learner: 学习最终被接受的值。
- 基本流程 (Basic Paxos):
- Prepare 阶段: Proposer 选择一个提案编号 N,向超过半数 (Quorum) 的 Acceptor 发送
Prepare(N)
请求。 - Promise 阶段: Acceptor 收到
Prepare(N)
请求后:- 如果 N 大于它之前响应过的任何 Prepare 请求的编号,则承诺不再接受编号小于 N 的提案,并回复 Proposer 它之前已接受的最高编号提案的值(如果存在)。
- 否则,忽略或拒绝。
- Accept 阶段: 如果 Proposer 收到超过半数 Acceptor 的 Promise 响应:
- 它选择一个值 V:如果响应中包含已接受的值,则选择其中编号最高的提案的值;否则可以选择自己最初想提议的值。
- 向这些响应了 Promise 的 Acceptor 发送
Accept(N, V)
请求。
- Accepted 阶段: Acceptor 收到
Accept(N, V)
请求后:- 如果 N 不小于它承诺的编号下限,则接受该提案 (N, V),并将结果通知给 Learner。
- 否则,忽略。
- Prepare 阶段: Proposer 选择一个提案编号 N,向超过半数 (Quorum) 的 Acceptor 发送
- 特点: 理论上非常重要,是许多分布式系统的基础。但 Basic Paxos 理解和实现都比较复杂,且可能因活锁 (Livelock) 导致无法快速达成共识。Multi-Paxos 是对其的优化,通过选出一个稳定的 Leader 来简化流程。
- 应用: Google Chubby (分布式锁服务),是 Paxos 的经典实现。
9.3 Raft 协议
- 提出者: Diego Ongaro 和 John Ousterhout (斯坦福大学)。
- 设计目标: 易于理解和实现 (Understandability),同时提供与 Paxos 相当的容错性和性能。
- 核心思想: 将共识问题分解为三个相对独立的子问题:
- 领导者选举 (Leader Election): 选举出一个唯一的 Leader 节点负责管理日志复制。
- 日志复制 (Log Replication): Leader 接收客户端请求,将其作为日志条目 (Log Entry) 复制到其他 Follower 节点,并确保日志最终一致。
- 安全性 (Safety): 确保不会选出错误的 Leader,并且状态机执行的日志顺序是一致的。
- 角色:
- Leader: 处理所有客户端请求,管理日志复制。
- Follower: 被动接收 Leader 的日志复制请求和心跳。如果长时间未收到 Leader 心跳,会转变为 Candidate 发起选举。
- Candidate: 候选者,发起选举,争取成为新的 Leader。
- 流程概述:
- Leader 选举: Follower 在选举超时 (Election Timeout) 后成为 Candidate,向其他节点发送
RequestVote
RPC。获得超过半数选票的 Candidate 成为新的 Leader。Leader 会周期性地向所有 Follower 发送心跳 (空的AppendEntries
RPC) 来维持地位。 - 日志复制: Leader 收到客户端请求后,将其追加到自己的日志中,然后并行地向所有 Follower 发送
AppendEntries
RPC。当超过半数的 Follower 成功复制该日志条目后,Leader 认为该条目已提交 (Committed),并将结果返回给客户端。Leader 也会通知 Follower 哪些条目已提交。 - 安全性保证: Raft 通过精心设计的选举限制(Candidate 必须拥有最新的已提交日志才能当选)和提交规则(Leader 只能提交包含在自己当前任期内的日志条目)来保证安全性。
- Leader 选举: Follower 在选举超时 (Election Timeout) 后成为 Candidate,向其他节点发送
- 特点: 相较于 Paxos,Raft 的状态更清晰,流程更容易理解,工程实现更友好。
-
应用: etcd, Consul, TiKV, CockroachDB, NATS Streaming 等大量现代分布式系统的核心共识机制。分布式数据库 (课程九) 和 分布式文件系统 (课程八) 的元数据管理常采用 Raft。
-
Paxos vs Raft 对比
特点 Paxos (Multi-Paxos) Raft 核心目标 容错性 易理解性 + 容错性 Leader 通常有 Leader,但选举过程较复杂 强 Leader 模型,选举过程清晰 算法分解 未明确分解 分解为 Leader Election, Log Replication, Safety 理解难度 较高 较低 实现难度 较高 较低 工业应用 Chubby, 部分早期系统 etcd, Consul, TiKV 等大量现代系统
10. 监控与可观测性
10.1 Prometheus 深度解析
- Q1:这是做什么的?
- CNCF 毕业项目,开源的系统监控和告警工具包。
- Q2:应用场景?
- 基础设施监控(服务器、网络设备)、容器和 K8s 监控、应用性能指标监控、告警。
- Q3:解决传统问题?
- 提供强大的多维数据模型和灵活的查询语言 (PromQL),替代传统监控系统(如 Nagios, Zabbix)在动态、大规模环境下的不足。
-
Q4:优缺点
- 优:强大的数据模型和 PromQL、拉模型(Pull)易于部署和管理、生态系统丰富 (众多 Exporter)、与 Grafana 完美集成。
- 缺:本身不提供长期存储和集群化(需 Thanos/Cortex/VictoriaMetrics 扩展)、日志和追踪支持弱、对推送(Push)场景支持有限(需 Pushgateway)。
-
核心架构
- Prometheus Server: 核心服务,负责拉取和存储时序数据,提供查询接口。
- Exporters: 暴露指标的代理程序(如 Node Exporter, MySQLd Exporter)。
- Pushgateway: 支持短生命周期 Job 推送指标。
- Alertmanager: 处理告警规则,发送通知(去重、分组、抑制)。
- Client Libraries: 应用内嵌,直接暴露指标。
- 数据模型: 时序数据由指标名称 (Metric Name) 和一组 Key-Value 标签 (Labels) 唯一标识。
- 存储 (TSDB) 设计 (源自附录二/五)
- 按时间分块 (Block),每个 Block 包含一段时间的数据。
- 块内数据按 Series 组织,使用压缩算法 (如 Gorilla TSDB 的 XOR 压缩, Snappy)。
- 通过索引快速定位 Series。
- 高可用与扩展方案 (源自附录二)
- Prometheus 自身 HA: 运行两个相同配置的 Prometheus 实例。
- 联邦 (Federation): 分层聚合,全局 Prometheus 从下级 Prometheus 拉取指标。
- 远程存储 (Remote Read/Write): 将数据写入长期存储系统 (Thanos, Cortex, M3DB, InfluxDB)。
- Thanos: 提供全局查询视图、长期存储(对接对象存储)、降采样。
- VictoriaMetrics: 高性能、高压缩率的 Prometheus 兼容存储。
10.2 Grafana
- Q1:这是做什么的?
- 开源的数据可视化和监控平台,支持连接多种数据源。
- Q2:应用场景?
- 创建丰富的、交互式的监控仪表盘 (Dashboard)。
- 统一展示来自 Prometheus, InfluxDB, Elasticsearch, MySQL 等不同来源的数据。
- 告警(有限能力,通常配合 Alertmanager)。
- Q3:解决传统问题?
- 提供比 Kibanana/Prometheus UI 更强大、更灵活的数据可视化能力。
- Q4:优缺点
- 优:支持数据源丰富、可视化效果好、Dashboard 配置灵活、社区活跃 (插件多)。
- 缺:本身不负责数据采集和存储。
10.3 ELK Stack (Elasticsearch, Logstash, Kibana)
- Q1:这是做什么的?
- 一套流行的开源日志收集、分析和可视化解决方案。
- Elasticsearch: 存储和搜索日志。
- Logstash: (或 Filebeat) 日志收集、处理、转发。
- Kibana: 日志可视化和查询界面。
- Q2:应用场景?
- 集中式日志管理、日志搜索与分析、应用和系统故障排查。
- Q3:解决传统问题?
- 解决分散在各服务器上的日志难以管理和查询的问题。
-
Q4:优缺点
- 优:功能强大、生态成熟、社区支持好。
- 缺:资源消耗(特别是 ES)较大、部署和维护相对复杂、Logstash 性能可能成为瓶颈(可用 Filebeat+Kafka 替代)。
-
架构演进 (源自附录四)
- 基础: Filebeat (采集) -> Elasticsearch -> Kibana。
- 加入 Logstash: Filebeat -> Logstash (过滤转换) -> Elasticsearch -> Kibana。
- 加入 Kafka: Filebeat -> Kafka (缓冲解耦) -> Logstash -> Elasticsearch -> Kibana。
10.4 Filebeat
- Q1:这是做什么的?
- Elastic Stack (ELK) 中的一部分,是一个轻量级的日志数据托运工具 (Shipper),用于转发和集中日志数据。
- Q2:应用场景?
- 从服务器、虚拟机、容器中实时收集日志文件(或其他事件数据),并将其发送到 Elasticsearch、Logstash 或 Kafka。
- Q3:解决传统问题?
- 替代重量级的 Logstash Agent,资源消耗更低,专注于日志采集和转发。
-
Q4:优缺点
- 优:轻量级、资源占用少、配置简单、支持背压机制、与 ELK 生态集成良好。
- 缺:数据处理和转换能力不如 Logstash。
-
核心特性: 输入 (Inputs), 处理器 (Processors), 输出 (Outputs), 模块 (Modules)。
10.5 Alertmanager
- Q1:这是做什么的?
- Prometheus 官方提供的告警处理组件。
- Q2:应用场景?
- 接收来自 Prometheus (或其他客户端) 的告警信息,进行去重、分组、静默、抑制,并将告警路由到正确的通知接收器(如 Email, PagerDuty, Slack, Webhook)。
- Q3:解决传统问题?
- 将告警规则定义(在 Prometheus 中)与告警通知管理(在 Alertmanager 中)分离,提供更灵活、更强大的告警处理能力。
-
Q4:优缺点
- 优:强大的告警分组、静默、抑制能力,灵活的路由配置,支持高可用。
- 缺:本身不产生告警,依赖于 Prometheus 等客户端。
-
核心功能: 分组 (Grouping), 抑制 (Inhibition), 静默 (Silences), 路由 (Routing)。
10.6 OpenTelemetry Collector
- Q1:这是做什么的?
- OpenTelemetry 项目的一部分,是一个独立运行的服务,用于接收、处理和导出遥测数据(Traces, Metrics, Logs)。
- Q2:应用场景?
- 作为遥测数据的统一代理和处理管道,解耦应用与后端监控系统。
- 数据格式转换、数据采样、添加属性、批量导出。
- Q3:解决传统问题?
- 避免应用直接与多种监控后端集成,简化配置和管理。
- 提供标准化的数据处理流程。
-
Q4:优缺点
- 优:厂商无关、支持多种协议接收和导出、配置灵活(基于 Pipeline 和 Processor)。
- 缺:引入了额外的部署和运维组件。
-
数据流水线 (源自附录二)
10.7 Jaeger
- Q1:这是做什么的?
- CNCF 毕业项目,开源的端到端分布式追踪系统。
- Q2:应用场景?
- 微服务架构下的请求链路追踪、性能分析、故障诊断、分布式事务监控。
- Q3:解决传统问题?
- 解决在复杂分布式系统中难以追踪单个请求完整路径和耗时的问题。
-
Q4:优缺点
- 优:遵循 OpenTracing 标准(现转向 OpenTelemetry)、架构清晰、UI 直观、与 K8s/Istio 集成良好。
- 缺:存储依赖(通常用 Elasticsearch 或 Cassandra),高流量下采样策略需仔细配置。
-
核心组件: Agent, Collector, Query Service, UI。
11. AI 与机器学习平台组件
11.1 TensorFlow Serving
- Q1:这是做什么的?
- Google 开发的高性能机器学习模型服务系统,专为生产环境设计。
- Q2:应用场景?
- 将 TensorFlow(或其他框架通过转换)训练好的模型部署为在线预测服务。
- Q3:解决传统问题?
- 提供比简单 Flask 包装更高效、更稳定、支持模型版本管理和热更新的模型部署方案。
- Q4:优缺点
- 优:性能高、支持模型版本控制和多模型服务、支持 A/B 测试、支持批量请求。
- 缺:主要针对 TensorFlow 模型优化,部署和配置相对复杂。
11.2 Triton Inference Server
- Q1:这是做什么的?
- NVIDIA 开发的开源推理服务软件,旨在简化和加速 AI 模型在生产环境中的部署。
- Q2:应用场景?
- 需要高性能、支持多种框架(TensorFlow, PyTorch, TensorRT, ONNX 等)、支持多 GPU 推理的场景。
- Q3:解决传统问题?
- 提供统一的接口来服务不同框架的模型,优化 GPU 利用率。
- Q4:优缺点
- 优:性能极高(特别是配合 TensorRT)、支持框架广泛、动态批处理 (Dynamic Batching)、模型管理和版本控制。
- 缺:配置和使用相对复杂,更偏向 NVIDIA GPU 环境。
11.3 KFServing (现 KServe)
- Q1:这是做什么的?
- 基于 Kubernetes 构建的、用于部署和管理 Serverless 推理工作负载的平台。
- Q2:应用场景?
- 在 Kubernetes 上以 Serverless 方式部署、扩展和管理机器学习模型。
- 提供模型解释性、Canary 部署、自动缩放等高级功能。
- Q3:解决传统问题?
- 简化在 K8s 上部署和运维模型的复杂度,提供标准化的 Serverless 推理方案。
- Q4:优缺点
- 优:云原生设计、Serverless 自动伸缩、支持多种框架、功能丰富(Canary, Explainability)。
- 缺:依赖 Knative 或其他 Serverless 框架,架构相对较重。
11.4 Feast
- Q1:这是做什么的?
- 开源的特征存储(Feature Store)系统,用于管理、发现和提供机器学习特征。
- Q2:应用场景?
- 统一管理在线(低延迟服务)和离线(批量训练/分析)的特征数据。
- 解决特征计算不一致、特征难以发现和复用等问题。
- Q3:解决传统问题?
- 提供中心化的特征管理,保证训练和服务时特征的一致性(Training-Serving Skew)。
- 促进特征共享和复用。
-
Q4:优缺点
- 优:解决特征管理痛点、支持多种数据源和在线存储、提供时间点查询 (Point-in-time join)。
- 缺:相对较新的项目,生态和最佳实践仍在发展中,部署和集成有一定复杂度。
-
核心概念: Feature View, Entity, Feature Service, Online/Offline Store。
11.5 MLflow
- Q1:这是做什么的?
- 一个开源平台,用于管理端到端的机器学习生命周期。
- Q2:应用场景?
- Tracking: 跟踪实验参数、代码版本、指标和输出文件。
- Projects: 打包代码以供复现。
- Models: 管理和部署来自不同 ML 库的模型。
- Registry: 模型版本管理、阶段转换(Staging, Production)、注解。
- Q3:解决传统问题?
- 解决机器学习实验难以跟踪、复现和管理的问题。
- Q4:优缺点
- 优:轻量级、易于集成、功能全面(覆盖生命周期关键阶段)、支持框架广泛。
- 缺:本身不提供计算资源调度和流水线编排(可与 Kubeflow/Airflow 集成)。
11.6 Kubeflow
- Q1:这是做什么的?
- 致力于使机器学习(ML)工作流在 Kubernetes 上的部署变得简单、可移植和可扩展的开源项目。目标是提供一套用于 ML 的工具和服务,以便在 K8s 上运行。
- Q2:应用场景?
- 端到端的 MLOps 平台,包括交互式开发 (Jupyter Notebooks)、流水线编排 (Kubeflow Pipelines)、分布式训练 (TFJob, PyTorchJob)、模型服务 (KFServing/KServe)、元数据管理。
- Q3:解决传统问题?
- 提供在 Kubernetes 上进行机器学习所需的全套工具和流程,降低 MLOps 实施门槛。
- Q4:优缺点
- 优:功能全面、云原生、组件化(可按需选用)、与 K8s 生态紧密集成。
- 缺:部署和运维复杂,组件众多且依赖关系复杂,对 K8s 技能要求高。
11.7 Horovod
- Q1:这是做什么的?
- Uber 开源的分布式深度学习训练框架,支持 TensorFlow, Keras, PyTorch, MXNet。
- Q2:应用场景?
- 利用多 GPU 或多机器进行数据并行训练,加速深度学习模型训练过程。
- Q3:解决传统问题?
- 简化分布式训练的实现复杂度(相比原生框架的分布式 API),提供高效的 AllReduce 通信。
- Q4:优缺点
- 优:易于使用(代码修改少)、性能高(基于 Ring-AllReduce)、支持多种框架。
- 缺:主要支持数据并行,对模型并行的支持有限。
11.8 Milvus
- Q1:这是做什么的?
- 一个开源的、云原生的向量数据库,专为大规模向量相似性搜索和分析而设计。
- Q2:应用场景?
- 图像/视频检索、推荐系统(基于 Embedding 的召回)、文本语义搜索、分子结构分析、音频分析等需要对高维向量进行高效相似性搜索的场景。
- Q3:解决传统问题?
- 解决了传统数据库难以高效存储和检索海量高维向量数据的问题。提供了比 Faiss 等库更完整的数据库管理功能。
-
Q4:优缺点
- 优:高性能向量检索(支持多种索引类型如 HNSW, IVF_FLAT)、云原生架构(基于 K8s 部署)、高可用和可扩展、支持多种距离度量、活跃的社区。
- 缺:作为数据库系统,部署和运维相对复杂,主要专注于向量数据,对标量数据查询能力有限。
-
核心概念: Collection (类似表), Partition (集合分区), Segment (数据文件), Index (向量索引类型)。
- 架构 (v2.x): 计算存储分离,包含 Proxy (接入), Query Node (查询), Index Node (索引构建), Data Node (数据管理), Root Coord/Data Coord/Query Coord/Index Coord (协调服务), ETCD (元数据), MinIO (对象存储)。
12. 其他重要组件
12.1 JMeter
- Q1:这是做什么的?
- Apache 开源的纯 Java 编写的压力测试工具,用于测试静态和动态资源(Web服务、数据库、FTP等)的性能和负载。
- Q2:应用场景?
- Web 应用性能测试、API 压力测试、数据库压力测试。
- Q3:解决传统问题?
- 提供图形化界面和脚本化方式来模拟大量用户并发访问,测试系统瓶颈。
- Q4:优缺点
- 优:开源免费、功能强大、支持协议多、图形化易用、可扩展性好。
- 缺:单机并发能力有限(需分布式压测)、内存消耗较大、报表不够现代化(可配合 InfluxDB+Grafana)。
12.2 Arthas
- Q1:这是做什么的?
- 阿里巴巴开源的 Java 在线诊断工具。
- Q2:应用场景?
- 无需重启 JVM,实时查看应用运行状态、诊断 CPU/内存问题、分析类加载冲突、方法调用追踪、热更新代码。
- Q3:解决传统问题?
- 解决传统 Java 问题排查需要重启、加日志、分析 Dump 文件等低效、滞后的问题。
- Q4:优缺点
- 优:功能强大、非侵入式诊断、实时性高、命令行交互方便。
- 缺:主要针对 Java 应用,对 JVM 内部原理有一定要求。