运维工程师面试指南——基于 AI 生成
RocketMQ 的核心知识体系,按从整体架构、核心组件、关键机制到实际应用场景的逻辑梳理,一次讲清:
🚀 一、RocketMQ 整体架构概览
RocketMQ 是一个高性能、高可靠、高可扩展性的分布式消息中间件,基于 发布/订阅模型,主要用于解耦微服务、异步通信、削峰填谷等场景。
架构主要组件:
- Producer:消息发送者
- Broker:消息中转站,存储和转发消息(支持主从)
- Consumer:消息消费者
- NameServer:服务发现和路由注册中心,类似于 DNS
- Topic & MessageQueue:消息分类与物理队列的对应关系
📦 二、消息发送与存储机制
1. 消息发送流程(Producer → Broker)
- Producer 向 NameServer 获取 Topic 的路由信息(有哪些 Broker)
- Producer 选择一个 Broker(轮询或 hash 分配)进行发送
- 消息先进入 内存缓冲区,然后刷盘(CommitLog)
- 根据刷盘策略分为:
- 同步刷盘:确保数据落盘后才返回(高可靠)
- 异步刷盘:先返回再落盘(高性能)
2. 消息的三种发送方式:
- 同步发送(send)
- 异步发送(sendAsync)
- 单向发送(sendOneway)
📥 三、消息消费机制(Broker → Consumer)
1. 消费模式
- 集群消费(Clustering):一个消息只给一个消费者(负载均衡)
- 广播消费(Broadcasting):每个消费者都能收到同样的消息
2. 消费方式
- 顺序消费(顺序性要求场景)
- 并发消费(默认方式,提高吞吐)
3. 消费进度(Offset)
- 消费者会记录消费位置 offset
- 默认存储在 Broker
- 也可以选择存储在客户端本地
- 异常宕机重启后可以从 offset 继续消费,保证 不丢不重
🔁 四、事务消息机制
RocketMQ 支持原生事务消息,确保消息与本地业务的一致性。
实现机制(两阶段)
- 发送半消息(prepare):消息暂时不投递
- 执行本地事务:成功 → 提交,失败 → 回滚
- Broker 发起事务回查,检查 Producer 的本地事务状态(checkLocalTransaction)
应用场景:如用户下单 → 消减库存 → 发送订单通知
⏳ 五、延迟与定时消息
RocketMQ 原生支持延迟消息,但只支持预设的 18 个延迟级别:
级别 | 延迟时间 |
---|---|
1 | 1s |
2 | 5s |
3 | 10s |
… | … |
18 | 2h |
实现方式:使用时间轮机制,延迟后重新写入 Topic 再投递给 Consumer
💾 六、存储机制:高性能持久化
RocketMQ 存储层非常核心,基于零拷贝的 mmap 技术实现高性能写入:
主要文件结构:
- CommitLog:所有消息都先写入这个顺序文件(刷盘)
- ConsumeQueue:逻辑队列,加速定位(类似索引)
- IndexFile:通过 key 快速查找消息
刷盘机制:
- asyncFlush(默认):性能高,但有丢失风险
- syncFlush:可靠性高,性能略差
⚙️ 七、高可用与容错机制
1. Broker 高可用
- 主从模式(Master-Slave)
- 异步复制(默认):主机挂了可能丢数据
- 同步复制:可靠性更高,但写性能会受限
- 消费者可自动切换到其他 Broker
2. NameServer 高可用
- 无状态服务
- 多个 NameServer 可部署,Producer/Consumer 轮询访问
📈 八、监控与运维
常用工具:
- RocketMQ Console:可视化控制台,查看消息、Topic、集群状态
- mqadmin CLI 工具:创建 Topic、查询消费进度等
- 常见监控项:TPS、延迟、堆积、刷盘延迟等
🔄 九、常见问题与面试点
- RocketMQ 和 Kafka 的区别?
- RocketMQ 支持事务、延迟、顺序消费更方便
- 如何防止消息重复消费?
- 消费端实现幂等性
- 如何保证顺序消费?
- 使用同一个 MessageQueue,单线程消费
- 如何避免消息丢失?
- 使用同步刷盘 + 同步主从
- 消费堆积了怎么办?
- 增加消费者实例数、排查消费逻辑瓶颈、升级机器
- 如何处理事务消息的回查?
- checkLocalTransaction,业务逻辑幂等处理
✅ 十、使用场景典型例子
- 电商下单系统异步扣减库存
- 用户注册发送欢迎短信
- 秒杀活动削峰限流
- 微服务之间解耦通知
如果你需要我基于这套串讲内容出一份【面试突击手册】或模拟问答,我也可以继续整理。是否需要?
Nginx 的系统性串讲,从架构原理、核心模块、配置语法到实战优化与面试高频问题,全方位梳理,帮助你一次性吃透 Nginx:
🚀 一、Nginx 简介
- Nginx 是一个高性能的 HTTP 服务器、反向代理服务器,也是邮件(IMAP/POP3)代理服务器。
- 特点:高并发、事件驱动、非阻塞 I/O、模块化设计、低内存消耗
🧱 二、Nginx 的核心架构
1. 进程模型
- 一个 master 进程:管理配置、信号、worker
- 多个 worker 进程:真正处理请求,采用 epoll(Linux)实现高并发
特点:多进程、无线程、共享监听端口、进程间互不影响
🔁 三、请求处理流程
客户端请求 → Nginx 监听端口 → 匹配 server 块 → 匹配 location 块 → 应用配置 → 响应客户端
请求调度由 master 派发,worker 使用 epoll 处理大量连接。
🧩 四、Nginx 核心模块讲解
1. HTTP 相关模块
http_core_module
:核心模块,支持 URI 路由、状态码等http_proxy_module
:反向代理http_upstream_module
:负载均衡http_gzip_module
:压缩响应http_rewrite_module
:URL 重写与重定向http_ssl_module
:HTTPS 支持
2. 事件模块
- epoll/kqueue 等 I/O 多路复用机制支持
3. Stream 模块
- 支持 TCP、UDP 代理(如 MySQL、Redis)
🔀 五、反向代理与负载均衡
1. 反向代理
location /api/ {
proxy_pass http://backend_server;
}
特点:隐藏后端服务、跨域控制、缓存优化、安全隔离
2. 负载均衡策略
upstream backend {
server 192.168.1.10;
server 192.168.1.11;
}
支持的策略:
- 轮询(默认)
- ip_hash:同一 IP 请求固定后端
- least_conn:最少连接优先
- weight:权重比例分配
🔒 六、HTTPS 与证书配置
server {
listen 443 ssl;
ssl_certificate cert.pem;
ssl_certificate_key key.pem;
}
- 可支持双向认证
- 配合 HTTP2 / HSTS 提升安全性
📂 七、静态资源处理 & 缓存
location /static/ {
root /data/web/;
expires 30d;
}
- 配置
expires
、cache-control
提高前端性能 - 配合 CDN 使用效果更佳
🔃 八、重写与跳转
location /old {
rewrite ^/old$ /new permanent;
}
rewrite
支持正则替换路径return 301
或rewrite ... redirect
实现跳转
📊 九、常用配置详解
1. 基本结构
http {
server {
listen 80;
server_name example.com;
location / {
proxy_pass <http://localhost:8080>;
}
}
}
2. 日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
⚙️ 十、性能优化策略
-
连接数优化
worker_processes auto; worker_connections 10240;
-
开启 Gzip 压缩
gzip on; gzip_types text/plain application/json;
-
缓存静态文件
expires
open_file_cache
-
限制请求频率(防爬虫)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
-
开启 HTTP2、keepalive
http2 on; keepalive_timeout 65;
❓ 十一、面试高频问题总结
问题 | 要点 |
---|---|
Nginx 和 Apache 有什么区别? | Nginx 是事件驱动,Apache 是进程/线程,Nginx 性能更好 |
Nginx 如何实现负载均衡? | upstream + 多种策略 |
Nginx 如何处理高并发? | 多进程 + epoll |
解释 Nginx 的 rewrite 和 redirect 区别? | rewrite 是内部路径重写,redirect 是客户端跳转 |
如何设置 HTTPS? | listen 443 + SSL 证书 |
如何实现动静分离? | location 匹配静态资源目录,其它走反向代理 |
如果 Nginx 崩溃了怎么办? | 使用 keepalived 实现主备高可用 |
Nginx 支持 WebSocket 吗? | 支持,需配置 proxy_http_version 1.1 和 upgrade 头 |
📌 十二、Nginx 应用实战场景
- 反向代理微服务网关
- 负载均衡高并发网站
- 前后端分离静态服务
- 图片 CDN 边缘加速
- API 网关 + 限流 + 鉴权
- 自动跳转 HTTPS,301 重定向
如果你需要,我可以继续为你提供:
- 🔧 高级配置实战(如灰度发布、蓝绿部署、日志切割)
- 📄 面试题目清单与答案
- 📊 Nginx 与 OpenResty、Kong 的对比分析
要不要我继续整理一份带例子的面试题手册?
MySQL 的系统性串讲,适合面试准备或深入理解 MySQL 的核心知识结构。我们将从基础架构、核心引擎、SQL执行过程、索引机制、事务原理、锁机制,到常见优化实践、面试问题一网打尽。
🧱 一、MySQL 架构总览
MySQL 架构可分为三层:
1. 连接层
- 处理连接、权限认证、线程管理
- 支持连接池(如:MySQL Thread Pool)
2. 服务层(SQL 层)
- SQL 解析器(Parser):语法分析
- 查询优化器(Optimizer):决定索引、JOIN顺序
- 执行器(Executor):逐步调用引擎层执行语句
3. 存储引擎层
- 负责数据的读写、事务、索引等操作
- 常见引擎:
- InnoDB(默认,支持事务、行级锁、MVCC)
- MyISAM(老旧,不支持事务,支持全文索引)
- Memory、Archive、CSV(特殊场景使用)
💾 二、InnoDB 存储引擎深入
1. 数据存储结构
- 表数据按页(Page)存储,默认每页 16KB
- 索引以 B+ 树形式存储
- 聚簇索引:主键索引就是数据
- 二级索引:索引值 + 主键值(回表查数据)
2. 日志系统
- Redo Log(物理日志,保证 crash-safe)
- Undo Log(逻辑日志,保证事务回滚、MVCC)
- Binlog(逻辑日志,主从复制 & 数据恢复)
🔍 三、SQL 查询执行流程(以 SELECT 为例)
SELECT * FROM user WHERE id = 1;
执行流程:
- 客户端发送 SQL → 连接层接收
- SQL 解析器解析语法 & 生成语法树
- 优化器根据成本选择执行计划
- 执行器调度存储引擎访问数据
- 返回结果给客户端
🌲 四、索引机制(重点)
1. 索引类型
- 主键索引(聚簇索引)
- 普通索引
- 唯一索引(UNIQUE)
- 联合索引(多个列构成)
- 全文索引(Fulltext)
- 前缀索引
2. B+ 树索引特性
- 所有数据都在叶子节点
- 中间节点只存索引项,适合范围查找
- 范围查询 + 排序效率高
3. 最左前缀原则
- 联合索引:WHERE 中条件需从左往右连续使用才能命中索引
🔄 五、事务与 ACID 特性
1. ACID 四大特性
- 原子性(Atomicity)→ Undo Log
- 一致性(Consistency)
- 隔离性(Isolation)→ 锁机制 + 隔离级别
- 持久性(Durability)→ Redo Log
2. 隔离级别(四种)
级别 | 问题避免 | 说明 |
---|---|---|
READ UNCOMMITTED | 无 | 最弱,可能脏读 |
READ COMMITTED | 避免脏读 | Oracle 默认 |
REPEATABLE READ | 再读一致 | MySQL 默认,防止不可重复读 |
SERIALIZABLE | 全面隔离 | 性能最差,适用于极高一致性场景 |
🔐 六、锁机制(并发控制核心)
1. 锁类型
- 表锁(MyISAM 支持)
- 行锁(InnoDB 特性)
2. InnoDB 行锁
- 共享锁(S):读锁,多个线程可共享
- 排他锁(X):写锁,互斥
- 支持意向锁、间隙锁(Gap Lock)、临键锁(Next-Key Lock)
3. 死锁检测与处理
- InnoDB 自动检测死锁并回滚其中一个事务
👁️🗨️ 七、MVCC(多版本并发控制)
1. 原理
- 每行记录维护隐藏字段:创建版本、删除版本
- 使用 Undo Log + Read View 实现快照读
2. 区别
- 快照读(普通 SELECT)→ 非阻塞
- 当前读(SELECT … FOR UPDATE)→ 加锁
📈 八、性能优化要点
1. SQL 调优
- EXPLAIN 分析执行计划
- 避免 SELECT *,明确字段
- WHERE 条件中确保命中索引(避免函数、!= 等)
2. 索引优化
- 合理使用联合索引 + 最左前缀
- 防止索引失效(如隐式类型转换)
3. 慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
4. 连接池
- 减少连接开销,使用连接池如 Druid、HikariCP
🔄 九、主从复制与高可用
1. 复制机制
- 基于 Binlog 的异步复制
- 三种方式:
- 异步复制
- 半同步复制
- 组复制(MySQL Group Replication)
2. 高可用方案
- MHA、Keepalived+VIP、ProxySQL
- MySQL8.0 支持原生 InnoDB Cluster
❓ 十、MySQL 面试高频题目(建议重点准备)
问题 | 要点 |
---|---|
聚簇索引 vs 非聚簇索引 | 聚簇索引数据存储在索引中,非聚簇索引需回表 |
索引失效有哪些情况? | 使用函数、类型不匹配、OR、多列不按最左前缀等 |
MySQL 如何实现事务? | Redo + Undo Log,结合隔离级别 |
MVCC 是怎么实现的? | Undo Log + Read View |
说一下 InnoDB 的锁机制 | 行锁、意向锁、间隙锁,支持悲观 & 乐观锁 |
为什么说 InnoDB 默认 REPEATABLE READ 就能防幻读? | 通过 Next-Key Lock 阻止幻读 |
主从同步延迟怎么解决? | 半同步复制、读写分离、GTID |
explain 中各字段含义? | id、select_type、key、rows、Extra 等 |
MySQL 为什么要用 B+ 树? | I/O 次数少,支持范围查询,节点分支高 |
📌 十一、典型使用场景
- OLTP 系统:高并发事务读写(如订单、支付系统)
- 读多写少的场景配合缓存(如 Redis + MySQL)
- 分库分表 + Sharding(水平扩展能力)
- 数据仓库配合 ETL 工具(如 Sqoop + Hive)
如果你需要进一步准备面试,我可以:
- 🧠 帮你出一份「MySQL 面试突击题库」
- 📋 提供「MySQL 手写题」训练(比如 SQL 写法优化)
- 🧪 模拟实际面试问答场景
需要我继续整理吗?
Redis 的系统性串讲,涵盖核心原理、数据结构、持久化机制、高可用架构、常见应用场景与面试高频问题,适合面试复习或深入学习使用 Redis:
🧠 一、Redis 简介
- Redis(Remote Dictionary Server) 是一个开源的高性能内存数据库,支持多种数据结构。
- 特点:
- 内存存储,读写极快(百万 QPS)
- 丰富的数据结构
- 支持持久化
- 发布订阅、事务、Lua 脚本等功能
- 支持主从复制、高可用、分布式集群
🧱 二、核心数据结构
类型 | 描述 | 应用场景 |
---|---|---|
String | 最基本类型,可存文本、数字 | 计数器、缓存对象 |
Hash | 类似 Python 字典 | 存储用户信息、对象属性 |
List | 双端链表 | 消息队列、排行榜 |
Set | 无序不重复集合 | 标签、去重 |
ZSet(Sorted Set) | 有序集合,带分值 | 排行榜、延迟队列 |
Bitmap | 位图结构 | 活跃用户统计 |
HyperLogLog | 基数估算 | 独立访客统计(UV) |
Geo | 经纬度 | LBS系统、附近的人 |
💾 三、持久化机制
1. RDB(快照)
- 周期性将内存数据快照写入磁盘(.rdb 文件)
- 优点:恢复速度快,体积小
- 缺点:可能丢数据(快照间隔)
2. AOF(追加日志)
- 每次写操作记录日志(类似 Binlog)
- 支持多种 fsync 策略(每秒、每次、关闭)
- 优点:更高数据安全
- 缺点:日志膨胀,恢复慢
3. 混合持久化(默认开启)
- Redis 4.0 起,结合 RDB + AOF
- 启动快、数据安全性高
🔄 四、主从复制(Replication)
- Redis 支持一主多从(1主N从)
- 从库只读,复制主库数据
- 异步复制(6.0 起支持半同步)
- 用于读写分离、高可用
🛡️ 五、高可用与集群
1. 哨兵模式(Sentinel)
- 自动监控主从节点健康状态
- 主库宕机时自动进行主从切换
- 保证 Redis 高可用,但不能自动分片
2. 集群模式(Cluster)
- 支持自动分片(最多 16384 个槽位)
- 多主多从架构,数据分布在不同节点
- 支持节点故障转移和 Slot 迁移
🚦 六、过期策略与内存淘汰机制
1. 过期策略
- 定期删除(定时扫描一部分键)
- 惰性删除(访问时检查过期)
- 结合使用提高效率
2. 淘汰策略(maxmemory-policy)
noeviction
:内存满报错allkeys-lru
:从所有键中淘汰最少使用的volatile-lru
:从设置了过期时间的键中淘汰最少使用的allkeys-random
/volatile-random
volatile-ttl
:淘汰即将过期的键
🧩 七、Redis 事务、脚本与流水线
1. 事务(MULTI/EXEC)
- 多条命令打包执行(非原子)
- 不支持回滚
2. Lua 脚本(EVAL)
- 原子执行多个命令
- 实现复杂逻辑(如分布式锁)
3. Pipeline
- 减少 RTT(往返时间)
- 一次性发送多条命令,提高吞吐
⛓️ 八、分布式锁实现
实现原理:
- 使用
SET key value NX PX 3000
(原子性) - 解锁需确保是自己加的锁(校验 value)
- RedLock:官方提出的多节点分布式锁实现方案
📈 九、性能优化与实战建议
- 尽量使用短键名、避免大 key(如大 Hash)
- 合理设置过期时间,释放内存
- 批量操作用 Pipeline
- 大量数据建议分页存储(如 List 分段)
- 热点数据设置合理过期时间防止击穿
- 使用布隆过滤器、缓存空值防止穿透
❓ 十、Redis 面试高频题总结
问题 | 要点 |
---|---|
Redis 为什么快? | 内存存储、单线程模型、非阻塞 I/O、简单数据结构 |
Redis 是单线程吗? | 主线程是单线程,但支持异步线程(AOF写入/IO) |
Redis 如何实现分布式锁? | SET NX PX + Lua + UUID 校验 |
Redis 如何做持久化? | RDB、AOF、混合持久化 |
什么是缓存穿透/击穿/雪崩? | 空值查询、大量缓存失效导致请求打爆数据库 |
如何解决缓存穿透? | 布隆过滤器、缓存空对象 |
缓存雪崩怎么解决? | 设置不同 TTL + 限流 + 降级 |
Redis 集群和哨兵的区别? | 哨兵高可用,不分片;集群支持分片 |
如何选淘汰策略? | 高频读应用用 LRU,默认是 noeviction |
Bitmap / HyperLogLog 场景? | 活跃用户统计、UV 估算 |
📌 十一、Redis 常见使用场景
- 数据缓存(热点数据/接口缓存)
- 分布式锁
- 计数器、限流(配合 Lua)
- 排行榜(ZSet)
- 队列(List)
- 会话缓存、Token 缓存
- 发布订阅系统(Chat、消息通知)
- 地理位置应用(Geo)
如果你需要,我可以继续帮你:
- 📘 整理 Redis 面试题清单(带详细答案)
- ✍️ 提供实战示例(如限流、延迟队列、排行榜实现)
- ⚙️ 分析 Redis 与 Memcached、Kafka 的区别
要我帮你准备一份 Redis 面试突击笔记 or 小项目实战案例吗?
Ansible 的系统性串讲,适合面试准备、运维/自动化入门、DevOps 实战。内容涵盖原理、核心组件、常见模块、Playbook 编写、角色体系、部署架构、面试要点等。
🚀 一、Ansible 简介
- Ansible 是一个 无 agent 的自动化运维工具,用于配置管理、应用部署、任务执行。
- 基于 Python 开发,默认使用 SSH 与目标主机通信。
- 特点:
- 无需安装客户端(agentless)
- 基于 YAML 的配置
- 支持模块化扩展
- 社区活跃(Ansible Galaxy)
🧱 二、核心架构与工作原理
1. 主要组件
组件 | 说明 |
---|---|
控制节点(Control Node) | 安装 Ansible 的机器 |
被控节点(Managed Nodes) | 需要管理的远程服务器 |
Inventory(清单) | 目标主机列表 |
Module(模块) | 执行操作的功能单元 |
Playbook | 一组有序任务(YAML) |
Task | Playbook 中的具体任务 |
Role | 结构化组织 Playbook 的方式 |
Fact | 被控主机的系统变量信息(硬件、IP等) |
2. 工作流程
1. 控制节点连接被控主机(通过 SSH)
2. 推送任务 + 模块(如 copy, yum 等)
3. 在目标机临时运行模块并返回结果
4. 删除临时文件
📋 三、Inventory(清单文件)
示例:/etc/ansible/hosts
[web]
192.168.1.10
[db]
192.168.1.20
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
也可以用动态 inventory(如结合 AWS、K8s API)。
🔧 四、常用模块分类
类型 | 常用模块 |
---|---|
系统 | command , shell , cron , user , group |
文件 | copy , fetch , file , template (Jinja2) |
包管理 | yum , apt , pip , dnf |
服务 | service , systemd |
网络 | firewalld , iptables , uri |
其他 | debug , stat , set_fact |
模块执行格式:
ansible web -m ping
ansible web -m shell -a "df -h"
📜 五、Playbook 编写(核心)
Playbook 是 Ansible 最常用的自动化工具,基于 YAML 语法。
示例 Playbook:
- name: Install Nginx and Start
hosts: web
become: yes
tasks:
- name: Install nginx
yum:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
常用语法要素:
hosts
: 目标主机组become
: 是否切换为 sudo 权限vars
: 定义变量with_items
: 循环notify/handlers
: 实现触发(如修改配置后 reload)
🏗️ 六、Roles(角色)
Role 用于将 Playbook 模块化、目录结构化,便于重用。
标准目录结构:
roles/
nginx/
tasks/
main.yml
handlers/
main.yml
templates/
nginx.conf.j2
files/
index.html
vars/
main.yml
调用方式:
- hosts: web
roles:
- nginx
📊 七、变量系统与模板
变量定义位置(优先级从低到高):
- Inventory 文件
- Playbook 中的
vars
host_vars
/group_vars
目录- Extra vars(命令行
e
)
模板引擎:Jinja2
server {
listen {{ nginx_port }};
}
使用 template
模块渲染:
- name: config nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
🧪 八、调试与测试
ansible-playbook playbook.yml --check
:检查模式,不执行-diff
:对比变更内容-start-at-task
:从某个任务开始ansible-doc 模块名
:查看模块说明
🛡️ 九、安全:Ansible Vault
用于加密密码、密钥等敏感数据。
ansible-vault encrypt secrets.yml
ansible-vault decrypt secrets.yml
ansible-playbook site.yml --ask-vault-pass
❓ 十、面试高频题
问题 | 要点 |
---|---|
Ansible 和其他工具对比(如 Puppet)? | 无 agent,易部署,学习成本低 |
如何提高执行效率? | 批量执行、异步任务、fork 并发 |
Ansible 的模块怎么扩展? | Python 自定义模块 |
什么是 handlers? | 被 notify 调用后触发的任务(如 reload) |
如何控制任务只运行一次? | run_once: true |
如何调试 Playbook? | debug 模块、--check --diff 参数 |
如何使用动态 inventory? | 结合云 API、自定义脚本 |
Ansible 的角色和 Playbook 有什么关系? | Role 是 Playbook 的模块化 |
📌 十一、常见实战场景
- 批量部署服务(如 Nginx、Docker)
- 初始化操作系统(添加用户、SSH key)
- 应用发布(配合 Git、Systemd)
- 系统巡检与日志收集
- 搭建 CI/CD 流程(结合 Jenkins、GitLab CI)
📚 十二、实用命令汇总
# ping 所有主机
ansible all -m ping
# 执行 shell 命令
ansible db -m shell -a "ps aux"
# 运行 Playbook
ansible-playbook deploy.yml
# 加密机密变量
ansible-vault encrypt vars.yml
如果你需要我可以:
- 📘 给你一份高质量的「Ansible 面试题+答案」文档
- ✍️ 手把手带你写一个 Playbook(如部署 LNMP 环境)
- 🎯 帮你设计一套自动化部署 CI/CD 流程
Kafka 串讲笔记,非常适合面试复习、工作场景中入门与深入掌握 Kafka 的原理与实战应用。
📦 一、Kafka 简介
- Kafka 是一个 高吞吐、可扩展、持久化 的 分布式消息队列系统,最初由 LinkedIn 开发。
- 特点:
- 高吞吐量(百万级 TPS)
- 持久化(磁盘 + 顺序写)
- 水平扩展(可增加节点)
- 支持发布/订阅与点对点消费模型
- 消息可重复消费(无自动删除)
🧱 二、Kafka 核心概念
概念 | 说明 |
---|---|
Producer | 生产消息的客户端 |
Consumer | 消费消息的客户端 |
Broker | Kafka 的服务器节点 |
Topic | 消息主题(逻辑分类) |
Partition | 分区,Topic 的子单元 |
Offset | 每条消息在分区中的唯一编号 |
Consumer Group | 消费者组,实现消费并发与水平扩展 |
Zookeeper / KRaft | 用于协调和管理元数据(Kafka 3.x 后可选用 KRaft 模式) |
🧮 三、Kafka 消息存储机制
- 分区(Partition)
- Topic 会被划分成多个 Partition
- 每个 Partition 是有序的、不可变的消息队列
- 分区是并发与高性能的关键
- Offset
- 消费者记录自己的消费位置,不影响其他消费者
- 存储在 Kafka 或外部系统(如 Zookeeper、数据库)
- 顺序写 + PageCache + 零拷贝(zero-copy)
- Kafka 通过顺序写入磁盘、利用操作系统页缓存、使用零拷贝发送数据,极大提升吞吐性能。
🔄 四、Producer 工作原理
- 消息序列化
- 选择 Topic + Partition(可指定、可 hash key)
- 发送至 Broker
- Buffer + Batch + 压缩 + Ack 控制可靠性
常见 Producer 参数
参数 | 作用 |
---|---|
acks | 消息确认级别(0, 1, all) |
retries | 重试次数 |
linger.ms | 批量发送延迟时间 |
batch.size | 批量消息大小上限 |
🧲 五、Consumer 工作原理
- 订阅 Topic,加入 Consumer Group
- Broker 按分区将数据“分配”给消费者
- 拉模式(Pull)批量拉取数据
- 提交 Offset(自动/手动)
消费模式
- 同一个分区只会被一个 Group 中的一个消费者消费(组内竞争、组间广播)
🧠 六、Consumer Group & Offset 提交
类型 | 特点 |
---|---|
自动提交 | enable.auto.commit = true ,间隔时间提交(不可靠) |
手动提交 | commitSync 或 commitAsync ,可控性强 |
📚 七、Kafka 高可用机制
- 分区副本(Replication)
- 每个 Partition 有一个 Leader 和多个 Follower
- Producer 和 Consumer 只与 Leader 交互
- ISR(In-Sync Replicas)
- 同步副本列表,Kafka 仅保证 ISR 中副本一致性
- 故障转移
- Leader 挂掉后从 ISR 中选新 Leader
- 依赖 Zookeeper/KRaft 进行选举和状态管理
⚙️ 八、Kafka 高性能机制
技术 | 原理 |
---|---|
零拷贝(zero-copy) | 利用 sendfile 系统调用绕过用户态 |
顺序写 | 避免随机 I/O,优化磁盘性能 |
批量发送 | 减少网络请求数 |
压缩(Snappy/Gzip/LZ4) | 节省带宽 |
PageCache | 操作系统缓存,避免频繁磁盘读写 |
🛠️ 九、Kafka 管理与运维
-
常用命令(基于
bin/kafka-*.sh
):kafka-topics.sh --create ... kafka-console-producer.sh ... kafka-console-consumer.sh ... kafka-consumer-groups.sh --describe ...
-
监控指标:
- Lag(消费延迟)
- ISR 是否同步
- 磁盘使用
- Broker 健康
💥 十、常见问题与面试高频题
问题 | 要点 |
---|---|
Kafka 为什么快? | 顺序写、零拷贝、PageCache、批量发送 |
Kafka 消息会丢失吗? | 可能:生产未确认、ISR 同步失败、offset 提交不及时 |
Kafka 怎么保证消息顺序? | 在 分区内顺序,不跨分区 |
Kafka 如何实现消息重复消费? | Offset 外部管理即可实现 |
Kafka 与 RabbitMQ 区别? | Kafka 更适合大吞吐、可重复消费,RabbitMQ 更适合事务、低延迟 |
Kafka 的消费模型? | 拉模型,消费者主动拉取消息 |
Consumer Group 机制? | 同组内分区消费互斥,跨组广播消费 |
Kafka 消息过期机制? | 根据时间或大小配置保留策略(log.retention.hours) |
📈 十一、Kafka 实际应用场景
- 日志收集(与 Flume、Logstash 协同)
- 实时流处理(配合 Spark、Flink、Storm)
- 异步通信(用户下单、发货等事件驱动)
- 高并发削峰(下单、秒杀排队)
- 数据总线(解耦微服务)
🔧 十二、Kafka Stream / Connect / Mirror
- Kafka Streams:Java 流式处理 API,适合轻量级处理任务
- Kafka Connect:用于与外部数据源(MySQL、Elasticsearch、HDFS)集成
- MirrorMaker:实现多集群间 Topic 同步
📌 十三、进阶选学(可选)
方向 | 学习建议 |
---|---|
Kafka + Flink | 实时 ETL |
Kafka + Redis | 延迟队列、缓存预热等 |
Kafka + ELK | 日志分析系统 |
Kafka 分布式事务 | 2PC + 幂等生产者配置 |
如果你想,我可以:
- 📘 整理一份 Kafka 面试题 & 答案 PDF
- 🧪 编写一个简单的 Kafka 消费/生产 Java Demo
- 📊 绘制 Kafka 架构图 + 消息流图
- 🧵 模拟 Kafka 消息堆积、丢失、乱序等场景并提供解决方案
需要我针对某部分展开讲解或帮你准备面试专项突击吗?
Kubernetes(K8s)串讲笔记,适合面试准备、学习入门、实战总结,涵盖核心概念、组件架构、资源对象、调度机制、网络存储、安全与面试重点等内容。
☸️ 一、Kubernetes 简介
- Kubernetes 是 Google 开源的 容器编排平台,用于自动化部署、扩展、管理容器化应用。
- 支持高可用、服务发现、负载均衡、自愈、滚动更新等功能。
🧱 二、核心组件架构
1. Master 控制平面(Control Plane)
组件 | 功能 |
---|---|
kube-apiserver | 所有操作的入口,接收 REST 请求 |
etcd | 分布式 key-value 存储系统,保存集群状态 |
kube-scheduler | 调度器,根据资源等条件将 Pod 分配到节点 |
kube-controller-manager | 各种控制器(如 DeploymentController) |
cloud-controller-manager | 与云平台交互(可选) |
2. Node 节点
组件 | 功能 |
---|---|
kubelet | 与 Master 通信,管理 Pod 生命周期 |
kube-proxy | 实现 Pod 网络与服务访问(iptables/ipvs) |
Container Runtime | 如 Docker、containerd,运行容器 |
📦 三、核心对象资源(YAML)
类型 | 描述 |
---|---|
Pod | 最小部署单元,一个或多个容器共享网络、存储 |
ReplicaSet | 保证指定数量 Pod 运行 |
Deployment | 管理副本集,支持滚动更新 |
StatefulSet | 管理有状态服务,支持有序启动和固定存储 |
DaemonSet | 每个 Node 上运行一个 Pod(如日志收集) |
Job / CronJob | 一次性任务 / 定时任务 |
Service | 对外提供访问的统一入口 |
Ingress | 七层代理,管理外部访问 |
ConfigMap / Secret | 配置注入与密文管理 |
Namespace | 资源隔离 |
⚙️ 四、调度与控制机制
-
调度流程:
- Scheduler 根据资源(CPU/内存)+ 亲和/反亲和 + Taints/Tolerations 等规则调度 Pod
-
亲和性/反亲和性(Affinity / Anti-affinity):
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution:
-
污点与容忍(Taint / Toleration):
- 节点打“污点”后,只有带有“容忍”属性的 Pod 才能被调度上去。
🧬 五、Service 与网络通信
类型 | 描述 |
---|---|
ClusterIP | 集群内访问(默认) |
NodePort | 节点 IP + 固定端口访问 |
LoadBalancer | 云服务提供商负载均衡 |
Headless(无 ClusterIP) | 用于 StatefulSet 直连 DNS 名 |
- Pod 之间通过 CNI 插件(如 Calico, Flannel) 实现通信。
- Service 之间通过 kube-proxy + iptables 实现四层转发。
📁 六、存储机制
1. Volume 类型
类型 | 特点 |
---|---|
emptyDir | Pod 生命周期内共享目录 |
hostPath | 使用宿主机路径(有安全风险) |
configMap/secret | 配置挂载 |
PVC(PersistentVolumeClaim) | 动态申请持久卷 |
NFS / Ceph / GlusterFS | 外部网络存储 |
2. StatefulSet 配合 PVC 使用固定挂载:
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
🔐 七、安全机制
安全特性 | 描述 |
---|---|
RBAC | 基于角色的访问控制 |
NetworkPolicy | 网络层访问控制 |
PodSecurityPolicy / PodSecurity(K8s 1.25 起) | 控制 Pod 安全规范 |
ServiceAccount | Pod 所使用的身份 |
Admission Controller | 拦截请求进行额外校验与修改 |
📡 八、部署方式
方式 | 特点 |
---|---|
kubeadm | 官方推荐,快速部署 |
minikube | 本地测试 |
k3s | 轻量版 Kubernetes |
云服务(如 ACK/GKE/EKS) | 托管 Kubernetes 集群 |
🧪 九、调试与运维命令
kubectl get pods -A # 查看所有命名空间的 Pod
kubectl describe pod <name> # 查看 Pod 详细信息
kubectl logs <pod> -c <container> # 查看日志
kubectl exec -it <pod> -- /bin/bash # 进入容器
kubectl get events --sort-by=.metadata.creationTimestamp
💬 十、K8s 面试高频题(附简答)
问题 | 要点简答 |
---|---|
Pod 和 Container 区别? | Pod 是容器的封装,支持多容器共享网络和存储 |
Deployment 与 StatefulSet 区别? | Deployment 无状态,StatefulSet 有序启动/命名/存储 |
如何实现服务发现? | Service + Cluster DNS |
K8s 滚动更新和回滚? | kubectl rollout restart/undo deployment |
什么是 Taint 和 Toleration? | 节点打标签限制调度,Pod 容忍才能上 |
什么是 readiness 和 liveness? | 探针控制服务是否可接受流量和是否自愈 |
如何挂载配置? | 使用 ConfigMap/Secret 挂载为 volume 或环境变量 |
Pod 网络通信是如何实现的? | CNI 插件,Pod 拥有独立 IP,扁平网络结构 |
🎯 十一、实战项目典型场景
- CI/CD 发布平台(如 GitLab Runner + ArgoCD)
- 自动化部署微服务(Deployment + HPA + Ingress)
- 灰度发布与滚动更新(canary + Ingress)
- 中间件运行平台(Kafka、Redis、MySQL on K8s)
- 多租户平台(Namespace + NetworkPolicy + RBAC)
🧩 十二、进阶建议
模块 | 推荐学习 |
---|---|
Helm | K8s 包管理工具 |
CRD / Operator | 自定义资源/控制器 |
Prometheus + Grafana | K8s 监控与告警 |
Istio / Linkerd | Service Mesh 服务网格 |
K8s 安全 | RBAC、PSP、安全扫描 |